建模问题背后的基本思想是生产机器的故障。
我想通过将到达率(每秒的到达次数)设置为零(Source.rate = 0
)来对此建模。维修机器后,到达率再次设置为其实际值(例如Source.rate = 5
)。虽然第一个命令可以完成任务,但是第二个命令似乎没有任何效果,即未创建新代理。
模型的部分相当简单:源->选择输出(关于故障的决定)->正确:继续生产; false:延迟(维修机器)->继续生产。
Source.rate = 0
在“故障”的出端口(假)被调用,Source.rate = 5
在“修理”的出端口被调用。
https://i.stack.imgur.com/hqGoI.png
当然,此问题的建模方式可能有所不同(例如,使用禁用的“强制推入”保持功能),但是,对于我来说,我的方法为何行不通还不清楚。
谢谢!
答案 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);
}
希望对您有帮助。