用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