23

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

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA%3D%3D&%3Bmid=2654077564&%3Bidx=3&%3Bsn=afddd5c9beda477b1022553086c1a191
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言

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

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

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

Mvm2yiN.gif

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

iIJVjqR.jpg!web

参数与使用

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

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

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

一些演示

超多床位

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

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

7Rjyim2.gif

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

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

可以这样配置:

运行效果如下:

R7jIvyB.gif

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

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

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

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

RVV7veY.gif

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

戴口罩出门

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

运行效果如下:

z6vUNbj.jpg!web

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

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

配置如下:

运行效果如下:

2m67fie.jpg!web

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

模拟现实模型

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

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

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

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

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

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

运行效果如下:

fQRn2iU.gif

nquEbeb.gif

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

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

2IjYbun.jpg!web

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK