如何解决在 Anylogic 中只允许固定数量的代理定期通过队列块
我同时使用 Queue 和 Hold 块,在所有代理到达 Queue 块之前,hold 一直处于阻塞状态。
如何更改它并希望在固定的时间间隔(例如每 3 分钟)只允许固定数量的代理(例如 5 个代理)?我的队列和保持块的当前属性:
queue_block_properties
hold_block_properties
解决方法
创建一个重复时间为 3 分钟的循环事件。
还要创建一个变量,您可以将其命名为 count
类型的 int
。
在事件操作字段中写入:
count = 0;
hold.unblock();
然后,在保持块的 On enter
字段中写入以下内容:
count++;
if( count == 5 ) {
self.block();
}
我唯一的问题是,您是否希望每 3 分钟就有 5 个特工离开,或者他们晚一点到达是否可以。换句话说,如果 3 分钟后,队列中只有 3 个代理,他们是否离开并保持畅通,以防在下一个周期之前又有 2 个代理到达?还是保持块立即再次阻塞?
在我提供的解决方案中,如果在循环时间发生时少于 5 个,然后新的代理在下一个循环之前到达,他们可以通过。
否则,例如创建一个名为 target
的新变量并在事件操作中写入以下内容:
count= 0;
if( queue.size() >= 5 ) {
target = 5;
hold.unblock();
}
else if ( queue.size() > 0 ) {
target = queue.size();
hold.unblock();
}
在保留的输入处,写:
count++;
if( count == target ) {
self.block();
target = 0;
}
,
我建议不要使用 hold
块来对释放代理进行如此精细的控制。相反,我会提出一个更简单的解决方案。
只需让代理在队列中建立,然后使用事件将其删除。此事件的唯一操作是从队列中删除设置的代理数量和队列大小之间的最小值,并将它们发送到输入块。 enter 块是您的流程继续的地方。请参阅下面的屏幕截图。
事件中的代码是
for (int i = 0; i < min(5,queue.size()); i ++){
enter.take(queue.remove(0));
}
在那一点上,您还可以使用 Wait 块(隐藏在 PML 库的辅助部分中
然后你可以放弃输入块并简单地调用以下代码
for (int i = 0; i < min(5,wait.size()); i ++){
wait.free(wait.get(0));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。