如何销毁队列中的所有座席并有条件插入新座席?

时间:2019-05-09 13:34:26

标签: anylogic

基本上,我在分析学上有一个简单的源/接收图:

My Model

源代码会将代理“ CMproduto”插入到我的行中,并将从数据库中获取代理的特征。然后,将根据条件对象将其处理到相应队列(行1/2/3)的行对我的代理进行排序,并且代理将通过条件一个接一个地退出我的模型。但是,我的数据库可以更改(根据模拟的其余部分),因此,我需要销毁所有3个队列中的所有当前代理(以及来自我的CMproduto群体),并通过“源”重新插入它们,并使用新的我更新的数据库中的值。因此,我的数据库将始终注册旧模型(已经进入接收器的模型),因为我已经在数据库中创建了一个列,如果该代理尚未或已经被更新,则该列将用“ 0”或“ 1”更新。已处理。因此,我只应在该列中重新插入值为“ 0”的模型代理(我不想重新处理已处理的模型)。

configuration of the source box

这是我的来源配置方式。基本上,代理将以“到达时间”为0进入(因此,所有代理都同时插入到我的模型中)。如上所述,正在从数据库中捕获参数,到达的次数有限。

我的问题是:如果我从“ CMproduto”中删除这些代理,是否会自动将其从队列中删除?另外,如何使用数据库中的特征(以及仅尚未处理的模型)将代理重新插入到模型中?

1 个答案:

答案 0 :(得分:0)

我将从队列中删除代理,然后通过enter块将它们通过流发送回去。代码类似于:

while( queue.size() > 0 ){
  // get the agent out of the queue
  Agent agent = queue.removeFirst();
  // maybe insert some code to adjust the paramters
  // then send back to the enter block
  enter.take( agent );
}

您的图表可能类似于:

enter image description here

您可以使用agent.deleteSelf()从总体中删除一个代理,但是如果它仍在流程图块中,则会出现错误。另外,在清理代理程序时,我总是将它们发送到接收器中,而不是仅仅将其从总体中删除。过去,我们注意到这有助于解决内存泄漏以及清理自己的引用。

我注意到您只是将代理发送到在某些条件下等待的队列(保留块)。您可能需要考虑等待块(请参阅帮助菜单)。您可能还需要考虑一个分离的队列,在该队列中,只要满足条件,您就可以将座席从队列中拉出……实际上,如果只是将座席保留在队列中,则可能根本不需要这些块-您可以只将代理存储在集合中,并根据需要添加/删除/排序等。