Epidemic and Clinic


我们将创建一个简单的基于代理的流行病模型,并将其与一个简单的离散事件诊所模型联系起来。
当一个病人发现症状时,他将要求在能力有限的诊所接受治疗。我们将探讨诊所的能力如何影响疾病的动态发展。

第一阶段:创建代理群体

  1. 创建一个新的模型,将模型的时间单位设置为 minutes在这里插入图片描述
  2. 把 Agent Population 拖到 Main 的编辑器上
  3. 将 agent class name 改为 Patient
  4. 设置动画为 none
  5. 设置 initial number of agents(代理的初始数量)为 2000
  6. 设置 continue space 宽度为 650,高度为 200
  7. 选择应用随机布局
  8. 设置 network type为 distance based , 范围为 30
    在这里插入图片描述
  9. 在 main 的编辑器中,打开 patients 的属性页。在 Advanced 中选择 “Show presentation”在这里插入图片描述
  10. 在 " Patient "编辑器中,从 palette 中拖出一个 oval,设置半径为2。 把椭圆放在坐标原点附近在这里插入图片描述
  11. 运行模型,agents 随机地分布在矩形空间中,到目前为止,没有活动在这里插入图片描述

第二阶段:定义病人的行为

  1. 病人最初处于易感状态,他可以被感染。疾病的传播是由一个病人向另一个病人发送的 "感染 "信息来模拟的。
  2. 在收到这样的信息后,病人过渡到暴露状态,他已经被感染,但没有症状。
  3. 经过一个随机的潜伏期,病人发现了症状并进入感染状态。
  4. 之所以区分暴露状态和感染状态,是因为病人发现症状前后的接触行为不同:感染状态下的接触率为每天1次,而暴露状态下为5次。感染率为7%。
  5. 感染状态有两种可能的退出方式。病人可以在诊所接受治疗(然后,他被保证会康复),或者疾病可能在没有干预的情况下自然发展。
  6. 在后一种情况下,病人仍然可以在疾病期限(20天)内以较高的概率(90%)恢复,或者死亡。如果病人死亡,他将从模型中删除自己。治疗的完成是由发送给代理人的信息 "已治疗 "来模拟的。
  7. 康复的病人需要对疾病有暂时的免疫力(60天)。我们在模型中通过恢复状态来反映这一点,在这个状态下,病人对可能到来的 "感染 "信息没有反应。在免疫期结束时,过渡期 ImmunityLost 将病人带回易感状态。
    在这里插入图片描述
  8. 打开 patient 的编辑器,设置参数
ContactRate5
ContactRateInfected1
Infectivity0.07
IncubationPeriod3
IllnessDuration20
SurvivalProbability0.9
ImmunityDuration60

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 创建状态图
    在这里插入图片描述
oval.setFillColor(yellow);

在这里插入图片描述

"Infection"

在这里插入图片描述

oval.setFillColor(darkOrange);

在这里插入图片描述

ContactRate * Infectivity
send( "Infection", RANDOM_CONNECTED );

在这里插入图片描述

IncubationPeriod*uniform(0.5,2)

在这里插入图片描述
Infected

oval.setFillColor(red);

在这里插入图片描述
transition1

ContactRateInfected * Infectivity
send( "Infection", RANDOM_CONNECTED );

在这里插入图片描述
Treated

"Treated"

在这里插入图片描述
NotTreated

IllnessDuration * uniform( 0.5, 2 )

在这里插入图片描述
Died
在这里插入图片描述
Survived

randomTrue( SurvivalProbability )

在这里插入图片描述
Recovered

oval.setFillColor( green );

在这里插入图片描述
ImmunityLost

ImmunityDuration * uniform( 0.5, 2 )

在这里插入图片描述

  1. 设置初始感染

打开 Main 的属性,在 On Startup 字段中输入以下代码

for( int i=0; i<5; i++ ) 
patients.random().receive( "Infection" );

在这里插入图片描述

  1. 运行模型
    在这里插入图片描述

收集统计资料和图表显示

打开 Main 的编辑器,选择 patients 并打开其属性中的统计页面(Statistics)
添加名为 NSusceptible 的统计数据,类型为 count ,条件为

item.statechart.isStateActive(item.Susceptible)

