Model 在Anylogic中创建可复制的源到达模型

Model 在Anylogic中创建可复制的源到达模型,model,simulation,anylogic,reproducible-research,Model,Simulation,Anylogic,Reproducible Research,我目前正在急诊室制作一个小模型。但是,我遇到了一个问题,我可以找到解决方案: 我试图在更改参数(如护士或医生)时创建可复制的模型源到达。我在我的源代码块中有一个费率到达时间表。在不更改参数的情况下运行模拟可以为我提供可复制的到达模式,但是更改模型中的护士数量也会更改到达模式!!为什么会这样??。 我查看了创伤中心的示例模型,这里它与我的模型做的相同。即使使用固定的种子。试着改变医生的数量,你会发现到达的人数会改变 向莫顿致以最诚挚的问候默认情况下,您的整个模型使用的是单个随机数流。拥有更多的资源

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

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


向莫顿致以最诚挚的问候默认情况下,您的整个模型使用的是单个随机数流。拥有更多的资源意味着患者可能会以不同的顺序到达某些区块,并且某些区块会比其他区块更频繁/更少地调用随机数

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

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

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帮助菜单提供了一些关于启用随机性和确保结果可重复的建议
  • 对于许多模型,在复制足够的情况下,不同医生数量的模拟具有不同的到达流并不重要。您运行了足够多的重复,以确保场景中存在真正的差异,而不是由于随机采样而产生的差异

  • 我同意一般的答案,但是
    事件
    的使用在这里是过度的。只需在
    块中使用基于到达间隔时间的到达,到达间隔时间为
    指数(0.5,1,myRandom)
    或任何形式。请注意,基于速率的到达是一个指数分布的到达间隔时间(以lambda为速率)。@StuartRossiter您是对的。你的选择会简单得多。我发现我们使用了很多自定义逻辑(不仅仅是自定义随机数生成器)来创建代理,有时我会默认使用inject()来完成所有操作。感谢你的纠正。