动态调整源中的到达率

时间:2018-10-17 15:37:11

标签: anylogic

建模问题背后的基本思想是生产机器的故障。

我想通过将到达率(每秒的到达次数)设置为零(Source.rate = 0)来对此建模。维修机器后,到达率再次设置为其实际值(例如Source.rate = 5)。虽然第一个命令可以完成任务,但是第二个命令似乎没有任何效果,即未创建新代理。

模型的部分相当简单:源->选择输出(关于故障的决定)->正确:继续生产; false:延迟(维修机器)->继续生产。

Source.rate = 0在“故障”的出端口(假)被调用,Source.rate = 5在“修理”的出端口被调用。

https://i.stack.imgur.com/hqGoI.png

当然,此问题的建模方式可能有所不同(例如,使用禁用的“强制推入”保持功能),但是,对于我来说,我的方法为何行不通还不清楚。

谢谢!

3 个答案:

答案 0 :(得分:1)

使用source.rate=5;代替使用source.set_rate(5);

答案 1 :(得分:1)

使用解释解释费利佩的答案:

  

代替使用source.rate = 5;使用source.set_rate(5);

rate实际上是Source块的参数(就AnyLogic而言)。 (所有AnyLogic的过程建模模块实际上都是由AnyLogic开发的代理,因此具有参数,变量等。)

您可以直接设置AnyLogic参数(只需像您一样分配一个值),但是它们都具有set_<parameter name>方法(函数),实际上应该始终使用它,因为这会触发任何此参数的内部变化逻辑。只是此触发的逻辑(在Source块内部)才导致Source正确地“重新评估”速率。

(您可以在自己的模型中对参数使用变化逻辑,并且在更改参数时需要对模型的其余部分进行一些“调整”;即,在变化不明显的情况下,之所以能够正常工作,是因为模型的其他位在更改点之后读取了新值。)

答案 2 :(得分:0)

我不知道为什么您的模型不起作用(也许需要更多模型细节),但是我测试并工作的简单解决方案如下:

您可以将源的“到达类型”设置为“ inject()函数的调用”,将事件添加到模型中,并将其“触发类型”设置为“速率”,并将其速率值设置为5。然后在该事件的操作代码使用以下代码:

if(yourCondition)
{
    source.inject(1);
}

希望对您有帮助。