元件詳解:離散事件 - 流程模型 - Delay
需要讓Entity停留一段時間的請境,都可以用這個元件來處理。
這個元件的核心在時間。所有可以產生數字的方式都可以拿來套用。當然,最常用的還是隨機變數。
有Inbound與Outbound Port,這部份應該沒有什麼問題了。一進一出,乾淨俐落。
這個元件的核心在時間。所有可以產生數字的方式都可以拿來套用。當然,最常用的還是隨機變數。
有Inbound與Outbound Port,這部份應該沒有什麼問題了。一進一出,乾淨俐落。
配對元件
無類似元件
- Service。這個元件是把Queue與Delay合併在一起處理,再加上資源應用的部分。
- Hold。這個元件也會把Entity暫留住。只是這個元件比較像是關口閘道。可設定開跟關。關時,所有元件都過不去。開時,所有元件都過去。
屬性
Delay的屬性也很單純。- 設定「設定時間」的方式。一個是給定特定的時間,一個是在別的地方(可能是另一個元件,流程、函數,反正是可以寫程式的地方)呼叫這個元件的stopDelay(),就會直接放行Entity。
- 若勾選Specified time時,就要給定Delay時間長度。
- 設定這個Delay可以同時處理幾個Entity。在ATM範例中,一台在同一時間只能服務一個客人。但是,有些服務櫃台,他會同時放兩隻椅子,讓同一位服務人員,在同一時間內,可以服務兩個客人。
- 若勾選這個,表示Queue送來幾個Entity都可一塊處理。
- 一般而言,模擬都是走拉是(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。
留言
張貼留言