在 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 中制作可重现的模型源到达的主要内容,如果未能解决你的问题,请参考以下文章