Netlogo模型讲解:病毒传播模型
标签:
netlogo病毒传播网络仿真 |
本文档由netlogo爱好者编,如有不足,请见谅! 模型位置 :模型库->Sample Models ->Networks->Virus on a Network 病毒,可以是计算机病毒,也可以是我们通常说的生物之间传播的病毒,模型通过构建网络,模拟病毒传播
可参考文献:复杂网络上计算机病毒传播研究:黄鑫 文章链接
原语学习: n-of n-of size agentset n-of size list 对主体集合,从输入主体集合中随机选取(不重复)size个主体组成一个主体集合,返回该主体集合。 对列表,从输入列表中随机选取(不重复)size项组成一个列表,返回该列表。结果列表中各项的顺序与原列表中的顺序一致。(如果需要随机顺序,对结果使用shuffle) 如果size大于输入集合(列表)的项数,则出错。 links 返回由所有链组成的主体集合。
本模型主要是对links的应用 模型界面: http://7xtbfq.com1.z0.glb.clouddn.com/FpbLbSINaNQkGuinUL-Iinr4HpdZ
模型代码:
turtles-own ;;turtle通常翻译是海龟的意思,也就是我们所说的主体,这里就是我们建模中社区里的人 [ ;; turtle-own 表示人拥有的属性,像下面英文解释的一样,人是否被感染,是不是有抗体,和病毒检测时间跨度 ;;一般变量像infected? 带问号(?)结尾的变量,我们通常认为他只有两个可能,真或假。 ;;比如 infected? 为真的时候,那么就说明感染了,假的时候说明没感染 infected? ;; if true, the turtle is infectious resistant? ;; if true, the turtle can’t be infected virus-check-timer ;; number of ticks since this turtle’s last virus-check ]
to setup ;;一般程序中都会定义一个这样命名的按钮(setup只是一个名字,你可以把按钮改成initial,然后这里的函数也改为initial,两者对应起来),用来初始化数据 clear-all ;;清除程序里面所有设置 setup-nodes ;;这是自己定义的函数,在下面可以找到,为什么要定义函数,第一、函数可以重复调用 ,第二、为了代码整洁,调理清晰;函数的意思是设置个体节点 setup-spatially-clustered-network;;自己定义的函数,设置节点的布局,为了布局美化用 ask n-of initial-outbreak-size turtles ;;;ask 就是请求的意思 n-of 就是随机选取(不重复)size个主体组成一个主体集合,这里initial-outbreak-size 就是我们 ;;;界面中的滑动条里对应的值。这句话总的意思是请求所有主体中随机的initial-outbreak-size个主体去做[]里面的事,就是去被感染 [ become-infected ] ;;这也是自己定义的函数,具体意思就是去设置成个体被感染 ask links [ set color white ];;links是netlogo中的一种主体,前面讲了turtle也是,还有patch reset-ticks ;;tick是用来计算运行次数的,reset-ticks就是重新开始计数,一般放在setup中 end
to setup-nodes ;;自己定义函数,setup里调用,注意一下命名,为了好理解,一般命名都是要命名为易于理解,和内容相关的。初始化设置节点(主体) set-default-shape turtles “person” ;;设置主体的形状,这个person是海龟形状编辑器里定义好的,你可以到软件 工具 下面找 create-turtles number-of-nodes ;; create-turtles生成一定数量的个体 number-of-nodes就是在界面里定义的数量 [ set size 2 ;;个体的尺寸 ; for visual reasons, we don’t put any nodes too close to the edges setxy (random-xcor * 0.95) (random-ycor * 0.95) ;;个体分布的位置,random-xcor世界里随机一个横坐标,random-ycor随机一个纵坐标。为了美化他都乘以0.95(解释看英文) become-susceptible;;这也是自己定义的函数,具体意思就是去设置成个体是怀疑者 set virus-check-timer random virus-check-frequency ;;set 就是赋值的意思,random random virus-check-frequency 就是在0 和 virus-check-frequency 之间生成一个随机 数;然后赋值给virus-check-timer病毒检查时间 ] end
to setup-spatially-clustered-network ;;自己定义的函数 let num-links (average-node-degree * number-of-nodes) / 2 ;;控制创造链的数目 while [count links < num-links ] ;;如果模型中总体的链数目小于我们所要求的数目 [ ask one-of turtles ;;随机选取模型中的一个主体 [ let choice (min-one-of (other turtles with [not link-neighbor? myself]) [distance myself]) ;;选取没有和上面那个主体有链的主体集中距离最近的主体 if choice != nobody [ create-link-with choice ];;如果存在上面描述的主体,那就把这两个主体创建链 ] ] ; make the network look a little prettier repeat 10 ;;重复十次,使得模型布局优雅,这个可以不关注 [ layout-spring turtles links 0.3 (world-width / (sqrt number-of-nodes)) 1 ] end
to go ;;迭代执行,因为按钮上那个循环有个勾打上了,你可以到界面去看,然后把选中勾,右键编辑就可以看到 if all? turtles [not infected?] [ stop ] ;;如果所有的主体都没有感染,说明不会有人感染了,模型结束了 ask turtles ;;请求所有的主体做[]以内的事情 [ set virus-check-timer virus-check-timer + 1 ;;每次迭代病毒检查时间间隔天数加1 if virus-check-timer >= virus-check-frequency;;如果检查时间间隔超过病毒检查频率,那么就设置时间间隔为0,因为超过了就再下面do-virus-checks会做检查 [ set virus-check-timer 0 ] ] spread-virus ;;传播病毒 do-virus-checks;;病毒检查 tick ;;时间计数加1,内部语言 ; if ticks = stop-ticks ;;代码前面加;表示注释掉,不用了 ; [stop]
end
to become-infected ;; turtle procedure ;;自定义函数,被感染 set infected? true ;;感染设置为真 set resistant? false;;抗体无 set color red;;主体颜色设置为红色,这个时候我们回头看看,turtle-own里并没有定义这个变量,这个是海龟内置的变量,就是不用定义就可以拿来用的 end
to become-susceptible ;; turtle procedure ;;自定义函数,怀疑对象 set infected? false ;;感染设置为真 set resistant? false;;抗体无 set color green;;主体颜色设置为绿色 end
to become-resistant ;; turtle procedure;;自定义函数,有抗体 set infected? false;;有抗体了,被感染是不可能的 set resistant? true;;抗体有 set color gray ;;主体颜色设置为灰色 ask my-links [ set color gray - 2 ] ;;主体连接的链颜色设置为灰色浅2个等级 end
to spread-virus ;;传播病毒,自定义函数 ask turtles with [infected?] ;;请求那些感染病毒病毒的人,with表示拥有某种属性,这里就是拥有infected?为真的主体 [ ask link-neighbors with [not resistant? and (distance myself) < infect-distance] ;;请求那些和上面主体有链相连且距离在传播范围内的主体 [ if random-float 100 < virus-spread-chance ;;任意生成0-100的随机数,如果随机数小于感染概率,那么这个人就被感染,引进随机数,这样说明不是每个人都会 [ become-infected ] ] ] ;;感染,有的人天生抵抗力强,或者其他因素 end
to do-virus-checks ;;自定义函数,对人进行病毒检查,参加检查的人是那些被感染的,且检查跨度时间到了 ask turtles with [infected? and virus-check-timer = 0] ;;感染病毒的人,在要做病毒检测的时候,就是virus-check-timer = 0的时候 [ if random 100 < recovery-chance ;;随机数控制,一定康复几率 [ ifelse random 100 < gain-resistance-chance;;随机数控制,接受抗体的几率 [ become-resistant ];;接受抗体 [ become-susceptible ];;没接受抗体的,也变成怀疑对象,从感染者到怀疑对象,也被认为是康复了 ] ] end
to-report count-resistant report count turtles with [ resistant? ]
;;返回有抗体的人数和 end to-report count-infected report count turtles with
[ infected? ];;返回感染的人数和 end to-report count-susceptible report
count turtles with [not infected? and not resistant?];;返回怀疑对象的个数和
end
需要交流的可以加我qq:2763035721
或者有疑问加我qq 群:530305942
赞助作者:

加载中…