微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从进程中删除 Ped

如何解决从进程中删除 Ped

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

但是,我意识到当 ped 在流程图中的块中时,我不能在受伤状态下使用 deleteSelf()。相反,我在受伤状态下使用了 cancel(this);对于受伤时可能会在那里的所有块。例如;

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

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

我该怎么做?谢谢。

enter image description here

解决方法

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

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

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

(如果您有其他可能的原因从块中取消 peds,那很好;您只需在取消流程中有条件逻辑来执行任何需要的操作,这取决于您必须取消它们的原因,这可能意味着将取消原因存储在 ped 代理中...)

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。