苗森 謝作如



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等編程工具可以支持更為復雜的函數,擁有更高的程序執行效率。
回看這個程序的設計,并沒有高深莫測的算法,也不需要復雜的編程工具,稍有編程基礎的學生通過自己努力就可以完成。但要把這個程序寫好,學生需要了解傳染病的傳染規律,了解常見的傳染病數學模型。筆者相信,通過編寫這樣的程序,學生將體會編程并非就是簡單地敲打代碼,而是一項非常綜合的工作,正所謂“汝果欲學詩,功夫在詩外”。