来源:公众号IT大嘴巴
撰稿人:刘策
2020年1月底,原本喜气祥和的春节,被一场突如其来的疫情搞得人心惶惶。
由此也开启了全民“宅”家模式,那些我们无处安放的青春则变成了朋友圈中一场场花式家庭娱乐、烹饪大赛。对于普通人来说,勤洗手、少出门,就是对疫情最大的贡献。当然,对于那些有爱心、有技术、有能力的小伙伴来说,所能做出的贡献还远不止如此。
出门买菜与取快递,哪个更安全?
自疫情发生之日起,作为家里唯一的青壮年男性,我就主动承担起了出门买菜的“重任”。不过在选择买菜地点的时候,我和老婆却发生了分歧——老婆青睐小区附近大超市,附近还未出现确诊病例,“咱们这里还是很安全的”;而我更希望去距离较远、但采用会员制的某连锁超市,理由是会员制的超市人少……
究竟是去听起来更安全的附近超市,还是去人流量更少却更远的超市呢?在这个问题上,我和老婆各执一词并争论不休。最终,虽然并不认同老婆的那套“理论”,但为了家庭和谐我还是选择了距离更近的超市,正所谓“大丈夫能屈能伸”。
(全民居家隔离,老爷们儿肩负超市买菜重任)
或许你觉得这个问题像是个笑话,但在疫情之下类似的事情并不少见。比如,最近许多餐馆陆续营业,外卖小哥也开始忙碌起来。那么问题来了,叫外卖与取快递,究竟哪个更安全呢?再比如,3月份有许多企业都开始正式复工了,那么坐公共交通和骑自行车,哪一项更安全呢?
从感性来说,我们都知道,尽可能减少出门和接触是最安全的。但是“宅在家”总不是生活的常态,一旦我们外出,除了戴好口罩做好防护之外,如何最大限度降低自身染病的风险?或者说,我们是否可以通过模拟病毒传播路径进行有效的分析和推测,并对病毒的传播方式进行量化呢?
答案是肯定的,而且从学术界到IT界许多专家们正在进行这样的尝试。今天我们要介绍的,就是这样一款有趣的“病毒模拟器”。
用科技模型助力疫情防控
这款精确的应用程序是由一位来自微软中国、“有情怀”的程序员小哥开发的,用于推导病毒在人群中的传播路径,
基于有状态粒子机来开发,主要体现基于POI的人物移动效果。该程序内核基于NETCore开发,支持跨平台运行,跨平台导出GIF,图形界面为Windows WPF。
在逻辑层面上,这款“病毒模拟器”采用的是“接触即有几率传播”的模型——假设病毒有一个感染半径X,对于半径内的人每次有Y%的几率传感给对方。如此,就可以在系统中随机设置N个兴趣点(POI),人员会在兴趣点之间随机流动,借此观察一定人数和范围内病毒的传播曲线。
原本按照微软小哥的设想,原有模型采用“健康人”、“传染者”、“康复者”概念,它假定每个传染者在特定时间内会传染给N个健康人。但是因为病毒传播的速度太快,没过几天疫情确诊人数就从几百人达到了上万人,原有的模型没有考虑空间因素,所以它无法计算隔离与非隔离的情况,而且无法处理不同地图下人员行为的差异。
随着疫情的发展,模拟器也历经不断的迭代与升级,总体模拟人数从最初的1000人扩大到了70万人,实时模拟量也从最初的1000人增加到了4万人,从而可以模拟县市级别的人员流动与活动范围轨迹,对于疫情的防控也起到了很大帮助。
升级的版本中采用了改良版模型——采用“毒圈”概念,每个传染者会传感给附近特定范围内的N个人,传染方式采用“毒圈叠加”算法,既每个传染者单位时间会向健康人添加“感染度”,当感染度满的时候,这个健康人会变成传染者。传染度会叠加,以模拟多个传染者在附近的时候感染概率的增加;当附近没有传染者的时候,传染度会归0。
这样就解决了疫情感染人数爆发的问题,也让模型更趋近于真实的场景表现。这也让我们对于病毒传播方式从感性的认知上升到了理性的量化数字——从实际模拟情况来看,即便在目前隔离(出门概率很低)情况下,受感染的概率也和人群的出门距离以及时间呈平方比上升。
不仅如此,模拟器还可以模拟在有限医疗资源情况下,床位状况对于疫情扩散的影响。采用改良型POI可以支持从图片加载POI,并支持CSV文件导出,在表现界面上也有大幅度变化。这样形成的数据有助于我们更方便的借助分析工具进行虚拟疫情分析。虽然模拟器本身不能指导我们下决策,但是它可以用于决策推演。
这就好比行军作战时候的“参谋长”,能够在关键时刻提供给我们重要的建议和思考。
我们可以通过4张不同类型的病毒模拟GIF图片,更清楚地观察到时间、距离和目标位置所呈现出的差异。这里,我们将病毒传播分为活跃度和POI两个维度——活跃度代表了人物出门、逛街的概率,活跃度值越高,出门、逛街的概率越高;而POI则代表了兴趣点的数量,比如超市、菜市场、菜鸟驿站等等,POI的数字越大说明POI散布越多,意味着出门距离越近(时间越短)。
(低活跃度低POI)
第一张图代表了大多数人的情况,比如去每周一次离家很远的超市或者菜市场买菜。模拟结果显示,由于低POI导致出门比较远,所以我们可以明显看到病毒从聚集地传播开,但并不会实现快速传播,传播范围也有限。
(低活跃度高POI)
第二张图所呈现的场景也是最近很常见的,就是低活跃度高POI,比如一周一次去家门口的便利店,或者时常出门取快递。模拟结果显示,由于人群倾向于呆在家,而且高POI使得出门之后很快就可以回家,所以也没有造成病毒的大面积传播,而只是零星的出现。
(高活跃度低POI)
第三张图是高活跃度高POI,比如时常跑到远距离的超市,俗称就是“出去浪”。结果就是我们很明显地看到,尽管POI高使得人群出门时间不长,但是高活跃度使得人群仍然会集中在POI附近,导致病毒像烟花一样爆裂地传播起来,绝大部分区域都有感染。
(高活跃度高POI)
最后一张图是最可怕的,高活跃度低POI,有点类似于现在意大利或者韩国等国外的情况,大家依然在不断地频繁出门与社交。模拟的结果也很触目惊心,因为两个关键因素叠加,使得病毒在极短的时间内扩散开,全场都呈现出严重的感染情况,意味着病毒的发展不受控制。
其实正如模拟器所呈现的那样,如果将我们自身比作图片中的某个小绿点,外出的时间越远、时间越长,接触到其他人的几率越高,受感染的概率也会越高;而且软件告诉我们,这种概率是呈指数级提升的,也就是说每增加1分钟,都会增加成倍的风险。
这也就解释了我们文章最初提到的问题,买菜究竟是去家附近的大超市还是去更远的会员制超市?答案很明显——就近购买,因为越短时间风险越低,也让我再次感慨老婆大人的“明智”。其他出行方式也是一样。如果不是自驾车出行,那么我们还是尽可能选择接触少、时间短的交通工具。
(老婆大人最英明!)
这个病毒模拟器软件虽然看似简单,但是在逻辑设计和模型推理上却是严谨得一丝不苟,同时图形化的界面让我这样的文科生也能够一目了然。目前,模拟器已经迭代到了V3版本,该版本重写了界面系统,并采用DirectX硬件加速渲染,使得图形性能提升了10倍以上,这样也就大大增强了可视化效果。在模拟规模上,V3版本如今可以支持2-4万人实时模拟显示,因为性能更高,可以实时观测到人群像水流一样流动。
精益求精的微软小哥表示还会对模拟器做进一步的升级,接下来的V4版本中将引入GPU加速、改良POI引擎,并优化界面设计,使其更符合科研应用的需求;而在谈到未来更长远的计划时,包括分布式计算引擎、Webassembly、嵌入浏览器等许多功能也将不断加入其中,让软件日趋完善。
很显然,随着软件的不断升级与迭代,功能的不断丰富与完善,尤其是覆盖范围和模拟人数的不断提升,仅靠微软小哥一人已经越来越难适应复杂的需求,毕竟个人的业余时间也是有限的。为此,小哥也将所有程序开源在GitHub托管平台上,任何有兴趣的小伙伴都可以点击下面这个链接了解更多信息或者贡献自己的力量:https://github.com/JohnMasen/VirusSimulator
对于大多数人来说,我们对于病毒的认知来源于媒体的报道,来源于朋友间的道听途说,我们看着每天疫情通报的数据不断变化,却并不了解病毒的传播路径与方式。而这款病毒模拟器所实现的,则是一种全新的、可视化、具象化的方式,就如同每个人都置身于图片之中,感受病毒带来的震撼与威胁。
借助于这个模拟器,我们可以清楚地看到在不同的活跃度与POI维度下模型所呈现出的场景,这些场景也让我们明确了自身的责任与义务。相比于那些奋战在抗疫一线的医生、护士、警察、记者等“逆行者”们,我们都是普通人,但是普通人也可以贡献自己的力量,也可以借助科学的技术手段切身感受到健康的可贵。
幸好,如今的疫情数字已经在一天天减少,我们身边听到的好消息也在不断增多。相信要不了多久,
寒冬就将过去,迎接我们的将是山花烂漫。