在 Anylogic 中只允许固定数量的代理周期性地通过队列块

Allow only a fixed number of agents to pass through a queue block periodically in Anylogic

我同时使用队列和保持块,在所有代理到达队列块之前,保持一直处于阻塞状态。

如何更改它并希望在固定的时间间隔(比如每 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 个座席在下一个周期之前到达?还是 hold 块会立即再次阻塞?

在我提供的解决方案中,如果在循环时间发生时少于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 块来对释放剂进行如此精细的控制。相反,我会提出一个更简单的解决方案。

只需让代理在队列中建立起来,然后使用事件将其删除。此事件的唯一操作是从队列中删除您设置的代理数和队列大小之间的最小值,并将它们发送到输入块。输入块是您的流程然后继续的地方。请参阅下面的屏幕截图。

活动中的代码是

for (int i = 0; i < min(5, queue.size()); i ++){
    enter.take(queue.remove(0));
}

关于这一点,您还可以使用等待块(它隐藏在 PML 库的辅助部分中

然后你可以放弃输入块并简单地调用下面的代码

for (int i = 0; i < min(5, wait.size()); i ++){
   wait.free(wait.get(0));
}