Download - 4.2第四章 swarm代码剖析 可选补充课程
SWARM 程序实现代码简介
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
SWARM程序介绍
HeatBug 程序代码介绍
SARS 疫情模拟的程序介绍
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
回顾: Swarm 的结构
一个 Swarm 模型包括 模型 Swarm
( ModelSwarm )
观察者 Swarm
( ObserverSwarm )
分层的“ Swarm” 可以将模型的数据收集和实现进行分离 .
Swarm
model swarm observerswarm
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
ModelS warm
Mo d e lS warm 是 s warm 的子类。 Mo d e lS warm 中的每一个对象对应模型世界中的一个主体。
Mo d e lS warm 包括模型中行为的时间表。 Mo d e lS warm 还包括一系列输入和输出。输入的是模型参数,如对象的个数、初始值等;输出的是要观测的变量的值及模型的运行结果。
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
Obs erverS warm
O b s e rve rS warm 同样是 s warm 的一个子类。
O b s e rve rS warm 是一个特殊的对象,它可以通过探测器接口观察其它个体。
O b s e rve rS warm 包括一组个体和一个行为时间表。 O b s e rve rS warm 的个体是用来观测的探测器以及输出界面
,如图表、二维格点等。
O b s e rve rS warm 的行为时间表用来描述各探测器采样的间隔和顺序。
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
两类 SWARM的合并
先建 ObserverSwarm 在 ObserverSwarm 中建
立 ModelSwarm 作为自身一个 subswarm ,并为它分配内存空间;
ModelSwarm 建立模型的主体 (agent) 以及主体的行为。
[modelSwarm create: self];[modelSwarm buildObjects];[modelSwarm buildActions];[modelSwarm activateIn: self];
-create: aZone;-buildObjects;-buildActions;-activateIn: swarmContext;
Observer
ModelModel
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
Integration of Swarm activities
Operating System
Swarm kernel
GUI Model
CPU
Sub-Swarm
ModelSwarm
ObserverSwarm
Swarm kernel
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
Heatbug模型
这是 swarm 的经典示例之一,也是 swarm 的入门 example (与 HelloWorld 有异曲同工之妙)。
我们利用这个模型来观察简单主体如何通过局部信息上的动作产生复杂的全局行为结果。
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
模型背景 在这模型中,每一个 heatbug 都是一个主体
( agent )。
World 有一个特殊的属性—— heat ,热量经过一定的时间散发和消失。
每一个 heatbug 都放射出一定的热量,并且都有自己的一个适于自身生存的理想温度。
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
Heatbug 在释放热量的同时,也在向着更接近于适于自己生存的理想温度的附近的点不断移动。
单独一个 heatbug 并不能获得足够的热量继续生存,因此它们倾向于聚成一堆的生存,以便获得足够的热量。
模型的开始,随机分布着一定数量的 heatbug 。
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
模型运行界面
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
输出结果显示——光栅图
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
输出结果显示——折线图
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
代码剖析
程序清单 StartHeatbugs.java (含 main 函数) HeatbugObserverSwarm.java (观察者
swarm ) HeatbugModelSwarm.java (模型 swarm ) Heatbug.java ( heatbug 个体) HeatSpace.java ( heatspace 环境) HeatCell.java (环境中的小单元) HeatbugBatchSwarm.java (功能与
HeatbugObserverSwarm.java 相同)
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
面向对象的程序设计 (OOP)基础 面向对象的程序设计与多主体建模的基本思想非常吻合。
( 静态结构与动态结构 ) 掌握一门面向对象的程序设计语言,是学习多主体建模
工具的必要条件 程序设计中的重要概念回顾
对象 Objects 基本语法 构造函数: Constructors 继承性: Inheritance 静态变量: Static 接口: Interfaces 包和引用: Packages & Import 主程序函数: The 'main' method 内部类 Inner classes 类路径: Class Path JAR 文档
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
结构关系总揽
StartHeatbugs 是起始程序,它调用HeatbugObserverSwarm (或HeatbugBatchSwarm ),由它再调用HeatbugModelSwarm 及 Heatbug 实现, HeatbugModelSwarm调用 Heatbug 与HeatSpace , Heatbug调用 HeatSpace 与HeatCell , HeatSpace调用 HeatCell 。
关系框架图:
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
StartHeatbugs
HeatbugObserverSwarm HeatbugBatchSwarm
HeatbugModelSwarm Heatbug
Heatbug
HeatSpace
HeatSpace
HeatCell
HeatCell
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
StartHeatbugs.java
…… // (仅以图形方式为例)
public class StartHeatbugs {//main() 函数是整个程序开始运行的顶层( top-
level ),典型的 Swarm 模拟中,在 main() 函数里创建一个顶层 Swarm 对它建立并激活,然后让它运行
public static void main (String[] args) {// 初始化 swarm ,每个 swarm 程序都必须要先初始化
Globals.env.initSwarm (……); HeatbugObserverSwarm topLevelSwarm = new HeatbugObserverSwarm
(Globals.env.globalZone); ……
}
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
topLevelSwarm.buildObjects (); //创建对象
topLevelSwarm.buildActions (); //创建行为
topLevelSwarm.activateIn (null); //使之活动
topLevelSwarm.go (); // 运行
topLevelSwarm.drop (); // 结束停止
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
HeatbugObserverSwarm.java
HeatbugObserverSwarm 是当图形接口运行时建立以观察热虫模
型的一类对象集的 Swarm ,其中一个重要的对象是heatbugModelSwarm ,同时也还有图形窗口和数据分析类的对象
public HeatbugObserverSwarm (); // 初始化及用户接口
public Object _worldRasterDeath_ (); // 光栅图关闭处理
public Object _unhappyGraphDeath_ (); // 曲线图关闭处理
public Object buildObjects (); //创建对象
public Object _update_ (); // 更新动作
public Object buildActions (); //创建行为
public Activity activateIn(); //使时间进度表活动
public Object graphBug (); // 曲线图顺序获取每个 bug 的 unhappiness
public void drop (); // 结束程序前的处理
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
public Object buildObjects ():
创建用于模型现实的对象。这段代码相对复杂,因为我们创建了相当多的窗口部件。因此可以很好的作为我们学习如何实现显示相关代码的示例
首先,创建我们实际观察的模型,这个模型是observer 的 subswarm
然后创建探测器对象,这给出了一个可以让用户方便的修改参数的用户接口
等待一个对控制面板的指令,在此之间用户可以更新参数设置
下面可以准备运行
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
第一步 让modelswarm 建立它的对象 此后,建立自己的显示对象
创建一个全局变量: colormap 这里的信息会被许多其他的对象所利用——色彩的映射表在这里设立
为每个热虫设定颜色 然后创建一个二维显示窗口,设定他的大小、显示范围、因素和标题
创建一个 Value2dDisplay :这个特定对象能够在给定的光栅窗口部件中显示任意的 2 维的值表。
创建一个 Object2dDisplay :这个对象为我们在光栅图窗口中画出热虫,并可接受探测
使光栅图将获得的鼠标点击传递给heatbugDisplay ( Object2dDisplay 实例),使用户可以通过右键点击显示对虫子的探测。
创建窗口部件显示 unhappiness 折线图 在窗口被关闭时,调用执行 _unhappyGraphDeath_ 方法 创建热虫平均 unhappiness 的数据
//创建对象过程技术
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
public Object buildObjects () { super.buildObjects (); //父类的 buildObjects
heatbugModelSwarm = new HeatbugModelSwarm (getZone ());…… // 设置存档 probe, 以便修改参数
getControlPanel ().setStateStopped ();// 获得控制面板,出于 stop状态并响应 button事件
heatbugModelSwarm.buildObjects (); colormap = new ColormapImpl (getZone ());
…… // 各种个体、环境、资源的颜色映射 worldRaster = new ZoomRasterImpl (getZone (), "worldRaster"); …… //2D窗口图 heatDisplay = new Value2dDisplayImpl (……);
…… //2Dvalue 图, display heatheatbugDisplay = new Object2dDisplayImpl(……);…… //2Dobject 图, display heatbugworldRaster.setButton$Client$Message(……);…… //允许鼠标右键在 probe bug 上获取当前各值
unhappyGraph = new EZGraphImpl(……);…… //unhappy 的曲线图,设 data 为平均的 unhappiness
}
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
public Object buildActions():
创建仿真所必需的动作( actions )。这里是建立事件调度表( schedule )的地方。(但这里并不运行它)。
这里我们创建一个显示 schedule—— 它用来显示模拟世界的状态和检测用户的输入。
注意到这个 schedule 与模型是相独立的——你可以设想在每有任何显示的情况下运行模型
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
首先,让modelswarm创建自身的 schedule 创建一个显示的 ActionGroup: 一组按特定顺序发生
的动作,但都是在模拟时序的一步中发生的。其中的一些动作可以被平行的执行。 创建 displayActions 给 ActionGroup 中加入绘制出显示图的方法 确定探测器显示更新的时间 最后确定对整个用户接口代码更新的时间 . 这一步是很关键
的:没有这一步,所有的图形更新和控制面板都不能被关闭。这一步最好放在显示 schedule 的结尾处。
然后是显示 schedule. 注意重复的间隔是根据我们自己的swarm 数据结构设定的。频繁的显示是仿真中最慢的部分,所以降低显示更新频率,可能会有所帮助
将 ActionGroup 的实例插入重复运行的 Schedule 实例中
//创建动作过程结束
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
// 定义 display 的时间表
public Object buildActions () {
super.buildActions(); //父类的 buildActions
heatbugModelSwarm.buildActions();
displayActions = new ActionGroupImpl (getZone());
//创建一个 ActionGroupImpl 对象
…… //添加两个 action ,“ _update_” 和//“doTkEvents”
//doTkEvents 这个方法对所有用户接口作 update
displaySchedule = new ScheduleImpl (……);
// 以 displayFrequency 为参数创建一个 ScheduleImpl 对象, display环节是模拟过程中最耗时的,降低显示的频率有助于模拟的运行
displaySchedule.at$createAction (0, displayActions);
// 将 actiongroup 的实例添加到重复的 schedule 实例中
……
}
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
public Activity activateIn (Swarm
swarmContext) : 功能:激活时间表,使它们为运行作好准备
The swarmContext argument has to do with what we were activated *in*. Typically the ObserverSwarm is the top-level Swarm, so it's activated in "null". But other Swarms and Schedules and such will be activated inside of us.
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
//使时间表处于活动状态,准备运行
public Activity activateIn (Swarm swarmContext) {
//首先激活自身 (just pass along the context).
super.activateIn (swarmContext); //父类的 activateIn
// 在自身环境内激活model swarm 。 Model swarm 是 observer swarm 的 subswarm
heatbugModelSwarm.activateIn (this);
//然后在自身环境内激活自己的 schedule 。这一步安排了我们创建的时间表的执行
displaySchedule.activateIn (this);
//激活返回了 swarm activity - the thing that's ready to run
return getActivity();
}
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
HeatbugModelSwarm.java 封装了所有用于模拟热虫世界本身的对象(但不
包括用户接口对象)public List getHeatbugList () // 获得 heatbug 列表
public Grid2d getWorld () // 获得 world 2D 对象实例 public HeatSpace getHeat ()
// 获得 2D HeatSpace 对象实例public boolean toggleRandomizedOrder ()
//判断是否用随机顺序public Object addHeatbug (Heatbug bug)
//添加 Heatbug 个体public HeatbugModelSwarm (Zone aZone)
// 初始化,参数界面public Object buildObjects ()public Object buildActions ()public Activity activateIn (Swarm swarmContext)
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
public Object buildObjects () 首先建立代表环境的对象。 Heatspace 主体代表了热
量的空间特性。他通过多种模型参数初始化。 然后设定代表主体位置的栅格 创建模型中主体列表以便在模拟中追踪 创建热虫自身,这是相当复杂的一步:热虫是本仿真
中的关键部分。 利用一个循环创建一组热虫
选择随机的理想温度和输出热量(据参数设定范围) 用表准的构造函数创建新的热虫主体 加入列表 初始化热虫的其他状态(如移动概率,随机初始位置等) // 热虫创建完毕
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
public Object buildObjects () {
…… super.buildObjects();
heat = new HeatSpace (……); // 环境
world = new Grid2dImpl (……);//world 是一个 2D 图
heatbugList = new ListImpl (getZone ());//heatbug 列表
…… for (i = 0; i < numBugs; i++) { …… hbug = new Heatbug (world, heat); // 在 world 中创建一个 Heatbug heatbugList.addLast (hbug); //添加到 heatbug 列表的最后
……// 设置各参数初始值,放在 world 中的随机位置
}…… }
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
public Object buildActioins ()
在这里创建模型时间表,它是定义了模型中仿真时序的数据结构。核心是一个包含了一系列动作的actionGroup ,然后把它放入 schedule
创建仿真动作的列表,把它们放入一个行动组,我们希望这些动作按特定顺序执行,但是这些步骤并不消耗(模拟)时间。
M(foo) means “The message called <foo>”. 可以向特定对象发送一条消息或者向一个集合中的每个对象发送一条消息。
这里我们通过两个阶段更新 heatspace :首先执行diffusion,然后执行“ updateWorld” 来让热虫发生的变化真实的发生。这里的顺序很重要。
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
同时注意到,利用一个布尔标记`randomizeHeatbugUpdateOrder‘ 我们可以随机化热虫实际执行它们的步骤规则( step rule )的顺序。这能起到消除在每步对列表中热虫循环访问时带来的系统偏差( This has the effect of removing any systematic bias in the iteration throught the heatbug list from timestep to timestep )
缺省的, createActionForEach 模型动作的缺省顺序是” Sequential” ,这意味着循环遍历“ heatbugList” 的顺序都是一样的(假设链的顺序没有被其他过程间接改变)
在 actionGroup 中 heat(HeatSpace 对象 )执行“ stepRule” 对主体列表中每个热虫执行“ step” 更新 heat 栅格(“ updateLattice” )
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
public Object buildActions () { super.buildActions(); modelActions = new ActionGroupImpl (……); //创建一个 ActionGroup 实例 …… //添加两个 action ,一个为 update world 中每个网格的 heat ,另一个为每个 Heatbug创建 action——step
创建执行前面设定动作组的 schedule.ActionGroup 的对象自身没有时间的概念,为了让它能够按时间执行,我们创建一个Schedule 对象,在特定的时间应用 modelActions ActionGroup 。这个时间表重复的间隔为“ 1” ,即将在每个 time step循环。动作会在相应于循环开始的时间为“ 0” 的时间点执行。
这是一个简单的时间表,只有一个动作每次重复,可以参考 jmousetrap 来看更为复杂的 schedules
modelSchedule = new ScheduleImpl (……);//创建一个 schedule 实例
modelSchedule.at$createAction (0, modelActions); // 将 actiongroup 的实例添加到重复的 schedule 实例中
…… }
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
public Activity activateIn (Swarm swarmContext )
Now set up the model's activation. swarmContext indicates where we're being started in - typically, this model is run as a subswarm of an observer swarm.
super.activateIn (swarmContext); 激活自身时间表
modelSchedule.activateIn (this); 返回我们的 activity
return getActivity ();
}
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
Heatbug.java
Heatbugs 是 2 维世界中具有简单行为的主体: 如果太冷,移动至较为温暖的点 如果太热,移动至较为凉爽的点 有一些以外情况,比如该点被占用,试着找到一个没被占用的点
。 randomMoveProbability ,是移动到随机地点的概率
一些用来初始化主体状态的方法。 构造函数
两个参数 world heat 检查和传递参数 取得 world 的大小
在运行中读写热虫状态的方法。探测器机制是得到一个主体状态的底层( lowlevel )方法——还允许(并不要求)编写获得的方法当你认为必要或方便时。注意命名惯例,这样的命名对后面探测器的翻译来说很重要。(探测器优先使用方法获取而非直接获取)
设定热虫状态的简单方法
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
public Heatbug (Grid2d w, HeatSpace h) // 初始化及用户接口,响应 probebug 的鼠标右键的事件
public double getUnhappiness ()
// 获取当前 unhappiness 参数值
public Object setIdealTemperature (long i) // 设置理想的温度
public Object setOutputHeat (long o) // 设置 heatbug 自身的热量
public Object setRandomMoveProbability (double p)
// 设置随机移动的机率
public Object setX$Y (int inX, int inY) // 设置位置
// 上面的代码是基本的 swarm 对象编程,真正的模拟代码在下面实现
Heatbug 行为真正在这里实现
public Object step () //heatbug 的行为
public Object setBugColor(byte c) // 设置 heatbug 的颜色
public Object drawSelfOn (Raster r) //画图
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
Step方法是对模型的一个很好的简化
public Object step () {
……
heatHere = heat.getValueAtX$Y (x, y);
// 获得当前位置的 heat
…… // 计算我当前的 unhappiness 值 abs(ideal - here)
//
heat.findExtremeType$X$Y (((heatHere < idealTemperature)
? HeatSpace.hot
: HeatSpace.cold),
heatCell);//调用函数寻找邻居中 hottest或 coldest点
…… // 理想的点已经找到,下一步是随机移动,找到新位置
// 如果当前不满意值 0 ,则不动,改变当前位置热量
//否则移动至新位置,若所要移至的网格已被占用,则继续寻找可能位置,若也被占用,再搜寻,如 10次还被找到适合的移动位置,则保持原来的位置
}
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
HeatSpace.java
代码支持扩散主体—— heat space 的定制( specialization )。大部分实际的工作在Diffuse 内完成,它是一个 CA 的实现( implements )。这些函数使得对空间变量的访问得以简化和标准化,使 Heatbug 的代码在一个更高的层次上( higher level )
HeatSpace 是一个简单的对象,代表 world( 一个空间变量 ) 中的热量。它从空间对象“ Diffuse2dImpl” 继承了大部分行为。public class HeatSpace extends Diffuse2dImpl
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
public HeatSpace (Zone aZone, int worldXSize, int worldYSize,
double diffuseConstant, double evaporationRate)
public Object addHeat$X$Y (long moreHeat, int x, int y)
//取出当前位置热量
//比较加入 moreHeat后是否会超出最大热量界限
// 更新当前点 heat
public long findExtremeType$X$Y (int type, HeatCell hc)
// 在 9 个相邻的 cell 中寻找合适的位置, x,y既是输入也是输出,为了避免搜寻顺序带来的偏差,所以建立最有位置链从中随机选择
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
HeatCell.javapublic HeatCell (int theX, int theY)
public Object setX (int theX)
public Object setY (int theY)
public int getX ()
public int getY ()
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
具体程序
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
模拟结果
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
结果分析
我们可以把 heatbugs 模型看作一个最优化问题:每一个 heatbug 都试图寻找自己最理想的生存环境。
每个热虫完全根据自身的需要在移动,但是所有热虫平均的不满意程度呈下降趋势,也即整个系统在不断优化。
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
关于 SARS 模型介绍
模型思路
模型结构
运行结果
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
模型运行机制
✦发病者 ✦就医
✦在院治疗✦治愈出院
✦死亡
✦被接触者 ✦被感染者
✦被隔离者
✦N
✦Y✦满足隔离条件
✦满足隔离条件
✦生成
✦未被感染的接触者
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
✦运行天数递加
✦是否应改变入院延迟
✦是否满足隔离条
件
✦计算前一天的新增病例数
✦执行隔离操作
✦设置新的入院延迟
✦N
✦N
✦Y
✦Y
✦Y
✦N
✦根据前一天的新增病例数,调整活跃度
✦系统中还有主体未处理
✦从主体链中取一个主体
✦执行主体动作
✦结束
✦图 2 模型动作的程序流程图
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
✦产生新接触者包括一定比例的感染者
✦是否满足就医条件
✦判断主体是否已发病
✦标记为已就医状态每日接触人数记为 0
✦是否感染者
✦感染天数达到潜伏期
✦结束
✦治疗天数递加
✦标记为新发病例
✦感染天数递加
✦发病天数递加
✦痊愈出院
✦N
✦N
✦N
✦Y
✦Y
✦Y
✦图 3 主体动作程序流程图
✦是否痊愈
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
模型中关键的三个部分分别是主体类的建立,ModelSwarm 类的建立,和 ObserverSwarm类的建立。
此模型中考虑的主体是人, “接触者”(状态也会变化)。
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
主体类
其中包括主要的属性和方法(这为后面介绍的运行机制提供了基础)包括: int infect_state 描述该主体状态,包括的情况有 4种:
接触未被感染;接触被感染还未发病;确诊发病;经过治疗已经康复;
int touche_num 反映该主体具体每日平均能接触到的人数,为总体平均日接触人数与下面的活跃变量结合求出
double activity_degree 反映该主体的活跃程度 int seperate_flag 隔离或就医标志,可能情况有:未被
隔离,被隔离,已就医
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
主体类中主要的方法(函数)就是判断主体的状态,实现根据主体不同的状态在每个时间步(这里是 1天)做出的相应的行动。 **Step
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
ModelSwarm类
主要设置了模型中系统级的参数 ( 构造函数中 ) ,这些参数可以显示给用户,并可以被修改来实现对不同条件下模型运行结果进行比较研究。
生成了预定个数主体构成主体链( Build Object )
还设置了每个时间步模型的动作序列。 (Build Action)
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
系统及的参数包括: int initInfected 系统中最初的发病人数 double infect_probability 被接触后可能发病的概率 int touchPerson_num 整体上平均的日接触人数 int infectDelay_exp 被感染到发病的平均时间延迟(潜伏期期望) int hospitalChange 述了改变就医习惯的时机,即系统运行天数满足这个值后人从发病到就医的时间间隔将减小
int hospitalDelay 主体从发病(具有传染能力)到就医的时间间隔 double seperatePower 隔离力度,大于等于 0 小于等于 100 的实型数,表
示了被隔离人数的比重,如此值为 70 时 70% 的人被隔离 int seperateDelay 系统采取隔离措施的时间,描述运行多少天后采取隔
离 double becured_probabilit 接受治疗后的平均治愈率 int recover_delay; 从入院接受治疗到痊愈的平均时间延迟
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
ObserverSwarm类
实现了对运行结果数据的采集以及显示的工作。
在这个模型中主要显示了四组数据随时间变化的折线图:累计发病人数,每日新增发病人数,累计治愈人数,每日新增治愈人数。
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
运行结果分析
1.及时就医的重要性 系统中最初具有感染性
(患者)的人数为 1; 最初每人平均每日接触 10
人;
发病潜伏期为 4天;
最初前 25天从发病到就医间隔为 3天, 25天 后改为 2天;
接触后被传染的概率为0.1
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
累计(左)与每日新增(右)发病人数随时间变化曲线( 25天变化)
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
累计(左)与每日新增(右)发病人数随时间变化曲线( 35天变化)
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
最初患者个数对病情发展的影响
只考虑输入型病例。我们对比初始病例有5 例, 25天后改变就医速度的情况,这时系统在 150天左右稳定在大约 3800 人
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
隔离的效果
对比不采取缩减就医间隔的措施这种情况下,隔离措施的效果。假设我们在运行的 40天后采取措施,使 60% 有过接触的人接受隔离,而就医间隔始终为 3天。
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
从累计发病人数随时间变化图中可以看出在运行 110天左右,累计发病人数稳定在 2500 人左右。每日新增病例图中可以看出在第 40天采取隔离措施后,下降的趋势比较明显,而不像前面那种减少就医间隔的措施采取后,还要经过一段时间的滞后才能取得效果。
模拟一种与上面的情况完全相同只是在第 20天就对60% 的接触者采取隔离,这时系统运行 80天左右,累计发病人数在 420 人左右就达到了稳定。
中国人民大学经济科学实验室 http://ecolab.ruc.edu.cn 张树人 http://t.qq.com/DrZhangshuren
目前模型还存在许多过于简化不很周全的地方
模型机制需要真实数据的验证
基于有效模型可方便的做更多的比较研究,加深我们对现实世界的认识