De-Sim示例分析(三)SIR传染病模型

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值