De-Sim前两个示例介绍了一类message、多类message、一个仿真对象、对个仿真对象的使用方法,De-Sim的第三个示例传染病SIR模型介绍了检查点对象的使用方法,通过给检查点对象设置记录频率和记录内容,可以实时记录仿真对象的情况。
SIR模型将传染病传播中人的状态分为三类Susceptible、Infectious、Recovered,分别表示易受感染、患病、痊愈。SIR通过S向I的转变、I向R的转变,具体表现为数值的变化,来预测传染病的传播情况。
该过程在具有马尔科夫性质,设在时间内的转移概率为
则由ODE model给出的转移概率为
以上过程如何推导可以不了解,只需要知道该模型的结论,定义以下符号
每经过τ的时间,P1的概率有1个S转化为I,P2的概率有1个I转化为R
一个SIR过程用折线图可以表示
- 该示例由枚举(Enum)类型设置了两类message,表示S转化为I和I转化为R。
- 普通类SIR, 该类的属性s/i/N/beta/gamma是SIR模型的参数,random_state为随机数种子,可以用于仿真过程的再现
该类有两个方法
·handle_state_transition(self,transition_type),用于根据传入的transition_type更新SIR的s和i的数量
·plan_next_transition(self),根据当前SIR的参数,计算转化的概率并确定转化的类型和时间tau,返回tuple类型
仿真对象类SIRSimutor 该类在构造函数内示例化了SIR类 该类有四个方法 ·init_before_run(self),初始化该类
·handle_event(self,event),该方法调用sir的handle_state_transition方法,通过更新sir属性的方法记录了event的信息
·plan_and_create_event(self),该方法调用sir的plan_next_transition方法,确定了下一次转化的时间和类型
·schedule_next_event(self,planed_event),该方法执行plan_and_create_event中确定的转化时间和类型
类内方法外的属性定义和前两个示例一致 - 访问状态类 该类是AccessStateObjectInterface的实现
该类在构造函数内传入了sir对象,也就是在SIRSimutor的构造函数内创建的对象,通过记录该对象的属性实时记录仿真状态 两个方法
·get_checkpoint_state(self,time),返回要记录的信息
·get_random_state(self),返回随机数种子,用于仿真过程的复现 - 普通类RunSIR 该类整合了启动仿真和仿真结果展示的方法 该类有三个方法
·simulate(self,recording_period,max_time,**sir_args)
该方法创建了simulator,为simulator添加了仿真对象和检查点对象,并运行了max_time
·last_checkpoint(self),用于返回最后一个检查点的信息
·history2dataframe(self),将检查点中的信息转成dataframe的格式
添加中文注释的代码如下:
(原始代码使用tempfile暂存了输出,我直接plt.show())
import de_sim
import numpy
import enum
import pandas
import matplotlib.pylab as plt
import sys
from de_sim.checkpoint import AccessCheckpoints
from de_sim.simulation_checkpoint_object import (AccessStateObjectInterface,
CheckpointSimulationObject)
#设置转换类型
class StateTransitionType(enum.Enum):
s2i='Transition from Susceptible to Infectious'
i2r='Transition from Infectious to Recovered'
#通过转换类型设置事件message
class TransitionMessage(de_sim.EventMessage):
#指示应该发生哪个转换,属性将存储一个实例
"Messge for all model transitions"
transition_type:StateTransitionType
#创建SIR类,该类将个体在SIR状态下的转换表示为离散事件,该类将循环访问各事件
class S