本文分享了由Jaco-Ben Vosloo編寫的關于AnyLogic的使用實踐技巧,希望能為正在學習或使用AnyLogic的用戶提供幫助。
原文:https://www.theanylogicmodeler.com/post/how-to-programmatically-redraw-a-charthttps://www.https://www.theanylogicmodeler.com/post/how-to-programmatically-redraw-a-chart
作者:Jaco-Ben Vosloo
更新:2022,Feb 15
閱讀時間:4 min read
您是否曾經遇到過這樣的情況:在 AnyLogic 中創建了一個圖表,但在仿真過程中想更改圖表的一個非動態設置?
例如,在時序圖中,您想要更改時間窗口(或 x 軸的長度)以顯示更多或更少的數據。 如果您想隨時間顯示一個變量,但您不知道時間是多少,這是個很典型的情況,例如:項目的持續時間、智能體的生命周期、智能體走過的距離等。
或者您想在運行時更改圖表Y 軸的最大值?如果您有多個圖表,并且希望它們都具有相同的最大 Y 軸,以便您可以輕松地直觀地比較圖表。
所有這些都是在設計時設置的,在仿真運行期間無法更改。 因此,您在設計期間所做的選擇都被限制住了......
您有這樣的經歷嗎?
我們以下面的模型為例進行詳細說明。
我們有一個4名IT工程師組成的工作組,負責在新IT平臺的實施項目中處理支持案例。一個項目要支持的案例數可能是1-100中的任何值,通常用戶每天報告大約1個案例。我們想要測量積壓支持案例的平均值。
這是一個超級簡單的模型!
最后,我們需要一個時間圖來顯示 queueLength 數據……但是我們將時間窗口設置為什么?
100?—— 但是如果模型需要更長的時間來完成...
200?—— 但是如果只有 10 個支持案例怎么辦……那么圖表將 95% 為空白并且沒有那么有用……
我們先選擇 100 ,運行幾次模型并查看圖表。
效果還不錯……但在第一張圖表中,模型在第 110 天結束,所以我們丟失了 10 天的初始數據,無法在圖表上查看……在第三張圖表中,模型在10 天之前結束, 因此需要擴展數據詳細地查看一下……
下面我們要用到的解決方法,在 AnyLogic 中的許多其他實例也可以使用。讓我們到幕后,看看 AnyLogic 在后臺為我們做了什么。
在您構建模型、機械地拖放時,AnyLogic 正在秘密地努力在后臺創建 Java 程序。
想要您一睹究竟,您只需單擊繪圖中的輸入字段并按 Ctrl+j(對于 Windows)和 Cmd+j(在 Mac 上)即可查看對象背后的代碼。
現在,我們需要做的就是將代碼復制到函數中,添加一兩個東西,然后我們就可以完全控制我們的圖表了!
Step 1: 創建一個函數——并粘貼您從后臺獲取的代碼——您可能需要對其進行一些格式化......
Step 2: 將看到時間窗口輸入的新 TimePlot() 函數的參數更改為 roundToInt(time()) 以確保它始終顯示為最新的模型時間。
Step 3: 每次智能體進入sink時調用該函數
Step 4: 運行模型
如果沒有任何變化...
Step 5: 添加presentation.add(plot); 到函數末尾
然后,運行模型,發現現在繪制的圖與模型運行的天數一樣多了...
Step 6: 將創建的圖保存到外部變量中,并在每次繪制新圖之前將其刪除。 請參閱下面代碼中的第一行和最后一行。
完成!
這個例子可能很簡單,但這里有兩個關鍵要點:
1.在AnyLogic后臺您可以看到為您生成的邏輯代碼,并將其用于您的功能(使用代碼繪制圖表只是眾多用例中的一個)
2.通過重新繪制圖表,可以克服靜態參數對圖表的任何限制
您可以下載示例模型,或者在云中查看和下載源代碼