NetLogo学习笔记5 —— 物种与传染病模型
(模型经过一些修改,与标准SIR模型有些出入)
在上一篇文章,我们学习了随机选择、伪并发、ifelse和of语法。实现了用于解释隔离现象的谢林模型
这次,我们要学习NetLogo中物种的概念,并实现一个 “SIR传染病模型”
何为 SIR传染病模型?
- 有若干人,他们没得过病,不具备免疫。为易感者。S 代表 易感者
- 有几个感染者,易感者与其接触后,有几率被传染。I 代表 感染者
- 感染者发病到一定程度,有几率会免疫,或死亡。R 代表 免疫者
我们用不同的物种来代表这几类人
infect 为传染率,death 为病亡率,T 为感染到死亡或治愈的时间
这些参数都是 0~100的滑动条1
物种的定义 —— breed语句
先创建setup和go按钮及函数,把基本要素搭建好,并创建参数滑动条,然后想想代码思路:
- 我们要定义不同种类的人
- 为他们实现各自的行为,比如
感染者将易感者变成感染者,感染者康复或死亡
先来解决第一个问题,来看看模型头几行:
breed [S a-S] ;定义易感者
breed [I a-I] ;定义感染者
breed [R a-R] ;定义免疫者
I-own [life-time] ;为感染者定义生命时间,到了一定时间,感染者就会死亡或免疫
;方括号内为复数形式和单数形式
;单数形式不常用,因此不做介绍
这里定义了模型三种人,复数形式代表整体集合,就像turtles代表全体海龟一样:例如,S是全体易感者集合
breed 是定义种类的语句,语法如下:
breed [<复数形式> <单数形式>]
第4行:还记得 patches-own 吗?为瓦片定义新属性。这里用法也一样,为感染者定义定义新属性,储存它活了多久
创建物种实例并初始化 —— create语法
说了那么多,物种到底有什么用?看看setup函数就知道了:
to setup
clear-all
create-S 249 [ ;创建249个易感者
set color green
setxy random-pxcor random-pycor]
create-I 10 [ ;创建10个感染者
set color red
setxy random-pxcor random-pycor
set life-time 0]
reset-ticks ;时钟初始化,以前讲过
end
运行一下,就明白这段代码是干什么用的了
刚好是10个红和249个绿,怎么回事?我来慢慢解释:
物种只不过是贴海龟上的标签罢了,本质还是海龟
第3行:create-S 与 create-turtles 相似
只不过create-turtles是单纯创建海龟
create-S 创建的海龟带有S标签,而且会让每个这样带标签的海龟执行后面方括号的代码
create-S 函数是在我们定义S这个物种时自动创建的
其语法如下:
create-<物种复数形式> <数量> [<初始化代码>]
也就是说,我们创建了249个带S标签的海龟,并把它们设置成绿色,设置它们的坐标为随机。第6行同理
看看go函数代码,模型的主要部分:
to go
ask S [move] ;令每个易感者移动
ask R [move] ;令每个免疫者移动
ask I [
move ;移动
ask S in-radius 1 [ ;对每个在半径1范围内的易感者执行代码
if random 100 < infect [ ;有infect% 的概率触发
set breed I ;把易感者变成感染者
set color red ;把新感染者变红
set life-time 0 ;初始化生命计数器
]
]
if life-time > T [ ;如果生命计数器到时
ifelse random 100 < death ;有death% 的概率为真
[die] ;如果为真,感染者死亡
[set breed R ;如果为假,感染者转变成免疫者
set color gray] ;并且颜色变灰
]
]
tick
ask I [
set life-time life-time + 1 ;每个感染者生命计数器加一
]
end
to move ;移动海龟的方法,为了避免重复,就写了个函数
left random 360 ;左转一个随机的度数
fd 1
end
第2、3行:前面提到过,复数形式代表某物种所有个体的集合,那么注释里的意思就不难得出了。
move函数 写在后面,里面的 left 是左转的意思,接收一个度数参数
第7行 S in-radius 1 返回由距离感染者1个距离的所有易感者构成的集合
in-radius语句会返回在 “在调用主体一定距离以内,且属于某集合的海龟” 所构成的集合。语法如下:
<集合> in-radius <距离>
第9行:set breed I,如果某个易感者在感染者周围,且很不幸的触发了感染代码,那么它将变成新感染者
前面讲过:物种只是标签,我们可以通过设置海龟的breed属性来改变物种标签
然后它会变红,生命计数器初始化为0
第16行:海龟执行到die,就会被删除
剩下的,语法上已经没啥障碍。我想注释已经讲得够清楚了,有什么疑问可以去评论区
数据直观化的利器 —— 图的绘制
如何动态的表现易感者、感染者和免疫者的数量呢?
图表是不错的选择,而且能够让我们的模型显得更加专业
按以下方式创建一个图表
plot语句 会在每次时间更新时,把右边的参数值画在图上
图表横轴为时间,纵轴为数值
在这个例子中,会实时的把各种类的人数,以不同的色彩画在图上
(注意:绘图只有在开启时间同步更新时才能运作)
模型最终效果如下:
可以试着修改代码,自己多多实践
这篇文章就这里了,喜欢记得关注哦!会更新的!