这将产生人口的 NSusceptible() 函数,它将计算并返回处于 Susceptible 状态的病人数量

分别为 Exposed, Infected, and Recovered 添加另外三个统计数据

item.statechart.isStateActive(item.Exposed)
item.statechart.isStateActive(item.Infected)
item.statechart.isStateActive(item.Recovered)

在这里插入图片描述
从 Analysis palette 中拖动 Time stack chart 到 Main 上,并把它放在 agents 所占区域的下面

在这里插入图片描述
将图表的 Time window 设置为 500,并 Display Up 最多 500 个最新样本
在这里插入图片描述
在图表中添加四个数据项,对应于你所创建的四个统计功能。例如,第一个项目的标题是 Infected,颜色为 orangeRed ,value 为 patients.NInfected()

Exposed

patients.NExposed()

Recovered

patients.NRecovered()

Susceptible

patients.NSusceptible()

在这里插入图片描述
在项目树中选择 Simulation experiment,并打开其属性中的 Model time
设置执行模式为 Real time with scale,规模为 25 , 这将使事情发生得更快
在这里插入图片描述

运行模型

在这里插入图片描述

第三阶段:增加诊所

诊所将通过一个非常简单的离散事件模型进行建模。等待治疗的病人的队列和实际治疗的延时模型。与纯离散事件模型不同,这个过程中的实体不是由 Source 产生的,而是由 agents 注入的。

一旦病人发现症状,就会创建一个实体(治疗请求)并添加到诊所流程中。一旦治疗完成,该实体将向病人发送一个 "已治疗 "的消息,病人将过渡到恢复状态。然而,如果病人被治愈(在 IllnessDuration 之后)或在治疗完成之前死亡,他将从诊所消失。

条件如下:
诊所的等候室有无限的容量
治疗需要七天时间
诊所里只有20张床
如果病人在等待治疗或治疗期间自行恢复或因病死亡,他就会从诊所中消失

创建新的实体类型 TreatmentRequest

右键单击项目树中的模型项目,并从上下文菜单中选择
新建 ——> Java class
在这里插入图片描述
在向导中,将该类命名为 TreatmentRequest,并将其 Superclass 设置为 Entity
在这里插入图片描述
点击 Next

在下一个向导页面中,添加一个字段,名称为 patient ,类型为 Patient
在这里插入图片描述
点击 Finish,并关闭打开的 Java 编辑器
在这里插入图片描述

在 Main 的编辑器中添加流程图

打开Main的编辑器,把流程图放在一起。使用 Enterprise library palette(old) 中的对象

拖动 Enter,Queue,Delay 和 Sink,分别命名为 requestTreatment,wait,treatment 和 finished
在这里插入图片描述
在这里插入图片描述
设置 wait 的容量为 infinite ,选择 TreatmentRequest 作为实体类
在这里插入图片描述
设置治疗的延迟时间为 7,容量为 20,选择 TreatmentRequest 作为实体类
在这里插入图片描述
finished

选择 TreatmentRequest 作为实体类,进入时向病人发送 “Treated” 信息
在这里插入图片描述

在 Main 的编辑器中创建 cancelTreatmentRequest 函数

函数 cancelTreatmentRequest(),它将被那些自行痊愈或在得到治疗机会前死亡的病人调用

for( int i=0; i<wait.size(); i++ ) {
	TreatmentRequest tr = wait.get( i );
	if( tr.patient == patient ) {
		wait.remove( tr );
		return;
	}
}
for( int i=0; i<treatment.size(); i++ ) {
	TreatmentRequest tr = treatment.get( i );
	if( tr.patient == patient ) {
		treatment.remove( tr );
		return;
	}
}
error( "Entity not found" );
return;

在这里插入图片描述

将诊所中的治疗纳入病人的行为

将行动添加到状态图的转换中

Symptoms

get_Main().requestTreatment.take( new TreatmentRequest( this ) );

NotTreated

get_Main().cancelTreatmentRequest( this );

在这里插入图片描述
在这里插入图片描述

在 Main 中增加感染按钮

patients.random().receive( "Infection" );

在这里插入图片描述

在 Main 中增加诊所容量控制滑块

在这里插入图片描述

运行模型

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值