C# 版本 疫情传播仿真程序
前言
前一阵子看到有人制作了《疫情传播仿真程序》,是用 Java
做的。里面根据多种实际情况,如居民移动意愿、医护能力、病毒传播能力,来模拟疫情的发展。看完之后,我暗暗称奇,特别是结合一些视频和照片,确实做得非常好。
后来过了几天,这个视频还上了 人民日报
的微信公众号,这时我们 .NET
社区就开始骚动了起来????????,咱们 .NET
能不能也做一个?
既然有需要, 2月6号
那天晚上我决定说干就干,经过两个晚上的思考与编码,已经有了初步效果……运行效果如下:
这个效果可以这样解读,如果不加以任何控制,疫情会很快蔓延到整个城市,只有 8:1000
床位的城市,将很快失去控制,一年后运行效果如下(非常惨烈):
参数与使用
代码中实际有很多参数可以操作:
static double MoveWilling = 0.90f; // 移动意愿,0-1
static bool WearMask = false; // 是否戴口罩
static int HospitalBeds = 40; // 床位数
const float InffectRate = 0.8f; // 靠得够近时,被携带者感染的机率
const float SecondsPerDay = 0.3f; // 模拟器的秒数,对应真实一天
const float MovingDistancePerDay = 10.0f; // 每天移动距离
const int InitialInfectorCount = 5; // 最初感染者数
const double DeathRate = 0.021; // 死亡率
// 要靠多近,才会触发感染验证
static float SafeDistance() => WearMask ? 1.5f : 3.5f;
// 住院治愈时间,最短5天,最长12.75天,平均约7天
static float GenerateCureDays() => random.NextFloat(5, 12.75f);
// 潜伏期,1-14天
static float GenerateShadowDays() => random.Next(1, 14);
// 发病后,就医时间,0-3天
static float GenerateToHospitalDays() => random.Next(0, 3);
由于参数太多,很难在运行时全部都做调整,我选取了是否戴口罩、移动意愿、医院床数作为参数,代码如下:
protected override void OnKeyPress(KeyPressEventArgs e)
{switch (e.KeyChar){case '1': MoveWilling = 0.10f; break;case '2': MoveWilling = 0.50f; break;case '3': MoveWilling = 0.90f; break;case 'M': WearMask = !WearMask; break;case 'A': HospitalBeds += 40; break;case 'D': HospitalBeds -= 40; break;case 'R':{if (MessageBox.Show("要重来吗?", "确认", MessageBoxButtons.YesNo) == DialogResult.Yes){City = City.Create();}break;}}
}
其中,按数字键 1
、 2
、 3
可以指定不同的移动意愿,其中 1
表示居民最不愿意出门, 3
表示最愿意,按 M
可以控制居民是否能戴上口罩,按 A
可以添加医院可接纳病人数。
一些演示
超多床位
这里我将床位调成 240
个(比例为 48
: 1000
):
static int HospitalBeds = 240; // 床位数
也可以运行时增加床位,按键盘 A
即可(不用改代码),运行效果如下:
可见床位变多后,死亡率会降低,治愈人数大大提高,但仍然无法控制住疫情的发展。
“理想”情况1·没有潜伏期
可以这样配置:
// 0潜伏期
static float GenerateShadowDays() => 0;
运行效果如下:
可见就算潜伏期为 0
,由于没有及时就医,疫情仍会失去控制。
“理想”情况2·没有潜伏期、且立刻隔离就医
像那个 Java
版中,会先介绍一个“理想”情况,即感染即发病,发病即就就医。此种模型的参数,可以这样配置:
// 0潜伏期
static float GenerateShadowDays() => 0;
// 发病后,立即就医。
static float GenerateToHospitalDays() => 0;
在这种情况下,运行效果如下:
可见,由最初的 5
人,最终只感染了 6
人,理想情况下局势很快就被控制。当然这种情况是不存在的。
戴口罩出门
假如居民都戴口罩出门,可以用如下配置(也可以运行时按下 M
键):
static bool WearMask = true; // 一定戴口罩
运行效果如下:
坚持了 107
天,疫情发展速度大大降低,但由于医疗资源的匮乏,死亡率仍然居高不下,最终仍会失去控制。
居民呆在家中不出门,且戴口罩
配置如下:
static bool WearMask = true; // 一定戴口罩
static double MoveWilling = 0.10f; // 每天只有10%的人愿意出门
运行效果如下:
病毒在最初的 5
人身上,只感染了 2
人。效率可谓惊人。
模拟现实模型
我想贴近现实,模拟一些现实情况,然后看看效果如何,我的脚本如下:
前
20
天,不作任何控制第
20
天,全民戴口罩,移动意愿降低至50%
,床位增加40
个(模拟进入重大突发公共卫生事件Ⅰ级响应)第
25
天,移动愿意降低至10%
,床位增加80
个(模拟火神山医院)第
30
天,床位再增加80
个,共240
个(模拟雷神山医院)
为了尽可能短地截取 gif
,我将时间缩短了,真实时间可能会和这个比例为 1:2
(也就是相当于前 40
天不作任何控制),脚本如下:
void StepDay()
{if (day < 20){WearMask = false;MoveWilling = 0.9;HospitalBeds = 40;}if (day >= 20){WearMask = true;MoveWilling = 0.5;HospitalBeds = 80;}if (day >= 25){MoveWilling = 0.1;HospitalBeds = 160;}if (day >= 30){HospitalBeds = 240;}// 其它代码
}
运行效果如下:
可见这真是与病毒的一部史诗级斗争。
前 20
天,没有任何控制,病毒疯狂肆虐,前期只花了 9
天,就把医院给挤满了;
第 20
之后,居民带上口罩,传播进度迅速下降,但由于潜伏期较长,发病人数仍然持续上升;
第 30
天之后,由于 5
天前床位(医护资源)的跟进,发病人数增速降低;
第 35
天后,发病人数开始下降;
第 68
天后,除了医院中的病人,城市中已经没有病人;
第 78
天,已经没有被病毒感染的人了。
总结
所有这些代码,我都上传到了我的博客数据网站,各们可以下载代码,通过 LINQPad6
直接模拟运行,或者拷到 VisualStudio
中亦可。各位也可以或者提出您的想法, Github
链接如下:https://github.com/sdcb/blog-data/tree/master/2020/20200207-2019-ncov-simulate
写完这个东西,给我最大的感受就是震撼,模拟起来就是一些数据而已,但背后是千千万万有血有肉的病人和医务工作者,向那些伟大的“逆行者”们致敬!
从上面的数据也可以看出,任何单项指标做好,都是不能完全阻止疫情的。我们要相互信任,做好自己。我们能做的有:尽可能呆在家,别出门,就真是对国家最好的贡献;出门一定要戴口罩,这样可以明显降低感染率。
喜欢的朋友请关注我的微信公众号:【DotNet骚操作】
最后,在新的一年里,祝大家阖家欢乐,鼠年大吉!
C# 版本 疫情传播仿真程序相关推荐
- 手把手教你用C#做疫情传播仿真
手把手教你用C#做疫情传播仿真 在上篇文章中,我介绍了用 C#做的疫情传播仿真程序的使用和配置,演示了其运行效果,但没有着重讲其中的代码. 今天我将抽丝剥茧,手把手分析程序的架构,以及妙趣横生的细节. ...
- R语言模拟疫情传播-gganimate包
本文用gganimate包展示模拟疫情数据 本文篇幅较长,分为以下几个部分: 前言 效果展示 小结 附录:代码 前言 前文<R语言模拟疫情传播-RVirusBroadcast>已经介绍了一 ...
- 基于SEIR模型对美国COVID-19疫情传播的预测和分析
原文链接:易安的小窝 https://jingblog.tech/2022/09/22/mei-guo-xin-guan-yi-qing-yu-ce/ 1.思路 基于每日发布的COVID-19确诊感染 ...
- 基于SEIR微分方程模型对疫情传播的简单预测
目录 一.模型的建立 传染病模型概念 模型假设 SEIR模型 模型中涉及的函数S(t).E(t).I(t).R(t) 更改后的微分方程 二.模型的求解 三.模型的缺点 祝语 随着疫情的再次爆发,全国疫 ...
- 数据预测模型_预测疫情走势,联通大数据疫情传播趋势仿真模型助力复工复产...
联通大数据通过融入基于运营商信令数据分析得出的城市人口职住分布.城市活跃指数.城市复工指数等实际数据指标,对经典传染病SIR模型中的传染率.恢复率等关键指标进行了优化提升,构建了城市疫情传播趋势仿真模 ...
- 通过网络直播互动—协助大型企事业单位有效阻断新冠疫情传播
一. 前言 2020年初的新冠疫情发生以来,至今已持续了一年时间,疫情对社会经济的各个方面影响非常大,对人与人之间日常的交流.协作带来了极大的障碍.尤其是大型企事业单位部门人员之间的交流协作更加困难. ...
- 基于Python的一个疫情传播可视化模拟实验
大家好! 新冠疫情已经持续有快两年了,给大家的工作和生活都带了极大的影响.在疫情之初,我曾经看到过一个对疫情传播发展的可视化模拟.现在回头看,确实如模拟中所示,只要疫情没完全消除,都存在再度传播的风险 ...
- 基于Python+html+javascript+boostrap实现的疫情传播模拟系统
资源下载地址:https://download.csdn.net/download/sheziqiong/85734120 资源下载地址:https://download.csdn.net/downl ...
- 岩土工程、颗粒流计算软件PFC6.0疫情传播案例——生化危机、病毒传播感染、古尔丹大战霜狼氏族
颗粒流软件PFC6.0 案例--病毒感染.传播感染算例<古尔丹的黑魔法军团> 没人点赞这个博客就关啦!T_T 博客介绍 代码 结果 没人点赞这个博客就关啦!T_T 博客介绍 想了几个名字: ...
最新文章
- IbatisNet开发使用小结
- 快速获取青年大学习完成截图
- 第一篇博客记录下自己刚学习的问题
- java中this_夯实Java基础系列7:一文读懂Java 代码块和执行顺序
- 890. Find and Replace Pattern找出匹配形式的单词
- SqlServer标识列
- java 静态方法的使用_java的静态方法的使用
- python相关软件安装流程图解——Windows下安装Redis以及可视化工具——Redis-x64-3.2.100——redis-desktop-manager-0.9.3.817...
- Dev-C++配置问题
- 毕业论文选题之开题报告
- 在LINUX下面建立GPRS无线MODEM拨号
- C盘爆满,你的专属清道夫来啦
- 求和(单例模式,初始化列表,容器,迭代器)
- Spring项目中 注解@Aspect无法被引入的原因
- 决策模型(一):不确定型决策法
- linux的strip含义
- CSDN日报191122:Android工程师的面试指南
- 结对编程——电梯调度系统
- 域名状态REGISTRAR-HOLD的含义 及其它状态解析
- STM32-DA发送正弦波