2009-04-13 71 views
2

我一直在試圖實現一個服務器隊列。我已經將Norm Matloff的Simpy教程的pseudocode改編爲Python,代碼是here。現在我正在努力尋找某種方式來計算工作/客戶的平均等待時間。離散事件隊列模擬

在這一點上,我的大腦已將自己束縛在一個結中!任何指針,想法,提示或僞代碼將不勝感激。

+0

問題中的僞代碼和代碼內容不再可訪問。 – dim 2015-12-15 15:56:22

回答

5

您應該知道每個客戶何時抵達隊列。當他們到達服務器時,您應該爲服務的客戶數量添加一個,並累計他等待的時間。在模擬結束時,您只需將累計時間除以客戶數量即可,而您對該工作/客戶有一段平均等待時間。

核心問題是根據這些事件來計算不同事件和更新統計數據。

你的模擬應初始化所有的模擬結構進入一個合理的狀態:

  • 初始化客戶的隊列中沒有人在它
  • 初始化爲服務過的客戶的任何數量0
  • 初始化任何累計等待時間爲0
  • 將當前系統時間初始化爲0
  • 等等

一旦所有系統都被初始化,您就創建一個cusotmer到達的事件。這通常由某個給定的分配決定。生成系統事件將需要更新系統的統計信息。您可以選擇產生所有工作/客戶到達時間。每個客戶的服務時間也是您從特定分銷中產生的。

您必須處理每個事件並相應地更新統計信息。例如,當第一位顧客到達時,從模擬開始到當前時間,隊列已空。隊列中的平均客戶數量可能是一個感興趣的參數。您應該累積0 *經過的秒數到累加器中。一旦客戶到達空隊列,您應該生成服務時間。下一位客戶將在給定工作完成之前或之後到達。如果下一個客戶在前一個客戶服務之前到達,那麼你將他添加到隊列中(積累了沒有人等待的事實)。根據接下來發生的事件,您必須累積在該時間間隔內發生的統計。服務器的空閒時間也是這種模擬中感興趣的參數。

爲了使事情更清楚,考慮一下事實是,有18個人在線,並且服務器已經完成了第一個客戶的工作。第18位顧客到達和第一位工作完成的時間之間的間隔是加到累加器上的加權平均值。例如,已有18人排隊4秒。

服務器尚未閒置,因此您應該從隊列中取出條目並開始處理下一個作業。這項工作需要花費一定的時間,通常是從一些分配中定義的。如果下一位客戶在當前工作完成之前到達,事實上有17個人將被添加到您的加權值。

同樣你正在積累在您的系統相關的事件之間的統計基礎的層面:

while (current_time < total_simulation_time) 
     handle_next_event 
     generate_subsequent_events 
     accumulate_statistics 
     update_current_time 
endwhile 

Display "Average wait time: " accumulated_wait_time/number_of_customers_served 

希望幫助似乎有點冗長。

+0

謝謝你的精彩解釋。雖然我思考 - 我理解模擬背後的理論和思想,但實現起來卻非常困難。我發現很難將所有細節都留在我的腦海中,並以一種有用的方式將它們組合在一起。再次感謝:-) – vinc456 2009-04-13 02:22:10