首页 > 解决方案 > 从进程中删除 Ped

问题描述

我有一个行人代理,它有两种状态:健康和受伤。我已将此状态图连接到 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();运行模型时不接受。

我怎样才能做到这一点?谢谢你。

在此处输入图像描述

标签: anylogic

解决方案


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

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

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

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

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

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

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

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

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


推荐阅读