또한 전염병 시뮬레이션 프로그램의 확산을 썼다

전염병 시뮬레이션 프로그램의 .NET 확산에 서면

전 동안은 누군가가 "전염병 시뮬레이션 프로그램의 확산"을 사용하게 볼 수 있습니다 Java할 수 있습니다. 어느 등 주민 이동 의지, 의료 기능 등 많은 실제 상황에 따라, 바이러스를 전파 할 수있는 능력이 전염병의 개발을 시뮬레이션 할 수 있습니다. 그것을 읽은 후, 나는 비밀리에 특히 일부 비디오 및 사진과 함께, 깜짝 놀라게 정말 아주 좋은 것입니다.

필요가 있기 때문에, 2月6号내가 나서서 사고와 코딩의 이틀 후, 결정 그날 밤, 다음과 같은 결과를 운영 ...... 초기 효과가 있습니다 :

전염병이 곧 도시 전체 만에 확산됩니다되지 않은 제어 경우에 효과가 있으므로, 해석 할 수있는 8:1000도시의 침대, 곧 제어의 출력 OUT 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한 (비율 48: 1000) :

static int HospitalBeds = 240; // 床位数

또한 침대 작업을 증가시킬 수, 키보드 A, 다음과 같은 운영 결과를 (코드를 변경하지 마십시오) 수 :
www.wityx.com

눈에 보이는 침대 증가 후 사망률은 여전히 ​​전염병의 개발을 제어 할 수없는 치료의 수가 크게 개선, 감소하지만됩니다.

잠복기없이 "이상적인"(1)

그것은 구성 할 수 있습니다 :

// 0潜伏期
static float GenerateShadowDays() => 0;

다음과 같이 운영 결과는 :
www.wityx.com

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

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

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

// 0潜伏期
static float GenerateShadowDays() => 0;
// 发病后,立即就医。
static float GenerateToHospitalDays() => 0;

在这种情况下,运行效果如下:
www.wityx.com

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

戴口罩出门

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

static bool WearMask = true; // 一定戴口罩

运行效果如下:
www.wityx.com

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

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

配置如下:

static bool WearMask = true; // 一定戴口罩
static double MoveWilling = 0.10f; // 每天只有10%的人愿意出门

运行效果如下:
www.wityx.com

病毒在最初的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;
    }

    // 其它代码
}

运行效果如下:
www.wityx.com

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

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

写完这个东西,给我最大的感受就是震撼,模拟起来就是一些数据而已,但背后是千千万万有血有肉的病人和医务工作者,向那些伟大的“逆行者”们致敬!

从上面的数据也可以看出,任何单项指标做好,都是不能完全阻止疫情的。我们要相互信任,做好自己。我们能做的有:尽可能呆在家,别出门,就是对国家最好的贡献;出门一定要戴口罩,这样可以明显降低感染率。

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

게시 된 132 개 원래 기사 · 원 찬양 15 ·은 10000 +를 볼

추천

출처blog.csdn.net/ling_76539446/article/details/104236999