Select Output模塊(和其他一些模塊)有一個特殊功能,有時甚至會讓高級用戶感到困惑。如果您使用過流程建模庫或行人庫,那可能您已經遇到過,或者將要遇到類似問題。
希望能夠通過這篇文章能幫助您在將來發現并解決這類問題。
?
?
假設我們有一個模型,行人從A點移動到B點,之后,需要從select output的5個輸出中選擇1個,然后退出。我們希望行人在5種可能的出口中隨機選擇。
在出口選擇上,我們從隨機分布中采樣,并將所選的出口編號保存到自定義行人智能體中的變量exitNumber中。
?
當行人到達SelectOutput時,它將根據變量的值選擇出口。我們還將跟蹤行人的exitNumber變量,以再次檢查他們存儲的數字是否與他們選擇的出口匹配。
?
按照上面的設計,我們預計,當行人離開GoTo模塊時,它會對一個出口編號進行采樣,然后在select output模塊,它會根據采樣的出口編號離開。
但是在運行模型時,意外發生了!
所有行人從第一個出口出來!
注意:當智能體到達Select Output模塊時,我們正在向控制臺打印出口編號,我們可以看到每個智能體都有一個隨機分配的出口編號。
?
也就是說每個出口都會被正常取樣,那為什么所有行人都會從1號出口通過?
也許有點違反直覺,但AnyLogic首先會檢查行人將去哪里——從SelectOutput模塊中選擇一個輸出——然后才觸發GoTo塊的離開時代碼。之所以如此,實際上是有道理的,因為如果行人還沒有確定要去哪里,甚至可以去任何地方,那么他們怎么才能從GoTo模塊出來呢?如果在SelectOutput后有Hold模塊又該怎么辦?
簡而言之,當檢查下一步要去哪里時,智能體還沒有定義他的出口,并且在沒有決定使用哪個SelectOutput模塊的出口前,會保留一個整數的默認值,即0。
?
總結了幾種選擇:
這可以在GoTo模塊的進入時代碼上完成,甚至可以在創建行人時完成。這完全取決于選擇出口背后的特定邏輯。
?
這可能是其中最合乎邏輯的地方,但同樣取決于您的特定模型和條件。
?
雖然并非在所有模塊中都可用,但大多數流程建模庫模塊都有一個選項,可以在智能體即將退出但尚未退出模塊時執行代碼
?
在Select Output模塊的前方放置一個延遲時間為0的Delay模塊。
這種方式不是首選選項,因為它在流程流中添加了一個不必要的塊。
?
請看下面的示例模型:
/uploads/editor/20220812/d18c7fa578dd716a3c7bece9f51346d4.zip
?
或者在此處規劃并下載AnyLogic云上的模型
在Stack Overflow上有用戶也遇到相同的問題,這里有一個鏈接,可以查看更多類似問題
?
必須記?。?/b>
如果您有一個select output模塊(或其變體),則 “智能體將選擇哪個出口?”,將在執行離開時代碼之前進行評估
按時間順序,模型執行過程如下:
1.?智能體進入模塊(在我們的示例中就是GoTo模塊),并觸發“進入時”的代碼
2.?執行特定于模塊的操作后,下一個模塊是Select Output,因此智能體會計算下一步要去哪里(在我們的示例中,它計算了exit number變量)
3.?智能體執行“離開時”的代碼(在我們的示例中,它對出口編號進行了采樣)
這種細微差別導致的問題,在經過經過數小時的調試后,甚至會讓我們懷疑自己的頭腦,但是現在你就會知道問題在哪了;)
![]() |
電話:010-62964229 | |
![]() |
郵箱:support@carila.cn | |
![]() |
地址:北京市海淀區上地信息產業基地三街3號樓1門4層401 |