2010-02-27 59 views
3

我試圖執行SIR epidemic model。基本上,我理解模型的方式是,在每個時間步,它告訴我們有多少節點被感染,有多少節點被恢復。我現在試圖將其轉換爲離散事件模擬,並且在一點上感到困惑。將數學問題轉換爲離散事件模擬

該模型通常使用歐拉方法求解。現在,當我將它轉換成離散事件仿真,我做這樣的事情(數字是用於清晰度):

Initialize 100 members 
At every time step t, 
    //Determine how many get infected 
    for i = 1 to 100 
    let i pass a message to its neighbors 
    When the neighbor receives the message from an infected member, it generates a random number and if it is less than beta*(infected/total), where beta is the infection rate, then the member gets infected 
    Update the count for infected, recovered, susceptible 

    //Determine how many are recovered 
    for i = 1 to 100 
     Generate a random number from a uniform distribution and check if it is less than gamma*infected. If it is, then this member is recovered. 
     Update the count for infected, recovered, susceptible 

我基本上想,如果上面的方法是正確的。有什麼建議麼?

+0

我知道這已經很晚了,但是有沒有不使用Gillespie算法的原因?你正在使用的不是離散事件相當於ODE公式(至少我認爲)。 http://en.wikipedia.org/wiki/Gillespie_algorithm – MHH 2014-05-15 20:40:40

回答

4

作爲一個開始看起來相當不錯,除了第一個循環,你需要記住只有敏感的個體會感染,而第二個,只有感染的個體才能恢復。我也相信每個事件的過渡概率(感染鄰居的易感接收消息,感染可能恢復)是而不是是受感染個體的當前數量的函數 - 它們是常量(我認爲你誤導了「質量效應「概率適用於每個時段的每個單獨的節目 - 他們不)。

微妙的有點是你如何(從SIR模型並不明顯我)做的第一環:我覺得你要確定所有「消息」 第一然後哪些導致轉換容易 - >感染 - 即兩個循環而非一個循環 - 因爲此時步驟感染的個體不能在同一時間步中感染其他人,但僅在將來;此外,感染過渡 - >恢復是不可能的,因爲在這個時間步驟感染的人是不可能的,所以你不得不安排你的循環。

考慮每個人有兩個「國家」造型屬性:

-- nummsgs, number of "messages" received this time step 
-- compartment (susceptible, infected or recovered) 

以及一組固定的鄰居。然後:

for each individual: 
    if individual.compartment != infected: 
     continue 
    for each neighbor of the individual: 
     neighbor.nummsgs += 1 
    if (random number says so): 
     individual.compartment = recovered 

for each individual: 
    if individual.compartment != susceptible: 
     continue 
    maybe (depending on random number & nummsgs): 
     individual.compartment = infected 

for each individual: 
    individual.nummsgs = 0 

這似乎更好地捕捉整體流程(收集和記錄總數量,你可以做概念作爲最後一個循環的一部分後的淨額)。

+0

謝謝你的解釋。我會稍微考慮一下,並儘快回覆修訂。編輯:剛纔看到你的修改後的帖子。現在就看看這個......非常感謝...... – Legend 2010-02-27 03:08:48

2

我在這裏看到至少有兩個問題,都源於相同的根本原因。

1)如果你引入某種鄰域結構,那麼beta*(infected/total)應該只是beta

2)具有gamma*infected蘋果只有感染個人的行,而且你不需要gamma*infected - 它應該只是gamma

也許還有更多的問題 - 這很難從僞代碼中說出來。歡迎您細化一下,我會再看一次。

+0

謝謝......我會盡快回復修改後的版本。我希望stackoverflow有一種方法來ping成員:)再次感謝。 – Legend 2010-02-27 03:09:16

+0

@傳奇:Ping! (只是一個測試)。 – 2010-02-27 04:38:10

+0

@Moron:大聲笑..我不知道你爲什麼試圖對我:P在任何情況下,猜你的ping工作..! – Legend 2010-02-27 19:37:45

2

首先,這種方法通常不稱爲離散事件模擬,而是時間步模擬。嚴格來說,這並不正確,但實際上,「離散事件」術語用於事件之間的時間可變的模擬。例如,如果每個受感染節點在隨機時間內生成一次「感染」消息給隨機鄰居。

其次,您的代碼會漏掉消息的優先級或權重。如果節點接收到感染和恢復消息,該怎麼辦?感染的blob中間的孤立節點和節點的恢復概率是否應該相同?這會導致感染者和健康人之間的內部節點抖動。

其實,我在這裏沒有看到使用消息的理由。每個節點的感染概率只是感染鄰居數量的一個函數 - 爲什麼不使用它?根據你的目標,用數學期望代替概率可能會更好。

最後,問題與着名的「生命遊戲」密切相關。看看各種實現。