用Scratch来模拟肺炎传染有多可怕
苗森 谢作如
2020年初,一场新型冠状病毒引发的肺炎席卷神州大地。随着肺炎疫情的蔓延,大部分人响应政府号召,尽量避免外出,但仍有人不以为然,照常外出社交娱乐。针对这一现象,Ele实验室发布了《计算机仿真程序告诉你为什么现在还没到出门的时候》的网络视频,利用编程模拟病毒传播过程,以可视化的方法展示人口流动、隔离床位等因素对疫情防控的影响,点击量和转发量上百万,同时也让人们领略到计算机编程的魅力。
Ele实验室用的编程语言是Java,中小学生最熟悉的编程语言却是Scratch,能否利用Scratch来模拟肺炎传染?笔者想到Scratch侦测模块中的“碰到”指令,与肺炎传染中的人员接触颇为相似,于是带着这个问题,开启了一场Scratch模拟肺炎传染的编程之旅(如图1)。
● 作品规划
Scratch模拟肺炎传染的程序设计主要包含4个重要问题:①怎样模拟人群分布和人口流动?②怎样模拟肺炎传染的过程?③怎样模拟肺炎救治过程?④怎样对感染人数和疫情蔓延时间进行统计?表1是上述4个程序设计重要问题说明。
● 角色设计
根据系统设计中的传播过程建模,在Scratch的角色区创建4个角色:健康者、首批病患、提示者和隔离区。
1.健康者
健康者在初始状态的基础上,根据系统设定的流动性参数,持续不断地移动,在此过程中可能经历4种状态:健康状态、感染病毒但未发病状态、感染病毒且已发病状态和感染病毒已隔离救治状态。为了在模拟程序中更容易区分这4种状态,分别使用4个造型以不同的颜色标记(如表2)。
2.首批感染者
首批感染者相对于健康者而言,在初始化时就是感染未发病状态,后续经历发病和隔离两种状态,因此它可以与健康者共用一套角色造型。
3.隔离区
隔离区负责收治已发病的肺炎感染者。初始为“空仓”状态,床位充裕,但收治隔离病人会不断挤占床位,当床位已满时,隔离区就無法再收治,此时隔离区切换造型为“满仓”状态(如表3)。
4.提示人
提示人根据感染人数计算出感染率,当感染率达到50%时提出警示,当感染率达到90%时再次提出警示。
● 工作流程
根据系统设计中的假设,结合Scratch3.0的指令功能,笔者绘制了Scratch模拟肺炎传染程序的流程简图(如上页图2)。
需要说明的是:①健康者与首批病患者的角色本体在完成克隆指令后,不参与程序中的交互,实际参与交互的是健康者和首批病患的克隆体。②程序生成克隆体需要一段时间,这段时间不应计入疫情蔓延时间;先克隆健康者,再克隆首批病患,计时从首批病患克隆完成之后开始。③假设床位充足时,发病即确诊,即隔离救治。④假设加入病患感染病毒未发病,尚处于潜伏期,无法得到救治;只有当病患发病后,才能得到救治。因此,尽管在首批病患发病前,受传染人数可能超过床位量,但隔离区在首批病患发病后才开始判断是否满仓。
● 程序编写
模拟程序中涉及的量包括:模拟人数(健康者和首批病患)、人口流动性参数、床位量参数、延迟度参数、感染人数、感染率、时间等。经测试,受Scratch克隆体运行机制和程序复杂度的双重限制,本程序的模拟人数不宜超过100,因此直接把模拟人数设定为100,其中健康者98人,首批病患2人。其他变量的创建如表4所示。
健康者和首批患者是模拟程序中的核心角色,他们的脚本较为复杂。以健康者的脚本为例,其脚本指令如图3、图4所示。
● 模拟测试
测试环境:Windows10操作系统、电脑配置CPU Intel(R)i5-8265U、内存8GB、显卡Intel(R) UHD Graphics 620。笔者分别输入如下页表5所示的5组数据,每组数据模拟运行三次,以数值在中间的一次为准,将模拟结果用折线图的形式呈现,如下页图5所示。
从折线图中,第③组代表正常人群流动且不进行任何隔离治疗措施时的趋势,疫情肺炎感染率迅速增加。比较第①组至第③组可以发现,当人们尽量减少外出,也就是降低人群的流动性后,肺炎疫情将大为缓解。比较第②组与第④组,相同的人群流动性和延迟度,增加床位量,对肺炎疫情有所缓解。比较第④组与第⑤组,相同的人群流动性和床位数,如采取措施缩短病患从感染到隔离治疗的时间,肺炎疫情也有所缓解。
当然,这个程序还存在诸多问题,如输入相同参数进行多次模拟,每次模拟结果之间的差距较大,模拟结果将受测试电脑性能影响导致结果不一致性。要更逼真地模拟肺炎感染,可以从两方面努力:①优化模拟程序算法,把肺炎传播的各方面因素纳入其中,例如,健康者与病患接触时并非一定被感染,存在一个感染的概率;用正态分布代替随机分布,更加符合现实中的人群分布状态等。②选择更专业的编程工具。毕竟Scratch并非为数学模拟而开发,对克隆体数量的支持有限,而诸如Java、MATLAB等编程工具可以支持更为复杂的函数,拥有更高的程序执行效率。
回看这个程序的设计,并没有高深莫测的算法,也不需要复杂的编程工具,稍有编程基础的学生通过自己努力就可以完成。但要把这个程序写好,学生需要了解传染病的传染规律,了解常见的传染病数学模型。笔者相信,通过编写这样的程序,学生将体会编程并非就是简单地敲打代码,而是一项非常综合的工作,正所谓“汝果欲学诗,功夫在诗外”。