用Netlogo实现病毒传播对经济的影响分析
用Netlogo实现病毒传播对经济的影响分析
- 一、基本考虑
- 二、涉及要素
- 三、计算思路
- 四、程序设计
- (一)界面设计
- (二)具体代码
- 五、结果分析
- (一)“栅栏”模式
- (二)“放羊”模式
- 六、后续改进思路
一、基本考虑
新冠病毒的传播,已经形成了全球大流行。而针对新冠病毒的防治,各国政府的态度和策略在一开始区别是很大的。有些是举全国之力、以雷霆万钧之势抗击疫情,而有些则由于担忧大规模的隔离和禁足对经济产生的不良影响,一直犹豫不决。为了更直观的展示不同策略对经济可能产生的影响,需要定量化研究新冠疫情下不同策略的具体效果。
针对上面的需求,我们利用netlogo对相关问题进行建模。具体来说,我们考虑两种策略。一种是当新冠发生后,采取隔离和全员禁足的方式,我们称之为“栅栏”模式;另一种是不做隔离和禁足,人们还是按照之前的方式进行生活,我们称之为“放羊”模式。
二、涉及要素
具体在病毒传播方面,考虑的因素有以下几点:
- 1.初始人数:可设置的范围是0~10000,模拟一个区域、城市或国家的全部人口;
- 2.初始感染率:这里是一个假设的值,即程序开始运行时,城市中已感染的人数;(我们在这里建设为1%)
- 3.感染率(无防护措施):这个值用来控制健康人员在没有任何防护措施下,与感染者接触后患病的几率;(我们在这里假设为80%)
- 4.感染率(有防护措施):这个值用来控制健康人员在没有任何防护措施下,与感染者接触后患病的几率;(我们在这里假设为40%)
- 5.死亡率:这是每天的死亡人数,占所有的患病人的比率;(我们在这里假设为千分之4)
- 6.平均症状出现时间:这指的是每个感染者从感染开始到出现明显症状的时间;(我们在这里假设为7天)
- 7.平均治愈时间:这个值指的是每个感染者从进入医院开始,到治愈出院的时间;(我们在这里假设为20天)
在与经济相关方面,我们考虑两个因素:
- 1.平均每日GDP:这个值指的是正常活动的人,每天创造的GDP价值;(我们在这里假设为2)
- 2.平均治疗花销:这个值指的是接受治疗的人,每天的花费;(我们在这里假设为9)
三、计算思路
在病毒传播方面,采用简化的模型,人与人之间的接触是随机事件,当感染者与正常人接触后,根据设定的感染率来判定正常人是否受到感染;感染者在感染超过7天后,被放倒医院内,医院里的人员不再互相感染;每天按照死亡率随机的从感染者中选择死亡的人员;在医院治愈的病人,超过20天后认为治愈出院,治愈后的人默认具备免疫能力,不再感染。
在经济方面,正常活动的人员每天按照设定的“平均每日GDP”产生GDP,并计入全部的GDP中;在医院救治的人员每天按照“平均治疗花销”消费资金,并计入全部治疗花销中。
在上面假设的“栅栏”模式中,我们的agent在有病患期间都不活动,即不产生任何GDP,在确认没有病患后继续活动;而“放羊”模式则是在整个期间人员都不停止活动,因此会一直产生GDP。
我们的目的就是比照在同样运行半年时间后,“栅栏”模式创造的价值(即总GDP减去总花销),与“放羊”模式创造的价值两者到底哪个更高。
四、程序设计
我们的程序使用的是最新的Netlogo 6.1.1,可以从以下地址下载:
http://ccl.northwestern.edu/netlogo/download.shtml
使用netlogo进行开发其实还是很简单的,软件本身就给提供了丰富的模型库示例可以参考,同时社区中还有很多做的很棒的资源。但netlogo语言和我们用的C#、Python都不太一样,所以如果没有其他语言基础的,相对还更好上手一些。关于netlogo的学习,推荐看它官方提供的用户手册,个人感觉就很好用了。
(一)界面设计
我们的程序界面如下:
其中左面是我们前面提到的,在程序运行中相关的各种变量。中间是我们agent运行的窗口,右面是两个统计窗口。
Netlogo的界面搭建还是很简单的,它提供了成型的控件,选择好后直接添加即可。这里要注意的是,控件中定义到的变量是可以直接在程序中使用的,所以一定不要用中文,否则后面写代码就要出问题了。
以我们其中的一个参数为例:
这是一个滑块变量,可以在程序中随时调整取值,看程序也可以看出,这个是当做一个全局变量直接使用的。
再比如下面这个统计框的设置:
这是在程序运行中,对相关变量进行统计的,可以自己定义画笔,按照程序的步长进行更新,按照什么条件统计哪些数据需要在更新命令中明确说明。
(二)具体代码
在代码中需要注意的有以下几点:
- 一是程序的运行需要有初始的setup和循环运行的go,这是一般的netlogo程序都包含的两部分,通过设定响应的按钮来实现,在代码中要具体写程序逻辑;
- 二是程序中的函数都是以“to 函数名”开始,以“end”来结尾;
- 三是netlogo中最重要的就是“海龟”和“瓦片”两个概念,可以简单理解海龟就是agent,瓦片就是环境;对于这两个对象在netlogo中的具体相关参数和函数,可以自行查询手册;
- 四是除了系统给定的参数外,我们还可以自行设定参数,例如海龟的相关参数,使用“turtles-own[]”来进行设定,全局变量使用“globals[]”来设定;同时还可以自定义不同的瓦片区域,利用瓦片的坐标范围来定义即可;
- 五是在撰写代码中,还有一些需要注意的小地方,比如循环turtles时,die后面的不会执行;move-to是把某个turtles移动到指定的某个瓦片区域中;运算符和变量直接一定要用空格;统计选取等带条件时一定要用关键字with等。
具体代码较长,在这就不贴了,如果需要可以联系我!
五、结果分析
根据我们程序的运行后,相关结果如下所示:
(一)“栅栏”模式
可以看到,在“栅栏”模式下,总的患病人数大概在250~350之间;GDP的变化在隔离期内是没有增长的,总的GDP大致在2570000左右,而治疗费用的花销不到整个GDP的10%。
(二)“放羊”模式
在“放羊”模式下,总的患病人数达到了惊人的6000多人,占总人口的60%还多;GDP是一直在增长的,总量在2960000左右,而治疗花销的费用接近GDP总量的50%,也就是说产生的GDP有一半都用在治疗上了。
通过上述实验可以明显看出,虽然“放羊”模式产生的GDP总量的确略高于“栅栏”模式,但扣除花销后,产生的社会价值则远远低于“栅栏”模式。更不用说“放羊”模式中远远高于“栅栏”模式中的死亡人数了,毕竟生命的价值是绝不能用GDP来衡量的。
六、后续改进思路
虽然程序体现出了两种模式对经济影响的巨大差别。但其中的模型还有很多需要商榷的地方。
例如 经济模型的缺失(本程序中其实是没有经济模型的,特别是疫情对于不同产业结构、行业特点等经济影响的仿真),传播模型的粗陋(本程序中agent采用的是完全随机游走,这和实际生活中人的活动也是不一致的,这就导致很难模拟出社区传播这一特性),以及 二次传播的不合理(我们程序中默认的是治愈后不会再感染,而新冠对已治愈者是存在二次感染的)等等。这些都是后续需要持续改进的地方。
请从我的Github上进行代码下载https://github.com/samurasun/netlogo
总结
以上是生活随笔为你收集整理的用Netlogo实现病毒传播对经济的影响分析的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 导师对计算机学生论文的评语,导师对论文的
- 下一篇: 论文阅读--SAP-SSE: Prote