瘟疫模擬——技術預演與方案設計
前期的資料調研
新冠病毒受體是血管緊張轉化酶2,通過粘膜細胞傳播(嘴脣、眼皮、鼻腔、口腔)。
在密切接觸的人羣之中,通過噴嚏、咳嗽、平靜的說話等方式傳播。大部分感染者七天內發病,病毒的平均潛伏期是5.2天。
新冠肺炎病毒的傳播途徑主要爲飛沫傳播,碰觸到人類粘膜,比如眼睛,嘴脣,鼻孔等部位進行感染,而戴口罩可以有效防止飛沫傳播,雖然不同口罩的防護作用不同,但實際上根據飛沫病毒的直徑大小,其實各種口罩都能夠防住80%以上的飛沫,因此戴口罩,無論是哪一種口罩,遠比不戴口罩要強得多,N95/KN95是最好的,可以隔絕95%以上。
洗手很重要,病毒在玻璃、塑料、金屬上可以存活兩天,而在你的手觸摸的時候會傳播到你的手上,再從你的手傳染給自己,所以洗手,洗久一點。
湖北省早期病死率高達44.4%(醫療資源緊張,重症才確診),其他地區病死率1.1%(醫療資源充足)。
R0在2-3之間,R0,基本傳染數,意味着不在干預的情況下,感染者傳染的平均人數。
人類的讚歌就是勇氣的讚歌,贊給那些還在認真工作的人們,希望2020年,我們還有更多的勇氣。
設計方案
實驗主題: 學校開學,學生返校,如果在返校的路上,有同學不幸感染了新冠病毒,學校和學生採取不同的措施,會在返校後校園裏面產生怎麼樣的影響(即最終會有多少人會感染)?
採取措施細節: 是否戴口罩以及戴口罩的防護效果、控制返校人數爲多少人、出行限制情況即是否允許出門或者一天允許多少人出門;後續可能再去添加的變量:隔離情況、治癒情況等。
這些不同的措施,我們對應到參數上,就是實驗人數(返校人數)、保護有效性和採取保護措施人數(是否戴口罩以及戴口罩的防護效果)、每天外出人數(出行限制)。另外,返校途中有多少人感染也可以作爲控制條件,比如10000個人裏面可以設置1個人感染了,也可以設置10個人感染了,是實驗可控制變量。
實驗結束條件: 感染人數30天內不再增加(成功)或者感染人數佔總返校人數的50%(失敗).
實現方式: 通過改變參數,以可視化的方式展現出結果。
實驗意義: 通過對於出現風險狀況以及採取不同措施的模擬,評估風險值,尋找同學們在安全與開展學習生活工作等活動之間的平衡點,從而保證同學們可以在足夠安全的狀況下開展活動。
技術預演
通過Python的random模塊進行隨機概率的實現,建立模型,實驗實現模擬。
人類個體模型屬性:編號、狀態、保護措施、外出情況
編號:用來區分每個人類模型的標識
狀態:分爲三種,健康爲0,感染爲1
保護措施:未採取保護措施爲0,採取保護措施爲1
外出情況:不外出爲0,外出爲1
代碼展示
import random as r
#實驗模型
human=[]
#實驗人數
hunman_number=-1
#感染概率
infected=0
#保護措施
protect=0
#採取保護措施
human_protect=0
#每天外出人數
human_out=0
#保護者id
protect_id=[]
#外出者id
out_id=[]
#所有人id
human_id=[]
#感染者id
virus_id=[]
#函數,收集信息
def get_info():
print("*********************")
#global改變全局變量
global hunman_number,infected,protect,quarantine,human_out,human_protect
#實驗人數
hunman_number=int(input("實驗人數:"))
#感染概率
infected=float(input("疾病感染概率(0~1):"))
if infected>1 or infected<0:
print("感染概率在0到1之間")
get_info()
#保護措施有效性
protect=float(input("保護有效性(0~1):"))
if protect>1 or protect<0:
print("保護概率在0到1之間")
get_info()
#採取保護措施人數
human_protect=int(input("採取保護措施人數:"))
if human_protect>hunman_number or human_protect<0:
print("採取措施人數不可超過實驗人數")
get_info()
#外出人數
human_out=int(input("每天外出人數:"))
if human_out>hunman_number or human_protect<0:
print("外出人數不可超過實驗人數")
get_info()
#函數,創建模型
def creat_mod():
global human,human_id,protect_id,virus_id
#循環創建指定人數的實驗個體,並將id存儲。
for id in range(0,hunman_number):
#id、state、protect、out
human.append([id,0,0,0])
human_id.append(id)
#採取保護措施人數id的集合,數據爲對實驗總體進行隨機重排列,再選擇一定量輸出。
protect_id=r.sample(human_id,human_protect)
#循環更改實驗個體
for id in protect_id:
#0爲未採取保護措施,1爲採取保護措施
human[id][2]=1
#原理同上
virus_id=r.sample(human_id,int(human_protect*0.0005)+1)
for id in virus_id:
#0爲健康,1爲感染
human[id][1]=1
#函數,實驗
def experiment():
global out_id
fail=int(hunman_number*0.50)
print("*****************************")
print("實驗開始,失敗條件感染人數:",fail)
day=0
while True:
#計數器清零
count=0
#統計感染人數
for i in human_id:
if human[i][1]==1:
count+=1
human[i][2]=1
human[i][3]=0
#外出人數
out_id=r.sample(human_id,human_out)
for id in out_id:
human[id][3]=1
#統計結果
print(day,"天感染人數",count)
#新的一天開始
day+=1
#判斷是否繼續實驗
##實驗結束
if count>=fail:
print("gameover->",day)
break
#循環找朋友
for id in out_id:
#隨機選擇朋友
friend_id=r.choice(human_id)
#若均感染,則跳過
if human[id][1]==1 and human[friend_id][1]==1:
pass
#一方感染
else:
#判斷感染
contagion(id,friend_id)
#函數,判斷是否感染
def contagion(id_1,id_2) :
global human
#感染概率
contagion_p=0
#第一個id爲健康
if human[id_1][1]==0:
#採取保護措施
if human[id_1][2]==1:
contagion_p=infected*(1-protect)
#未採取保護措施
else:
contagion_p=infected
#是否感染
human[id_1][1]=pick(contagion_p)
#第二個id爲健康的人
else:
if human[id_2][2]==1:
contagion_p=infected*(1-protect)
else:
contagion_p=infected
human[id_2][1]=pick(contagion_p)
#函數,選擇函數
def pick(contagion_p):
#選擇
select=[1,0]
#概率
choose=[contagion_p,1-contagion_p]
x = r.uniform(0 ,1)
cumprob = 0.0
for item , item_pro in zip(select , choose):
cumprob += item_pro
if x < cumprob:
break
return item
def main():
get_info()
creat_mod()
experiment()
#程序入口
if __name__ == '__main__':
main()
同時提交了COVID19.py文件.