本文分享了由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,有很多专家,包括我自己 ;-),他们随时准备提供帮助。