病毒傳播模擬

Qi Fong
May 30, 2021

本篇根據一些經驗,和一些腦補的假設,模擬看看病毒傳播的行為。

部分假設可能會有一點點牽強,但會好寫很多。底下先介紹大致流程。

設置

  1. 有固定大小的地圖(m * m)。
  2. 地圖上有一群人,數量預設是地圖面積的一半(N=m*m/2)。
  3. 每個人都有7個屬性,按編號分別為,[人物id,狀態(病毒含量),行動能力,自癒能力,是否免疫,該回合是否篩檢,是否處於隔離或是在醫院的狀態]。
  4. 初始條件下,每個人的行動能力、自癒能力(常態分布,平均=0.95,標準差=0.05)都是隨機的。
  5. 每個人的初始免疫狀況、篩檢狀況、是否隔離都設為0。
  6. 每個人在地圖上的位置都隨機產生,但有可能同一格,同時站複數個人
  7. 若地圖上的人本身帶有病毒,則在包含自身3*3的範圍內,放入致病力,算法是跟本身的病毒含量成正比,不計算距離遞減的效果。
  8. 有醫療容量的限制,也就是醫院能容納的人數有上限,進入醫院後,會獲得更強的自癒能力。
  9. 若醫院滿了,只做隔離,自癒能力不會增強。
  10. 設定篩檢的準確度,若本身病毒含量大於某個門檻,則有0.95的機率驗出陽性,若低於門檻值,則也有0.95的機率呈現陰性,所以會有False positive的情況。
  11. 只要是呈現positive,且醫院還有位置,就無條件醫院送,否則只做隔離。
  12. 每回合本身的病毒含量會是上一個階段的病毒含量*自癒能力。例如上一回合的病毒含量是1,自癒能力是0.95,則該回合病毒含量更新成0.95,所以自癒能力的數值是越靠近0越強。
  13. 若本身的病毒含量小於某個閾值(預設0.5),且本身的自癒力小於1,那視為痊癒,獲得免疫力,之後不會重複感染。
  14. 多個人在地圖同一區塊投入傳染力時,取最大值作為該位置的傳染力。
  15. 若有一個人出現病徵,要對其過去track_day天(預設是追蹤過去5天)進行軌跡追蹤,這幾天裡,凡是有經過該路徑的人,都要被抓去篩檢,若篩檢完是陽性,加入追蹤名單,且也要追蹤此人過去的路徑和碰到的人。

流程

  1. 初始化人環境及人物參數。
  2. 讓所有人在地圖上漫步track_day天。
  3. 更新自身狀態(自身病毒含量),判斷是否死亡,或痊癒(會有免疫力)。
  4. 每個地圖上的活人,會對周遭投入傳染力。
  5. 若某個人出現病徵(病毒含量大於設定的門檻),則加入佇列,將其過去的行蹤取出,追蹤是否有人這幾天經過這些地點,有的話抓去篩檢,篩檢呈陽性就加入佇列,一路篩檢到佇列最後一位為止。
  6. 在佇列裡面的人,若醫療資源大於0,將其丟到醫院,增強其自癒力;若醫療資源歸零,丟去隔離,不增強其自癒力;本身病毒含量歸零且當下在醫院或隔離地的人,隨機丟回地圖上,且獲得免疫力;本身病毒含量沒有歸零,且在醫院或是隔離的人,原地待著不要亂跑;在地圖的活人,且沒有被檢測出為帶原的人,根據自身移動能力向四周移動。
  7. 重複3~6步驟,直到指定N天。

結果

總人口 = 100*100/2 = 5000。

醫療容量最大值 = 5000/15 = 333 單位,每一單位視為可以處理一個病患。

False positive的人數: 303

左邊的圖中,

藍色: 被丟到隔離所的人數

橘色: 被丟到醫院的人數

綠色: 剩餘醫療容量

右邊的圖中,代表出局人數

如上圖所示,前面30天是醫療體系最崩潰的時期,醫療能量迅速從333降到低點,此時因為醫院容量已滿,只能丟去隔離,若該位隔離者,本身自癒能力的數值>1,那他將在隔離地陣亡。

由此也發現,前期的傳染的速度是指暴漲,後期因為每個人漸漸都趨向免疫,所以隔離和在醫院的人數又回到低點,醫療能量也漸漸回復,但經過400回合後,仍有超過250個人出局。

討論

如同最開頭所說,其實當中有一些是自行的假設,例如當醫院能量空出的時候,沒有把隔離地的人送去醫院的機制,導致會發生自生自滅的情況,但真實情況可能並非如此。

要達到上面的行為結果,其實有很多參數要調,比如說當傳染力的方程式的增益(預設是當前病毒含量的1.5倍)設得太高,那地圖上的人可能會迅速滅絕;設得太低,會流行不起來。

這邊也沒有設定陰性且在地圖上遊走的人,可以走到地圖外面(例如出國)。

本身是沒有目的性的隨機亂走,但事實上,通常每個人都有自己的習慣模式。

再來是,怎麼樣才叫做有明顯病徵,怎樣叫做明顯可檢驗出,這兩個門檻值也需要調整,如果設的離出局條件很近,經過傳染力增益後,被感染的人會迅速出局(因為是1.5倍)

其實track_day多少也會有影響,如果能追蹤很多天,迅速抓去隔離,確實可以迅速防範傳染,但這個過程曠日廢時;事實上,檢驗過去軌跡的過程,是整個程式碼執行時,花最多時間的地方(可能會等在那好幾秒),因為有經過的人就要被抓去篩檢,還有可能篩錯,這些都是很消耗醫療容量的實際面。

另外一件事是,這邊假設醫療容量是總人口的15分之一,但實際情況可能是低於此數值得,那會使得隔離的人迅速攀升。

這邊也假設檢驗這個行為,有無限多的人可以幫忙檢測,不算在醫療容量內,實際上也並非如此,每個操作其實都要花費很多的人,若考量到此限制,傳播的速度會更加劇烈,會導致更多人出局。

若想觀看程式碼可以到我的github:

https://github.com/dongqifong/05_Simulation/tree/main/Virus_Spreading

當然如果你發現有很荒謬的錯誤,也歡迎告訴我,行有餘力我會再更改。

--

--