瘟疫模拟——技术预演与方案设计(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文件.

效果展示

瘟疫模拟——技术预演与方案设计(Python技术预演)_第1张图片

你可能感兴趣的:(python相关,python)