在 Anylogic 中制作可重现的模型源到达

Posted

技术标签:

【中文标题】在 Anylogic 中制作可重现的模型源到达【英文标题】:make reproducible model source arrivals in Anylogic 【发布时间】:2018-11-25 18:05:46 【问题描述】:

我目前正在急诊室制作一个小型模型。但是,我遇到了一个问题,我可以找到解决方案:

我试图在更改参数(例如护士或医生)时生成可重现的模型源到达。我的源块中有一个到达率时间表。在不改变参数的情况下运行模拟给了我可重复的到达模式,但是改变模型中护士的数量也会改变到达模式!!为什么会这样???? 我查看了创伤中心的示例模型,在这里它与我的模型相同。即使使用固定种子。尝试更改医生的数量,您可以看到到达的数量发生了变化??

最好的问候莫腾

【问题讨论】:

【参考方案1】:

您的整个模型默认使用单个随机数流。拥有更多资源意味着患者可能会以不同的顺序到达某些区块,并且某些区块会比其他运行时更多/更少地调用随机数。

除了默认值外,您还可以使用另一个随机数流作为到达。即使其他事情发生变化,这也将使实验中的到达保持不变。

我会通过使用一个事件来做到这一点,该事件的作用是将代理注入您的源代码块(将您的源代码块转换为手动)。注入一个实体后,将事件重置为下一次到达。如果您有指数到达间隔时间,您可以执行以下操作:

Arrivals.inject( 1 );

double dTimeUntilNextArrivale = exponential( 0.5, 1, myRandom);
// where myRandom is defined somewhere for the model to use - I would typically 
// define the variable in the class with the source block and then instantiate
// in the startup code
// example: Random myRandom = new Random();
self.restart( dTimeUntilNextArrival, TimeUnits.MINUTE );

希望在不同的随机数流上有不同的区域是很常见的,因此上面的代码只是实现此目的的一种可能方式。

需要考虑的一些更宏观的事情:

    AnyLogic 帮助菜单提供了一些关于打开随机性和确保结果可重复的建议。 对于许多模型,如果有足够的复制,那么您的模拟与不同数量的医生有不同的到达流应该无关紧要。您运行了足够多的代表,以确保场景中存在真正的差异,而不是随机抽样造成的差异。

【讨论】:

我同意一般的答案,但 Event 的使用在这里是巨大的矫枉过正。只需在 Source 块中使用基于到达时间间隔的到达时间,间隔时间为 exponential(0.5, 1, myRandom) 或其他。请注意,基于速率的到达指数分布的到达间隔时间(以 lambda 作为速率)。 @StuartRossiter 你是对的。您的替代方案会简单得多。我发现我们使用了很多自定义逻辑(不仅仅是自定义随机数生成器)来创建代理,而且我有时最终只是默认使用 inject() 来处理所有事情。感谢您的更正。

以上是关于在 Anylogic 中制作可重现的模型源到达的主要内容,如果未能解决你的问题,请参考以下文章

如何理解 AnyLogic 源生成模式?

Anylogic : 油码头模拟

如何制作良好的可重现 pandas 示例

在 Anylogic 中移动一个代理到另一个代理中

如何制作一个出色的 R 可重现示例

如何制作一个出色的 R 可重现示例