基于计算机程序模拟的疫情传播实验
Momiria
摘要:通过设计计算机程序模拟疫情传播机理,通过调控参数进行对比试验、并对实验数据进行函数拟合、数学建模,由此总结出疫情防控的有效措施。
关键词:计算机模拟实验 疫情传播 疫情防控 程序设计
1 引言
岁在庚子,新冠疫情席卷中华大地。随着全球经济一体化加快,人与人之间接触越来越频繁,加之日趋严重的环境污染,传染病给人类带来的危害越来越大。本文基于统计数据,设计了计算机程序对疫情传播进行模拟,并进行一系列对照实验。
该实验使用的计算机语言是C++,鉴于可读性只放关键代码并加以阐述,以便没有编程基础的读者阅读。
2 模拟实验前的准备工作
2.0 资料查询
通过查询资料得知: 不戴口罩时的传染率约为90%,而携带者、健康者都戴口罩时传染率约为1.5% [1]
2.1 相关参数声明
2.1.1 传染率
\[设传染率为p\\ 该参数指在密切接触的情况下,健康者被携带者传染的概率 \\ 根据统计数据,可将其细分为以下参数:\\ p_0 --指在携带者、健康者皆不戴口罩情况下的传染率\\ p_1——指在携带者、健康者都戴口罩情况下的传染率 \]2.1.2 社会活动性
\[设社会活动性为s(s ∈ N)\\ 该参数指每人每天在不被隔离的情况下密切接触的人数。 \]2.1.3 参数声明的代码部分
double p0, p1;//这些变量是小数
int s;//这些变量是整数
2.1.4 其他变量的代码部分
int n; //人数
int tot;//感染人数
int day = 0;//第几天
struct {
int ill_d ;//记录这个人在第几天被感染, -1为健康
int flag; // 记录这个人的状态,0为健康,1为已感染;
int control; //此人是否居家隔离, 0为否, 1为是
} people[100010]; //记录每个人的状态
3 模拟实验
3.1 实验一 毫无防范意识的社会
设想这样一个社会:人人从不洗手也不戴口罩,没有任何疫情管控措施,感染病毒后依旧正常活动,医生给予病人拥抱。
3.1.1 实验初始化
\[设人数n=100000,s=10\\ p_0=90 % \] n = 100000; s = 10;
p0 = 0.9;
people[1].ill_d = 1, people[1].flag = 1, tot = 1;
//设第一个人是零号感染者
int next[500]; //储存每个人接触的人的序号信息
3.1.2 实验流程
经过时间一天天的推移,每天每个人都会随机与s个不同的人进行接触,接触时进行一次概率为p0的传染判定。直到所有人都被传染实验停止。
while(tot != n)
{
for (int i = 1; i <= n; i ++ ){
if (people[i].ill_d == day) people[i].flag = 1; //判断当天是否发病
}
for (int i = 1; i <= n; i++)
{
//随机模拟每天接触到哪些人
for(int j = 1; j <= s; j++) {
next[j] = random(n);
}
//统计接触到的人有多少被感染的人
int count = 0;
for(int j = 1; j <= s; j++) {
if(people[next[j]].flag == 1) {
count++;
}
}
//判定这个人是否被感染
if(count > 0 && people[i].flag == 0 ) {
double randnumber = (double) rand() / RAND_MAX; //产生0-1的随机小数
double probability = 1;//被感染的概率
for (int j = 1; j <= count; j++) {
probability *= (1-p0);
}
probability = 1 - probability;
if (randnumber <= probability ) {//如果被感染
tot++;
people[i].ill_d = day + 1;
}
}
}
day++;
cout << "第"<<day <<"天,感染人数为"<<tot<<endl;
}
3.1.3 实验结果
第1天,感染人数为30
第2天,感染人数为294
第3天,感染人数为1872
第4天,感染人数为9038
第5天,感染人数为36589
第6天,感染人数为83879
第7天,感染人数为99356
第8天,感染人数为99999
第9天,感染人数为100000
实验结果是非常惊人的!在第9天,全部人都被感染了。
拟合出来的函数是:
\[y=61.191e^{1.0018x} \]3.2 实验二 减少人员间接触
预设一个交通不发达的社会,人人都不戴口罩,但相对实验一的社会人们间接触大大减少了。
该实验与实验一仅有参数上的不同:社会活动性 s 设为3
3.2.3 实验结果
全体感染时是第14天。
第1天,感染人数为10
第2天,感染人数为43
第3天,感染人数为129
第4天,感染人数为368
第5天,感染人数为985
第6天,感染人数为2628
第7天,感染人数为6843
第8天,感染人数为17028
第9天,感染人数为38413
第10天,感染人数为69976
第11天,感染人数为93563
第12天,感染人数为99608
第13天,感染人数为99996
第14天,感染人数为100000
拟合出来的函数是:
\[y=18.454e^{0.7338x} \] 很遗憾 ,虽然限制社会活动起到了一定作用,但不戴口罩很快全体都感染了。
3.3 实验三 人人带口罩
该实验与实验一仅有参数上的不同:即将p0改为p1即可。
经过查询, 设定p1为1.5%
3.3.3 实验结果
全体感染时是第197天。
拟合出来的函数是:
\[y = 57.874e^{0.0496x} \] 实验数据显示,与不戴口罩相比,全体戴口罩能显著减缓疫情的传播。
3.4 实验四 严格的社会管控模式
预设一个管控严格的社会:人与人之间交流较少、人人戴口罩、在生病的第五天会自觉进行居家隔离(即每位传染者只有四天的机会传播病毒.)
3.4.1 实验初始化
\[设人数n=100000,s=5\\p_1=1.5% \]3.4.2 实验流程
代码大部分与实验一相同。不同的是初始化以及接触到传染人数的判断:
for (int i = 1; i <= n; i ++ ){
if (people[i].ill_d == day) people[i].flag = 1;
if (people[i].ill_d == day + 4) people[i].control = 1; //感染第五天后开始自我隔离
}
int count = 0;
for(int j = 1; j <= s; j++) {
if(people[next[j]].flag == 1 && people[next[j]].control == 0){
//当接触到的携带者没有自我隔离时才会记录
count++;
}
}
3.4.3 实验结果
全体感染时是第456天。
从折线图可以看出,数据已经不适宜用指数函数拟合,而是更贴近一次函数。拟合的函数是:
\[y=273.67x-16321 \] 从指数函数退化到线性函数,这是一个非常振奋人心的变化!这告诉我们居家隔离的重要性。
4 总结
从以上实验中我们可以总结出以下几点指导疫情传播的结论:
1.戴口罩对控制疫情转播十分有效
2.居家隔离对控制疫情传播十分有效
3.控制人员流动对控制疫情传播有效果,但比不上以上两个措施
5 致谢
这篇花费了我几乎整个寒假的数学建模作业终于告一段落。
首先,将我最诚挚的谢意献给我的数学导师——【】老师。他渊博的知识,深厚的学术功底和独到的见解给了我莫大的帮助。他严谨的学风、孜孜不倦的钻研和勤奋进取的精神令我终生难忘。感谢【】老师为我创造了良好的学习环境,感谢老师在我的求学生涯中指导我如何为人、处事、做学问。
衷心感谢【】的全体老师,在过去两年的生活、学习和实践中,班主任【】老师与各个任课老师给予了我很多关怀和帮助,从他们身上,我学到了很多宝贵的品质和精神。他们不仅指导我们的学习,也关心我们的生活,教我们为人处事,使我在理论上和实践上都得到了很多锻炼的机会。在整个论文的写作期间,从选题,设计到论文的最终成稿阶段都渗透着他们巨大的心血,在他们的帮助下,我才能顺利地完成论文的撰写。
衷心感谢Martin同学。感谢他在生活中对我的帮助,感谢他们在这篇论文中的合作。特别是Martin同学在撰写期间给了我巨大的支持和帮助,在此表示诚挚的谢意。
最后感谢我的家人对我的关心和鼓励。
6 参考文献
[1] Yafang Cheng et al., (2021), Face masks effectively limit the probability of SARS-CoV-2 transmission, Science, DOI: 10.1126/science.abg6296
标签:计算机程序,口罩,疫情,int,感染,Momiria,实验,人数 From: https://www.cnblogs.com/Martin-MHT/p/17179469.html