如何销毁队列中的所有代理并插入有条件的新代理?
Posted
技术标签:
【中文标题】如何销毁队列中的所有代理并插入有条件的新代理?【英文标题】:How to destroy all agents in queue and insert new agents with condition? 【发布时间】:2019-09-27 08:42:18 【问题描述】:基本上我在 anlylogic 上有一个简单的源/汇图:
源将代理“CMproduto”插入到我的行中,并将从我的数据库中获取代理的特征。然后,我的代理将按条件对象将其处理到相应队列(第 1/2/3 行)的行进行排序,并且代理将通过条件一一退出我的模型。但是,我的数据库可以更改(根据我的模拟的其余部分),因此,我需要销毁所有 3 个队列中的所有当前代理(以及我的 CMproduto 人口)并通过“源”重新插入它们,但使用新的我更新的数据库中的值。因此,我的数据库将始终注册旧模型(已经进入我的接收器的模型),因为我已经在我的数据库中创建了一个列,如果代理没有或已经被更新为“0”或“1”分别处理。因此,我应该只重新插入在此列中值为“0”的模型代理(我不想重新处理已处理的模型)。
这就是我的来源的配置方式。基本上代理将以“到达之间的时间”为 0 进入(所以它们都同时插入到我的模型中)。如前所述,参数是从数据库中捕获的,到达的数量有限。
我的问题是:如果我从“CMproduto”中删除这些代理,它们会自动从我的队列中删除吗?此外,我如何将代理重新插入到我的模型中,并使用我的数据库中的特征(并且只有尚未处理的模型)?
【问题讨论】:
【参考方案1】:我会从队列中删除代理,然后通过输入块将它们发送回流程。代码看起来像:
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 );
您的图表可能类似于:
您可以使用 agent.deleteSelf() 从总体中删除代理,但如果它仍在流程图块中,您将收到错误消息。此外,当我清理特工时,我总是将它们送到水槽,而不是仅仅将它们从人群中移除。过去,我们注意到这有助于解决内存泄漏以及清理我们自己的引用。
我注意到您只是将代理发送到等待某些条件(保持块)的队列。您可能需要考虑等待块(请参阅帮助菜单)。您可能还想考虑一个分离队列,当您满足条件时,您只需将代理从队列中拉出......实际上,如果您只是将代理保留在队列中,您可能根本不需要这些块 - 您可以只将代理存储在集合中,并根据需要添加/删除/排序等。
【讨论】:
感谢艾米的回复!我在我的流程中插入这些代理时遇到了麻烦,因为我找不到任何其他选项,所以我决定使用这个逻辑。我现在在做什么:将我数据库中的所有生产订单插入 3 个不同的行,并按优先级在这些队列中排序。每次相应的采购订单行为空(没有更多产品要处理)时,我的行都会释放一个采购订单(通过将我的采购订单代理乘以需要生产的数量,将新代理添加到我的“产品”群体中)。另一个条件是基于我的模型时间表(应该打开)。 我怎样才能以更优化的方式做到这一点?考虑到我的数据库的值可能已更改,并且我可能需要更新排队等候的 PO? 我真的无法以这种格式提供足够的建议。听起来您需要有人进来帮助解决一些更高级别的设计/架构问题,而不仅仅是回答特定的编码问题。以上是关于如何销毁队列中的所有代理并插入有条件的新代理?的主要内容,如果未能解决你的问题,请参考以下文章
SelectOutPut (AnyLogic) 中代理类型的条件
SqlServer 可更新订阅队列读取器代理错误:试图进行的插入或更新已失败