【问题标题】:Delete a Ped from Process从进程中删除 Ped
【发布时间】:2021-05-31 02:25:35
【问题描述】:

我有一个行人代理,它有两种状态:健康和受伤。我已将此状态图连接到 Ped 流程图。当 Ped 进入受伤状态时,它需要 deleteSelf() 并且应该将新代理添加到 ped 群体中。这个人群有一个 ped,当它受伤时,一个新的 ped 出现在模型中。

但是,我意识到我不能在受伤状态下使用deleteSelf(),而 ped 在流程图中的块中。而不是我在受伤状态下使用cancel(this);对于 ped 受伤时可能存在的所有障碍。例如;

main.goToExcSite.cancel(this);
main.pedWait.cancel(this);
main.exitExcSite.cancel(this);

我在这些块的取消部分写了ped.deleteSelf();。再次。它在运行模型时不接受deleteSelf();

我该怎么做?谢谢。

【问题讨论】:

  • 嗨,Neda,总是分享错误信息(更好的截图),很有帮助。
  • 另外,这是什么块? ped-library 流块(ped 工作的地方)或流程库块(您需要使用agent 的地方)
  • 嗨 Benjamin,这是一个 ped-library 流程块。我将错误添加到主要问题中。谢谢。
  • 作为第一印象,这似乎可以通过使用“删除”功能来解决。您需要首先从流程图块中删除代理(例如 pedWait.remove(agent) ),然后让代理自行删除。但我会让本杰明确认一下。
  • 谢谢埃米尔。现在完美运行。

标签: anylogic


【解决方案1】:

deleteSelf 确实是一个低级内部函数,您通常不需要显式调用自己。它只是将它们从种群中删除,并且与流程没有“同步”(即,它也不会将它们从流程中删除);所有流程流都希望其中的代理在其整个流程生命周期中存在于群体中,因此如果您尝试在流程中将它们从群体中移除,则会出现您提到的错误。

一般而言,对于流程流,您应该通过所有流程流的标准机制将代理删除为一个:流入接收器块。 (如果您希望它们离开流程但仍然存在,请使用退出块。)

在 Pedestrian 库的情况下,使用内置取消端口(正如您尝试的那样)并将它们从这些端口发送到 PedSink 块

(如果您有其他个可能的理由来取消块中的 peds,那很好;您只需在取消流程中使用条件逻辑来根据您必须取消它们的原因来执行所需的任何操作,这可能表示将取消原因存储在 ped 代理中...)

AnyLogic 库允许您使用块的 remove 函数从进程中删除代理,我认为代理存在于所有库中的所有块中可以花时间(因此将它们从中删除是有意义的)。但是,如果你想删除它们,你必须自己明确地处理那部分:

  • 如果行人已通过PedSource 块添加到(隐藏的)默认人群中,那么您将在此处必须使用deleteSelf

  • 如果行人已通过 PedEnter 添加到流程中,或者 PedSource 已设置为将它们添加到自定义人口中(这是一种常见的做法,因此您的 ped 代理存在于一个名为人口),您可以在定义人口时通过 AnyLogic 创建的标准 remove_<popname> 函数删除它们 --- 请参阅 AnyLogic 帮助 > 基于代理的建模 > 从人口中动态添加和删除代理 帮助页面。

请注意,使用接收器块还可以直观地表示流程中的“删除和删除”可能性(和逻辑),这是更好的 IMO。

NB:话虽如此,只有 Pedestrian 库具有这种特殊的通用取消块到特殊视觉流机制,因此,当使用来自其他库的流程时(例如,标准流程建模库),如果需要删除它们(以及是否删除它们)是由流程之外的逻辑(例如在代理状态图中)确定的,则使用remove 可能更方便。

【讨论】:

  • 非常感谢@Stuart 提供的信息丰富且全面的回答。它非常有价值,因为它将方法概念化。
猜你喜欢
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 2017-10-30
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多