• 沒有找到結果。

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

相關文件