本文分享了由Vitor Lemos編寫的關于AnyLogic的使用實踐技巧,希望能為正在學習或使用AnyLogic的用戶提供幫助。post/the-simulation-model-life-cycle-part-3-building-the-model
作者:Jaco-Ben Vosloo
更新:Jan 11, 2022
閱讀時間:6 min
本系列文旨在從頭到尾,對仿真項目的生命周期進行說明,并給出一些最佳實踐和實用建議。
這篇文章是關于仿真模型生命周期的 7 部分系列文章的第 3 部分。 你可以查看以前的文章。
注意:在后面的步驟中確實會“返回”前面的步驟中執行一些活動,但不需要重做整個步驟。 上面列出的步驟是典型項目遵循的一般步驟。 在所有步驟中,您都可以后退并重新訪問之前的步驟,但在完成至少 80%-90% 的步驟之前,您不太可能跳過一個步驟或向前移動。
“模型構建很少有正確的答案。
你只需要開始做一些事情,反過來,這會揭示“下一個障礙”,
然后需要重新審視/重做/深入挖掘”
—— Prof Johan Joubert
模型構建通常是項目中最耗費精力的部分,但對于大多數模型構建者來說,這也是最有趣的部分。在這里,你需要做很多工作,深入到這個過程中,讓事情在電腦屏幕上動起來(我個人最喜歡這部分!)。換句話說,要想在這一步中取得成功,有很多事情需要考慮。在這篇文章中,我只將介紹所有建模人員在構建時需要記住的一些內容:
我們依然以零售商為例,從本文開始,會構建只有一個源、一個隊列、一個延遲和一個接收器的模型,然后以此為基礎展開。會用更復雜的結構替換隊列和延遲,然后添加額外的數據對象、函數、變量等。。。。
這是一個非常簡單的示例,因為我們只有一個流程。但如果您要建模一個包含許多流程的復雜環境,那最好也是從一個簡單的開始,好處就是,雖然是在非常高的抽象級別上,但這依然是從一開始就建模了整個系統。
您是否注意到上圖中屏幕底部的命名為animation的小智能體?
之所以將動畫和邏輯完全分離,這背后有兩方面的原因:
在模型運行時,AnyLogic必須執行所在智能體上所需的所有計算,智能體上存在的所有動畫也包括在內。許多建模者認為只有對用戶可見的對象才會被計算或繪制,但由于對象的動態特性,AnyLogic 首先需要進行所需的計算以確定什么是可見的。要對此進行測試,請使用動畫密集型模型,然后簡單地導航到其中沒有任何內容的空白智能體,然后查看執行速度如何提高。
要在單獨的智能體中設置動畫,您只需將所有非邏輯組件移動到其他智能體,將這些智能體放置在您需要它們的地方,也許是某個中心位置,也許靠近邏輯。
請參閱下面的示例。
在構建模型時,我總是遵循以下框架:
添加功能 -> 測試功能 -> 集成測試 -> 測試以前的功能
這基本上意味著,如果您想向模型中添加任何功能,您需要測試此功能,測試它是否與其他功能一起使用,然后重新運行之前的所有測試。
有時,我甚至會先創建測試,確認沒有得到預期的結果,然后繼續改進該功能,直到得到預期的結果。通常,每個功能都會一個以上的測試,因為我會設置該功能的各種參數選項,以及將該功能與其他功能的測試(集成測試)。
然后,一旦我確認該功能符合我的預期,我需要檢查是否破壞了以前工作的任何其他功能。。。會通過測試前面的所有功能來實現這一點!而且以前的一些測試往往會失敗。。。我要么需要對我的新功能進行調整以防止破壞其他功能,要么需要升級現有的這些功能以應對新功能。
由于測試可能非常耗時,這可能是大多數項目中忽略測試的原因,因此可以實施下面幾個最佳操作,以確保其值得投資:
讓我們看一下如何使用本系列前幾篇文章中的示例模型在 AnyLogic 中執行此操作的示例。
警告:在面對高級的建模技術時,您可以是用普通的實驗實現類似但效率較低的目標。
Step 1 :創建自定義實驗
通過使用其中一個更高級的功能和少量代碼,您可以設置一個可以在沒有任何動畫的情況下盡可能快地運行的實驗,您可以從任何地方調用它,甚至讓它在單獨的線程中運行。 (更多相關內容期待未來的帖子......)
Step 2 :創建測試
由于我們遵循最佳操作來創建數據對象以數據驅動我們的模型,因此我們可以非常輕松地創建一個新的場景對象,將其傳遞給我們的自定義實驗,然后將其提供給模型并運行它。
在此示例中,我在按鈕內設置了實驗,但對于大型模型,您可能希望使用 Java 類來創建場景,然后自動按順序或并行運行所有場景。
This is great!因為我們所有的測試現在都有很好的文檔記錄和存儲,隨時可以使用。 如果我們在更改模型邏輯時,影響我們的測試或場景的某些內容,編譯器會通知我們,我們可以立即修復它。 然而,如果您使用 Excel 工作表進行測試,您將永遠不會知道它們已經無效了,直到您再次運行它們......
“測試是記錄模型特性和功能的好方法”
—— Vitor Lemos
專業提示:一個接一個地運行多個測試
您知道您可以使用自定義實驗來運行幾乎任何您想要的東西嗎?
運行所有單元測試怎么樣——在實驗內部設置或從您設置它們的一些 Java 類中檢索。 然后,您可以使用 AnyLogic 中的播放按鈕非常輕松地運行它們。 請參閱下面的示例
我知道這篇文章遠遠超出了基礎知識,有些概念對于初學者來說可能太多了,但我的建議是嘗試實現有意義的部分并調查那些沒有意義的部分。 如果您無法弄清楚,請構建一個小型模型并將您的問題發布到 Stack Overflow,有很多專家,包括我自己 ;-),他們隨時準備提供幫助。