本文分享了由Vitor Lemos編寫的關于AnyLogic的使用實踐技巧,希望能為正在學習或使用AnyLogic的用戶提供幫助。post/the-simulation-model-life-cycle-part-4-verification-and-validation
作者:Jaco-Ben Vosloo
更新:Feb 22, 2022
閱讀時間:7 min
本系列文旨在從頭到尾,對仿真項目的生命周期進行說明,并給出一些最佳實踐和實用建議。
這篇文章是關于仿真模型生命周期的 7 部分系列文章的第 4 部分。 你可以點擊查看以前的文章。
注意:在后面的步驟中可能會“返回”前面的步驟中執行一些活動,但并不需要重做整個步驟。 上面列出的步驟是典型項目遵循的一般步驟。在所有步驟中,您都可以后退并重新訪問之前的步驟,但在完成至少 80%-90% 的步驟之前,您不太可能跳過一個步驟或向前移動。
首先有一件事情要做——就是對兩個術語的定義達成一致,因為有時這些詞會帶來很多不必要的麻煩。
這應該包括檢查模型設計和架構的質量,以及代碼的結構。 這可以通過測試、檢查、設計分析等來完成,通常應該先由建模人員完成,然后由其他人完成,這個其他人可以是另一個團隊成員,甚至是外部人員。
最基本的校核形式是使用單元測試,但您也可以使用動畫來直觀地校核模型是否在做它應該做的事情。目視檢查的問題在于它不是自動化的,或者是在沒有相關知識的人 “觀看”仿真的情況下運行。我們在上一篇文章中介紹了單元測試。其中一個關鍵部分是通過對數據進行一些匯總分析來審查模型的輸出數據。 這不僅可以校核您是否正在記錄模型范圍中定義的所需結果,還可以檢查您是否正確記錄了它們,最后,它還在某種程度上校核了模型邏輯。
校核相對客觀,是非分明。 您的模型通過或未通過單元測試。 它要么正確記錄和計算指標或關鍵績效指標,要么不正確。 它要么做它應該做的,要么沒做到。 對于校核,只有100%是可以接受的。
所以在校核里,你要確保無論你在做什么,你都做對了!這非常重要!任何值得做的事情都值得正確地去做,否則你就是在浪費你的時間,也在浪費所有相關人員的時間。
這一步是我們檢查模型輸出是否匹配的,確定仿真模型代表實際系統的正確性程度,如果情況允許,要檢查歷史和預期結果。典型的做法是通過使用包含非常低級的詳細數據來檢查模型的內部邏輯,以及通過高級匯總數據來驗證總體預期結果。
團隊中的每個人都必須知道,驗證階段是非常主觀的。您不能也永遠不會 100% 匹配歷史輸出或預期現實。尤其是在具有高波動性和異常事件的環境中,想要能夠匹配任意一組輸出數據是不可能的。
影響驗證過程的一些因素包括:
驗證是非常重要的,它設定了模型結果應該如何使用的界限,并定義了如何解釋結果效用的視角。如果創建了某個假設未來場景的模型,那么驗證將與基于我們當前對未來系統的理解的預期結果和假設模型結果相對比。這將構建我們查看結果的方式,并基于當前的一些假設了解結果的準確性。
另一方面,如果您的模型是當前系統的副本,并且您將測試當前系統的更改驗證級別,則模型結果的置信度將基于輸入數據和記錄的輸出數據的準確性。
如果我要寫一篇關于這個主題文章和詳細例子,我可以洋洋灑灑寫下很多內容,但最終我并沒有過多的贅述,驗證更像是一門藝術而不是一門科學。 它是具有爭議的、主觀性的,并且依賴于團隊的整體經驗和專業知識以及模型想要實現的目標。
現在......讓我們看一個驗證的示例,確認部分我們在上一篇文章——單元測試中已經做了介紹!
讓我們看一下如何使用前幾篇文章中的示例模型在 AnyLogic 中執行此操作。您可以從我們在第 3 步中提供的模型開始工作。在此示例中,我們將了解如何從您的模型輕松創建可用于數據驗證階段的低級數據報告。 我們將只進行一次運行,但對于更具統計有效性的練習,您需要運行多次迭代。 我們將在以后的帖子中介紹一些內容——所以請注意這個空間。
Step 1 :添加并設置一個txt文件對象
通過使用 AnyLogic 的一項更高級的功能,您可以簡單地將文本文件對象拖到Main中并將模式設置為“寫入(Write)”
您還可以通過使用 println() 函數打印單行來在文本文件中設置標題行。 在這個例子中,我們只有一列,所以我們只向第一個條目“Customer Queue Time”添加一個普通字符串,但是如果您有許多列,您可以使用分隔符分隔文本,例如“,” 用于 CSV 或 "\t" 用于制表符等。例如,可以使用 println("Customer Queue Time \t Customer ID") 創建制表符分隔的文件。
Step 2 :將結果輸出到文本文件
現在我們需要將我們想要的數據保存在文本文件中。 對于我們非常簡單的示例,我們簡單地將隊列等待時間記錄為:當前時間 - 到達時間 - 服務時間。 剩下的時間就是顧客在隊列中等待服務的時間。 (這在上一篇文章中已經記錄并添加到模型中)
現在,我們唯一添加的是在文本文件中打印一行數據:隊列等待時間(queue waiting time)。
customerQueueTime.println(queueWaitingTime);
注意! 如果我們想在不關閉模型的情況下訪問它,我們還必須記住關閉文本文件!
如果您使用的是 AnyLogic 的專業版,您將可以訪問下載按鈕,這為模型添加了友好的交互性。
以下是使用這種方法的一些好處:
如果您有很多單獨的文件要下載,您也可以在下載之前將它們全部壓縮在一起,但在以后的文章中會對此進行更多介紹;-)(如果您想知道答案,只需搜索它.. .使用基于Java的仿真平臺是一件好事)
Step 3 :驗證
現在您有了數據,您可以輕松地將其與歷史數據、您的預期結果或測試一些假設進行比較。
以下是我們模型的仿真數據與實際數據的一些示例輸出比較。
注意(再次)!這些都來自一次運行——為了進行統計上有效的比較和更深入的分析,需要運行多次復制并將組合或平均輸出與實際值進行比較。
P.S.正如我們之前提到的,驗證是非常主觀的,因此在這里我們不打算深入研究細節,但是為了這個例子和未來帖子的有效性,我們假設這些結果是項目團隊可以接受的;-)
在這篇文章中,我們研究了確認和驗證之間的區別,并討論了為什么它在仿真模型生命周期中如此重要。相較于上一篇文章,我們確實在復雜性規模上下降了一個檔次,并做了一個非常簡單的示例,說明如何輕松記錄模型的詳細輸出數據并讓用戶隨時可用。
在下一篇文章中,我們將著眼于實驗階段,并著眼于稍微先進的方法來快速地運行多個實驗并記錄它們的數據。