Python 模擬病毒傳播(2020年7月6日)

效果圖


主要思路
首先創(chuàng)建一個(gè)二維數(shù)組表示人群,內(nèi)部元素全都是[1, 7]
內(nèi)的隨機(jī)整數(shù),這每一個(gè)數(shù)表示一個(gè)人,數(shù)字越大表示抵抗力越強(qiáng),數(shù)字越小表示抵抗力越弱。
創(chuàng)建完成后就開(kāi)始隨機(jī)將人群中的幾個(gè)人轉(zhuǎn)為感染狀態(tài),不管抵抗力強(qiáng)弱,隨機(jī)感染。
然后開(kāi)始進(jìn)入了“人群運(yùn)動(dòng) + 病毒擴(kuò)散”
的無(wú)限循環(huán)。先人群運(yùn)動(dòng),再病毒擴(kuò)散。
人群運(yùn)動(dòng):就是模擬人群里每個(gè)人的社交活動(dòng),例如出門(mén)外出,拜訪(fǎng)朋友,旅游購(gòu)物等等……這個(gè)模擬的沒(méi)有那么真實(shí),原理上只是很簡(jiǎn)單的隨機(jī)抽兩個(gè)人并讓它們交換位置,并執(zhí)行n次。如果把已經(jīng)被感染的人交換了出去,被感染的人進(jìn)入到了一大片沒(méi)有感染的區(qū)域中,那么這片區(qū)域很可能就要發(fā)生擴(kuò)散式感染了。
病毒擴(kuò)散:遍歷每一個(gè)人,如果當(dāng)前這個(gè)人的抵抗力數(shù)小于某一范圍內(nèi)被感染的人數(shù),(這個(gè)范圍是:以當(dāng)前這個(gè)人為圓心,一個(gè)元素間隔為單位長(zhǎng)度,以r為半徑的圓內(nèi),包括圓上,排除他自己的人)則這個(gè)人就被感染,并在遍歷完所有人的時(shí)候修改所有人的感染狀態(tài)。

如圖:中間橘色的點(diǎn)表示被遍歷時(shí)所判定的人,感染判定半徑為2,則所有綠色的點(diǎn)和紅色的點(diǎn)都是能夠?qū)Υ巳嗽斐捎绊懙娜耍绻@些人中感染的人數(shù)過(guò)多了,人數(shù)超過(guò)了他的抵抗力系數(shù),那么他就被感染了,圖中有兩個(gè)人被感染,即如果此人的抵抗力系數(shù)小于2,那么這個(gè)人就被感染了。
參數(shù)調(diào)整:
可以自定義數(shù)組的長(zhǎng)寬來(lái)設(shè)定人群的數(shù)量
可以通過(guò)調(diào)整元素內(nèi)部的隨機(jī)整數(shù)范圍來(lái)調(diào)整人均抵抗力分布范圍
可以通過(guò)調(diào)整感染半徑r來(lái)表示病毒的傳播能力,或者人與人之間采防護(hù)措施的程度。
可以通過(guò)調(diào)整人群運(yùn)動(dòng)的執(zhí)行次數(shù)n來(lái)表示人群活動(dòng)能力。
制作背景
大以上學(xué)期期末,想到一種模擬病毒傳播的模型,想到就開(kāi)始動(dòng)手做了。
源代碼