动态调整源中的到达率

Dynamically adjusting arrival rate in source

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

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

模型部分比较简单:Source --> Select Output (decision about breakdown) --> true: go on production; false: delay (repair machine) --> 继续生产。

Source.rate = 0在"breakdown"的出端口(false)被调用,Source.rate = 5在"repair"的出端口被调用。

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

当然,这个问题的模型可能不同(例如,使用 hold with disabled "forced pushing"),但是,我不清楚为什么我的方法不起作用。

提前致谢!

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

您可以将源的 "Type of arrival" 设置为 "calls of inject() function",向您的模型添加一个事件并将其 "Trigger type" 设置为 "Rate" 并将其速率值设置为 5。然后在事件的动作代码中使用以下代码:

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

希望对你有所帮助

而不是使用 source.rate=5; 使用 source.set_rate(5);

通过解释来扩展 Felipe 的回答:

Instead of using source.rate=5; use source.set_rate(5);

rate 实际上是 Source 块的参数(在 AnyLogic 意义上)。 (所有AnyLogic的Process Modeling块实际上本身就是AnyLogic开发的Agents,因此具有参数,变量等)

您可以直接设置 AnyLogic 参数(通过像您一样分配一个值),但它们也都有一个 set_<parameter name> 方法(函数),应该始终使用它,因为 这会触发此参数 的任何内部更改逻辑。正是这种触发逻辑(Source 块内部)导致 Source 到 're-evaluate' 速率正确。

(您可以在自己的模型中对参数使用更改逻辑,并且在更改参数需要对模型的其余部分进行一些 'adjustments' 时需要这样做;即,在更改的情况下不会 'just work' 因为模型的其他位在更改点之后读取新值。)