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个(比例为 481000):

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人。效率可谓惊人。

模拟现实模型

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter 加密解密_使用Jmeter对SHA1加密接口进行性能测试

机会只留给那些有准备的人改变能改变的&#xff0c;接受不能改变的&#xff0c;就是进步性能测试过程中&#xff0c;有时候会遇到需要对信息头进行加密鉴权&#xff0c;下面我就来介绍如何针对SHA1加密鉴权开发性能测试脚本 1、首先了解原理&#xff0c;就是需要对如下三个参数…

word List 06

word List 06 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

面对疫情,在家办公的程序员如何突围

作者&#xff1a;陌北有棵树&#xff0c;架构师社区合伙人很多程序员朋友都已经开始了在家办公的生活&#xff0c;第一天办公&#xff0c;你的远程工具还流畅吗&#xff0c;视频会议换了几个软件&#xff1f;当然这些都是外在因素&#xff0c;尤其对于程序员来说&#xff0c;解…

[蓝桥杯2018初赛]全球变暖-dfs,bfs,连通块

解题思路: bfs:遍历所有未遍历过的陆地&#xff0c;通过bfs计算出当前位置连通陆地的数量cnt&#xff0c;以及被淹没陆地的数量bound,若cnt bound表示完整淹没的一个岛屿 dfs:将连通块全部标记&#xff0c;如果这个连通块全部都会淹没&#xff0c;则答案1&#xff0c;如果这个…

latex 参考文献显示问号_回「LaTeX 的罪与罚」

原文链接&#xff1a;LaTeX 的罪与罚 - 朴素的贝叶斯的文章 - 知乎作为 LaTeX 开发者&#xff0c;看到这种嘲讽自然是非常 angry 的。本来并不想趟这个混水&#xff0c;然而眼见着赞数一天天涨上去&#xff0c;还居然进了精华区&#xff0c;实在忍不住只好注册了贵乎来说几句。…

疫情之下,使用FRP实现内网穿透,远程连接公司电脑进行办公

当前情况下&#xff0c;经常会有需要到公司电脑进行一些操作&#xff0c;比如连接内网OA&#xff0c;数据库或者提交文档。为了减少外出&#xff0c;将使用frp进行内网穿透的方法进行一个说明。前提条件1. 一台拥有公网 IP 的设备(如果没有&#xff0c;服务器可以使用https://d…

ad中电容用什么封装_二极管在电路中到底做什么用的

所有的电子电路中基本上都会用到二极管&#xff0c;它的特性也是非常之多&#xff0c;最主要就是单方向导电性&#xff0c;(单向导电性的两根引脚之间的电阻分为正向电阻和反向电阻两种)。人们利用这些不同特性构成各种具体的应用电路&#xff0c;分析不同电路中的二极管工作原…

数据结构---邻接矩阵的DFS

数据结构—邻接矩阵的DFS 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #define N 100 #define elemType int //const int MAX_INT (1 << 31) - 1; //const int MAX_INT 0X7fffffff; #define INF (((uns…

.NET Core 如何判断程序是否在远程桌面(RDP)下运行

点击上方蓝字关注“汪宇杰博客”导语由于疫情的关系&#xff0c;很久没发文章了。今天终于稳定下来在家办公&#xff0c;抽空分享一个刚学会的技巧。最近在家办公的程序员可能避免不了要用远程桌面&#xff0c;那么问题来了&#xff0c;你的 .NET Core 程序有没有办法知道自己是…

[蓝桥杯2018初赛]方格计数-巧妙枚举,找规,数论

解题思路&#xff1a; 枚举第一象限的所有点&#xff0c;判断是否在圆内&#xff0c;最后结果*4 我们用下面的程序&#xff0c;来算一个半径为2的圆&#xff0c;其实我们第一象限算的就是那个绿点&#xff0c;然后类比到半径5000. 代码如下&#xff1a; #include <iostre…

ipa在线安装搭建_三种越狱工具安装方法

从 iOS 9.2 开始&#xff0c;苹果越狱进入了半越狱时代&#xff0c;也就是重启手机之后需要重新进入越狱工具激活越狱环境&#xff0c;以下是三种常用的越狱工具安装方法&#xff1a;方法一&#xff1a;自签名下载大胡子签名工具&#xff1a;Cydia Impactor下载地址&#xff1a…

《ASP.NET Core 微服务实战》-- 读书笔记(第7章)

第 7 章 开发 ASP.NET Core Web 应用ASP.NET Core 基础在本章&#xff0c;我们将从一个命令行应用开始&#xff0c;并且在不借助任何模板&#xff0c;脚手架和向导的情况下&#xff0c;最终得到一个功能完整的 Web 应用GitHub链接&#xff1a;https://github.com/microservices…

git为私有仓库设置密码_dnf仓库密码设置不跳出 dnf仓库密码设置流程

部分玩家想要设置游戏中仓库密码但是自己不小心点击了不再提醒后不再弹出了&#xff0c;那么怎么办呢&#xff0c;其实不用着急&#xff0c;下面带大家了解一下如何设置设置仓库锁密码&#xff0c;感兴趣的玩家可以玩下看看哦。dnf仓库密码设置不跳出在游戏中玩家每天第一次登陆…

word List 07

word List 07 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

TIOBE 2月编程语言排行榜新鲜出炉!C# 获3.08%增长率!

编程C# 刚经历了一次TIOBE考试&#xff0c;2020年2月&#xff0c;它拿到的最新分数是第5名。老牌编程语言Java独占鳌头&#xff0c;C语言紧随其后。诚然&#xff0c;工程师们对C# 的青睐&#xff0c;还没能影响到大多数企业&#xff0c;但增长率3.08%的势头&#xff0c;可凭此预…

自动生成sqlserver增删改成_如何批量生成证书证件-可变条码-可变图片-可变数据-快速教程...

如何生成可变图像&#xff1f;如何生成可变文本&#xff1f;如何生成可变条码&#xff1f;如何使打印作业自动化&#xff1f;从多页设计中选取页使用几乎所有数据库程序中的数据库信息通过“拖放”创建个性化打印分享快速教程。1&#xff1a;批量自动化化印刷详细步骤如下&…

线性代数---矩阵的各种问题求解方法

线性代数—矩阵的各种问题求解方法 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

ERP开放平台定制化远程高效协作秘笈

疫情期间&#xff0c;远程研发协作办公成为各企业的主要工作方式&#xff0c;本文将明源云以往的研发实践&#xff0c;结合本次远程办公的实际经验&#xff0c;分享一下面对跨地区多团队&#xff0c;如何高效在线协同&#xff0c;保证研发质量与效率的实践经验。面对当前严重的…

[蓝桥杯2017初赛]跳蚱蜢-map标记+bfs+环形数组

解题思路&#xff1a; 这题如果我们考虑蚱蜢跳&#xff0c;有很多蚱蜢&#xff0c;有很多情况&#xff0c;所以我们让空盘跳&#xff0c;这样就简化题目了&#xff0c;然后我们化圆为直&#xff0c;将题目的情况看成字符串012345678&#xff0c;最后要变成087654321&#xff0c…

win10玩cf不能全屏_如何优化Win10游戏流畅运行?Win10游戏流畅运行优化教程

很多小伙伴们在安装了win10操作系统之后&#xff0c;运行游戏的过程中可能就会遇到游戏卡顿不流畅的情况。如何优化Win10游戏流畅运行&#xff1f;在这里小编为大家准备了一些解决游戏卡顿的小妙招&#xff0c;一起看下吧~如何优化Win10游戏流畅运行一. 关闭nagle算法很多人对于…