瘟疫模擬——技術預演與方案設計(Python技術預演)

瘟疫模擬——技術預演與方案設計

前期的資料調研

新冠病毒受體是血管緊張轉化酶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文件.

效果展示

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章