3.1 接觸網路模型
3.1.4 接觸網路的參數設定與實作
MaxIntraCellContact 整數 一個人在一天當中在 一個接觸場所內最多 和他人接觸多少次
20
(憑經驗設定)
DistOfContactNum 機率分布 每人每日隨機接觸的
次數之機率分布
交通流量的資料我們採用的是交通部運輸研究所,在 “第三期台灣地區 整體運輸系統規劃:整體運輸系統供需預測與分析”中,對 89 年各縣市 間每日交通所做的預測結果[45]。(交通流量矩陣請見附錄 A.1)
人口數則採用內政部統計處之 90 年度各縣市人口數[41]。(請見附錄 A.2)
分身點及接觸數
對於每人的分身點個數的機率分布,由於目前仍然沒有相關社會學上的調查 研究,因此我們參考 Huang 等人的作法,設定其範圍在 1~4 之間,並假設其呈 現一常態分布。而每人每天的隨機接觸次數也是假設其值是介於 2~6 之間的常態 分布。
接觸場所人數
各縣市內接觸場所的人數設定為 1~50 人之間,其機率分布參考 1. 各縣市戶內人數分布情形[40]
2. 各縣市工作場所人數分布情形[39]
3. 各縣市班級內學生數分布情形[42]
雖然現實中的接觸場所並不只有這三種,但因為這三種接觸場所因為在數量上較 多,所以我們假設由這三種資料所推得的分布情形是具有代表性的。
首先我們將上述 3 項資料,介於 1~50 人的部分取出,並將三者作疊加,再 將疊加後的結果除以場所的總數作正規化,即可得到接觸場所人數的機率分布。
0%
5%
10%
15%
20%
25%
30%
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49
人 圖 10 台北市接觸場所人數分布
(圖 10)是透過上面的計算方式得到的台北市的接觸場所人數分布,由圖中我們 可以發現,大部分的接觸場所人數都在 10 人以下,而人數較多的接觸場所(例如 教室、大型公司)所佔的比例其實很低。
二維晶格的大小
由於下面的等式:
區域內分身點總數
= 場所總數*每個接觸場所的平均人數
= 每個人的平均分身點數*總人數
因此,區域內接觸場所的總數可以透過以下方式來推算:
接觸場所總數 =
每個人的平均分身點數 * 區域內的總人數 每個接觸場所內的平均人數
其中,每個接觸場所內的平均人數即是 “接觸場所人數分布"的期望值。
由於我們對於每一個區域都是使用正方形的二維晶格來代表,因此我們可以用下
面的式子推得晶格的寬度:
⎥⎥
⎢ ⎤
⎢
= ⎡
接觸場所總數 晶格寬度
接觸網路的建構
在我們的模擬系統中,整個接觸網路的建構是初始化的時候完成的,以下將 以(圖 11)來介紹整個初始化的過程:
初始化開始
讀入系統參數
讀入的參數包括接觸網路、疾病、公衛政策等 參數
人群初始化
1) 依照交通流量矩陣 ODmatrix [ ] [ ] 決定一個地區 中,那些人擁有那些地區的跨區分身點,以設定 每一個分身點的所在區域。
2) 依照 DistOfMI 來設定每個人的分身點數
晶格初始化
1) 依照 3.1.4 的公式來設定每一個二維晶格的大小 2) 依照 DistOfCellSize [ ] 來設定晶格中每一個方
格所含的分身點數
分配分身點
1) 分配分身點至住家
2) 分配分身點至其他接觸場所
初始化結束
圖 11 系統初始化流程
依交通矩陣設定分身點的所在區域
For Row = 1 to NumCities Do
StartNum = 0
People = PeopleOfCity(Row)
// set the LatticeNum of those people with InterArea MirrorIdentity For Col = 1 to NumCities
Do
For i = StartNum to ODmatrix[Row][Col]
Do
// everybody has at most 1 InterArea MirrorIdentity People[i].lastMirrorIdentity.LatticeNum = Col People[i].otherMirrorIdentities.LatticeNum = Row Done
StartNum = StartNum + ODmatrix[Row][Col]
Done
// set the LatticeNum of the rest people Loop
People[StartNum].allMirrorIdentities.LatticeNum = Row StartNum = StartNum + 1
Until StartNum == PopulationSize[Row]
Done
// a.CellSize is the number of MirrorIdentities in cell a // 1) distribute people to Home
For each Lattice L in Taiwan Do
Loop
Cell = random-select-one-cell-from(L) Until Cell.CellSize < 10
For i = 1 to Cell.CellSize Do
Loop
Person = random-select-one-person-from(L) Until Person.Home == false
Person.Home = true
Person.MirrorIdentity[0].distribute-to(Cell) Done
Until everybody in Lattice L has a home Done
// 2) distribute people to other places For each person P in Taiwan
Do
For each undistributed MirrorIdentity M of person P
Do Loop
Cell = random-select-one-cell-from(M.LatticeNum) Until Cell is not full
M.distribute-to(Cell) Done
For each people P in Taiwan Do
For each MirrorIdentity M of person P Do
// a.CellSize is the number of MirrorIdentities in cell a // CellSizeOf(x) return the CellSize of the cell in x // MaxIntraCellContact's default value is 20
// 1) IntraCell Contact
Times = Min(MaxIntraCellContact, CellSizeOf(M.location)) For i = 1 To Times
Do
Candidate = random-select-one-person-from(M.location) contact-with(Candidate)
Done
// 2) InterCell Contact For i = 1 To P.NumOfContacts Do
CandidateCell = random-select-one-cell-from(NeighborOf(M.location)) Candidate = random-select-one-person-from(M.location)
contact-with(Candidate) Done
Done Done