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

Queue是非常重要的元件,雖然他的設定很簡單。但是,放對地方上天堂,放錯地方住套房。這部份是經驗談,需案例說明才能體會。
Queue就是用來代表真實世界中關於排隊等候的情境。排隊等候的情境有等候線,等候區的概念,但就Queue來說,其實沒有差異。主要是在畫Layout時,設計對應方法不同而已。這邊設定純粹只有兩個目的,一個是capacity,一個是Queuing Policy。不過,在實務應用時,往往會利用他「排隊」特性,將流竄Entity彙整起來。這是有實作經驗後才發現的問題,尤其是經由判斷Entity迴轉等處理情境時,此Entity並不如你以為的順序進行中。透過Queue,可避免這個問題。
Queue除了有Inbound與Outbound Port之外,又多了兩個Outbound port,分別是outPreempted與outTimeout。不過,Entity會從這兩個Port出去的前提是,有兩個屬性Enable preemption與Enable exit on timeout要勾選起來。

配對元件

  無。其實,他應該是跟每個元件都能配對。

屬性

Queue的屬性很單純。
  1. Capacity代表這個Queue最大的容量。這塊有麻煩。模型建立之初,當然不會正確。可能後面的元件出了問題,就會在Queue卡住而無法釋出。這時候,超過Queue所設定的Capacity時,元件不是自動消失,而是給你當機出現錯誤。
  2. 設定這個Queue為無限大容量。如前項所言,為了避免麻煩,模型建立之初,都會先勾選起來。另外,拿來當作彙整Entity的Queue當然也要勾選起來。
  3. 這是定義Entity來到這個Queue時,要用什麼方式呈現。這就會有所謂等候線與等候區的差異了。
  4. 定義這個Queue的排隊政策。有FIFO、Priority-based、Agent comparison與LIFO。FIFO與LIFO比較熟悉,不多說。Priority-based是根據Entity的某個屬性越大者越優先。也就是說,當一個新進Entity設定用來比較屬性大於所有在Queue中Entity的話,他就會優先離開QUeue。注意,日期是越舊越小。若Queue設定是老人家先行,這時候日期要想辦法轉換成越舊越大。至於Agent comparison,是將新進的Enity與指定的Agent進行比較(比較用程式),所得為True時,就把新進者放在此Entity的前面。所謂前面就是靠近Outbound的位置。
  5. 勾選起來時,則要設定Timeout的時間。當新進Entity等候超過這個時間時,就會從outTimeout的Outbound Port出去。這個Entity後續要如何處理,就看情境如何設計。
  6. 勾選起來時,這時候就要配合Queue排隊政策中,Priority-based或Agent comparison。也就是說,比輸的就會從outPreempted出去。
  7. 這個是配合布置圖使用。也就是說,有勾選時,Entity配合此Queue的佈置模式而移動結束後,Entity會回到當初要進入這個Queue時的位置。
  8. 強迫此Queue自動收集統計資料。統計資料的部分必須另一系列文章說明之,
  9. 顯示Queue所支援的事件。程式就是寫在這裡面。

事件

  • On enter [code]:Entity進到Queue時。 
  • On at exit [code]:Entity準備要離開時。
  • On exit [code]:Entity正要離開時。
  • On exit (preempted) [code]:Entity由outPreempted port 離開時。
  • On exit (timeout) [code]:Entity由outTimeout port離開時。
  • On remove [code]:Entity被用程式的方式,強迫離開Queue時。

變數

StatisticsContinuous statsSize:提供統計資料。

方法

  • int size() - 目前在Queue中Entity的數量。不是Capacity喔。
  • boolean canEnter() - 新Entity是否可以進入Queue中。 
  • T get(int index) - 依據足標取出agent。
  • T getLast() - 取出最後一個Entity,若Queue為空,則傳回null。
  • T getFirst() - 取出第一個Entity。 若Queue為空,則傳回null。
  • T removeFirst() - 移除第一個Entity。
  • T remove(Agent agent) - 指定Entity進行移出。
  • T remove(int index) - 指定位置移除Entity。
  • boolean release(T agent) - 指定Entity進行釋出。
  • void sortAgents() - 將Queue中的Entity進行排序。不過,FIFO與LIFO不會有動作。若是Agent comparison則會兩兩比較。若為Priority-based 則會重新計算誰的Priority最高。
  • void resetStats() - 將統計資料重設規零。
  • Iterator<T> iterator() - 逐一取得在Queue中的每一個Entity。足標是從0開始。

留言

這個網誌中的熱門文章

等候理論

AnyLogic簡單介紹

機率分配 - Part 6 Poisson