C# 版本 疫情传播仿真程序

前言

前一阵子看到有人制作了《疫情传播仿真程序》,是用 Java 做的。里面根据多种实际情况,如居民移动意愿、医护能力、病毒传播能力,来模拟疫情的发展。看完之后,我暗暗称奇,特别是结合一些视频和照片,确实做得非常好。

后来过了几天,这个视频还上了 人民日报 的微信公众号,这时我们  .NET 社区就开始骚动了起来:joy::joy:,咱们  .NET 能不能也做一个?

既然有需要, 26 那天晚上我决定说干就干,经过两个晚上的思考与编码,已经有了初步效果……运行效果如下:

这个效果可以这样解读,如果不加以任何控制,疫情会很快蔓延到整个城市,只有 8:1000 床位的城市,将很快失去控制,一年后运行效果如下(非常惨烈):

参数与使用

代码中实际有很多参数可以操作:

由于参数太多,很难在 运行时 全部都做调整,我选取了 是否戴口罩移动意愿医院床数 作为参数,代码如下:

其中,按数字键 1 、  2 、  3 可以指定不同的 移动意愿 ,其中  1 表示居民最不愿意出门,  3 表示最愿意,按  M 可以控制居民是否能戴上口罩,按  A 可以添加医院可接纳病人数。

一些演示

超多床位

这里我将床位调成 240 个(比例为  481000 ):

也可以运行时增加床位,按键盘 A 即可(不用改代码),运行效果如下: 

可见床位变多后,死亡率会降低,治愈人数大大提高,但仍然无法控制住疫情的发展。

“理想”情况1·没有潜伏期

可以这样配置:

运行效果如下:

可见就算潜伏期为 0 ,由于没有及时就医,疫情仍会失去控制。

“理想”情况2·没有潜伏期、且立刻隔离就医

像那个 Java 版中,会先介绍一个“理想”情况,即感染即发病,发病即就就医。此种模型的参数,可以这样配置:

在这种情况下,运行效果如下:

可见,由最初的 5 人,最终只感染了  6 人,理想情况下局势很快就被控制。当然这种情况是不存在的。

戴口罩出门

假如居民都戴口罩出门,可以用如下配置(也可以运行时按下 M 键):

运行效果如下:

坚持了 107 天,疫情发展速度大大降低,但由于医疗资源的匮乏,死亡率仍然居高不下,最终仍会失去控制。

居民呆在家中不出门,且戴口罩

配置如下:

运行效果如下:

病毒在最初的 5 人身上,只感染了  2 人。效率可谓惊人。

模拟现实模型

我想贴近现实,模拟一些现实情况,然后看看效果如何,我的脚本如下:

  1. 前  20 天,不作任何控制

  2. 第  20 天,全民戴口罩,移动意愿降低至  50% ,床位增加  40 个(模拟进入 重大突发公共卫生事件Ⅰ级响应

  3. 第  25 天,移动愿意降低至  10% ,床位增加  80 个(模拟火神山医院)

  4. 第  30 天,床位再增加  80 个,共  240 个(模拟雷神山医院)

为了尽可能短地截取 gif ,我将时间缩短了,真实时间可能会和这个比例为  1:2 (也就是相当于前  40 天不作任何控制),脚本如下:

运行效果如下:

可见这真是与病毒的一部史诗级斗争。

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骚操作】

最后,在新的一年里,祝大家阖家欢乐,鼠年大吉!