新冠病毒受体是血管紧张转化酶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文件.