元件詳解:離散事件 - 流程模型 - Delay

需要讓Entity停留一段時間的請境,都可以用這個元件來處理。
這個元件的核心在時間。所有可以產生數字的方式都可以拿來套用。當然,最常用的還是隨機變數。
有Inbound與Outbound Port,這部份應該沒有什麼問題了。一進一出,乾淨俐落。

配對元件

  無

類似元件


  •  Service。這個元件是把Queue與Delay合併在一起處理,再加上資源應用的部分。
  •  Hold。這個元件也會把Entity暫留住。只是這個元件比較像是關口閘道。可設定開跟關。關時,所有元件都過不去。開時,所有元件都過去。

屬性

Delay的屬性也很單純。
  1. 設定「設定時間」的方式。一個是給定特定的時間,一個是在別的地方(可能是另一個元件,流程、函數,反正是可以寫程式的地方)呼叫這個元件的stopDelay(),就會直接放行Entity。
  2. 若勾選Specified time時,就要給定Delay時間長度。
  3. 設定這個Delay可以同時處理幾個Entity。在ATM範例中,一台在同一時間只能服務一個客人。但是,有些服務櫃台,他會同時放兩隻椅子,讓同一位服務人員,在同一時間內,可以服務兩個客人。
  4. 若勾選這個,表示Queue送來幾個Entity都可一塊處理。
  5. 一般而言,模擬都是走拉是(Pulling),也就是說,後面的元件有空閒了。專業的說法是其Inbound port為可得狀態時,在前面元件裡的Entity就順理成章的進到下一個元件去。這邊補充一下Queue篇中所提到的問題。若這個Delay前面是Queue,當然順理成章是沒有問題,Entity都會乖乖地照順序進入Delay。但是,若前面是判斷式類的元件,就不一定了。有時候程式沒寫好的話,還會造成系統當機。我吃過很多次虧。

事件


On enter [code]Local variables: 
                         agent - the agent 
                 double delayTime - the delay time for the agent (already evaluated)
On at exit [code]Local variable: 
                          agent - the agent
On exit [code]Local variable: 
                       agent - the agent
On remove [code]Local variable: 
                            agent - the agent

變數

StatisticsContinuous statsUtilization:需專篇說明。

方法

  • void suspend(double dt) - 設定暫停時間。
  • void suspend() - 設定暫停,也就是把Outbound給關起來。這個是讓Delay這個元件,不再接收新的Entity,即使Capacity還沒有滿。需要呼叫resume()函數,才能接收新Entity,已完成Delay時間的Entity才可以離開。
  • void resume() - 打開Outbooud。
  • Agent resume(Agent agent) - 只給特定的Entity通過Outbound。呼叫這個函數,Delay必須在suspend狀態。
  • Agent suspend (Agent agent) - 只給特定的Entity處以Suspend的固定時間。
  • boolean isSuspended() - 回傳目前Delay是否在Suspend狀態。
  • double getRemainingTime(agent) - 回傳特定Entity目前仍需要多久才能到Outbound。注意,回傳0,並不代表此Entity可以離開Delay,若處在Suspend狀態,就不能出去。
  • double getDelayTime(agent) - 傳回特定Entity原始被設定在這個Ddelay會停留多久的時間。
  • double getElapsedTime(Agent agent ) - 回傳特定Entity已經Delay多久了。注意,這個時間有可能會大於getDelayTime()所取得之時間。因為出不去。
  • void stopDelay(Agent agent) - 對特定Entity不在執行Delay。若沒有指定Entity,則所有Entity都會離開Delay元件。
  • void stopDelayForAll() - 對所有在Delay元件中的Entity停止暫留。
  • void extendDelay(Agent agent, double dt) - 針對特定的Entity,延長暫留dt時間。
  • int size() - 回傳此Delay已經處理過幾個Entity。
  • T remove(Agent agent) - 將特定的Entity從Delay中移除並且回傳。
  • T get(int i) - 回傳在Delay中特定位置之Entity。用方法會很慢。
  • resetStats() - 重設統計數據資料。
  • Iterator<Agent> iterator() - 取得目前在Delay中所有Entity的List。

留言

這個網誌中的熱門文章

等候理論

AnyLogic簡單介紹

機率分配 - Part 6 Poisson