流行のシミュレーションプログラムの.NETの広がりで書かれました
しばらく前、誰かが「流行のシミュレーションプログラムの広がりは、」使用されていることを確認し確認してくださいJava
することができません。こうした住民など多くの実用的な状況に応じてどちらの意志、医療機能、流行の開発をシミュレートするために、ウイルスを拡散する機能を移動します。それを読んだ後、私は密かに、特にいくつかのビデオや写真と組み合わせて、驚いて、本当にとても良いです。
必要があるので、2月6号
私は先に行って、決めたその夜は、思考やコーディングの2泊分の後、次のような結果を操作する......初期の効果があります。
この効果は非常に任意のコントロール、解釈はないにすることができ、流行はすぐに都市全体に広がるだけだろう8:1000
街のベッドには、すぐに(非常に苦い)、次のように演算結果である1年後、制御不能になります。
パラメータと使用
動作可能である実際のコードの多くのパラメータがあります。
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
1(比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
天,已经没有被病毒感染的人了。
总结
所有这些代码,我都上传到了我的博客数据网站,各们可以下载代码,通过LINQPad 6
直接模拟运行,或者拷到Visual Studio
中亦可。各位也可以或者提出您的想法,Github
链接如下:
https://github.com/sdcb/blog-data/tree/master/2020/20200207-2019-ncov-simulate
写完这个东西,给我最大的感受就是震撼,模拟起来就是一些数据而已,但背后是千千万万有血有肉的病人和医务工作者,向那些伟大的“逆行者”们致敬!
从上面的数据也可以看出,任何单项指标做好,都是不能完全阻止疫情的。我们要相互信任,做好自己。我们能做的有:尽可能呆在家,别出门,就真是对国家最好的贡献;出门一定要戴口罩,这样可以明显降低感染率。
最后,在新的一年里,祝大家阖家欢乐,鼠年大吉!