从进程中删除 Ped
Delete a Ped from Process
我有一个行人代理,它有两种状态:健康和受伤。我已将此状态图连接到 Ped 流程图。当 Ped 进入受伤状态时,它需要 deleteSelf()
并且应该向 ped 种群添加新的代理。这个人口有一个 ped 当它受伤时一个新的 ped 来到模型。
但是,我意识到当ped在流程图中的一个块中时,我不能在受伤状态下使用deleteSelf()
。而不是我在受伤状态下使用cancel(this)
;因为受伤时 ped 的所有积木都可能在那里。例如;
main.goToExcSite.cancel(this);
main.pedWait.cancel(this);
main.exitExcSite.cancel(this);
我在这些块的取消部分写了 ped.deleteSelf();
。再次。它不接受 deleteSelf();
而 运行 模型。
我该怎么做?谢谢。
deleteSelf
实际上是一个低级内部函数,您通常不需要显式调用自己。它只是将它们从它们的人口中移除,并且与流程没有 'synchronisation'(即,它也不会从流程中移除它们);所有流程都期望其中的代理在整个流程生命周期中都存在于人口中,因此如果您在流程中尝试将它们从人口中移除,就会出现您提到的错误。
一般来说,对于流程,您应该通过所有流程的标准机制删除一个代理:流入汇块。 (如果您希望它们离开流程但仍然存在,请使用退出块。)
在 Pedestrian 库的情况下,使用内置的取消端口(如您所尝试的那样)并将它们从这些端口发送到 PedSink 块。
(如果您有 其他 可能的原因从块中取消 peds,那很好;您只需要在取消流程中有条件逻辑来根据您必须这样做的原因执行所需的任何操作取消它们,这可能意味着将取消原因存储在 ped 代理中...)
AnyLogic 库 也 允许您使用块的 remove
功能从进程中 删除 代理,我认为存在于所有库中的所有块中,代理可以花时间在其中(因此从中删除它们是有意义的)。但是,如果你想删除它们,你必须自己明确地处理那部分:
如果行人已通过 PedSource
块添加到(隐藏的)默认人口中,那么在这里您将 必须 使用 deleteSelf
.
如果行人已通过 PedEnter
添加到流程中,或者 PedSource
已设置为将他们添加到自定义人口(这是常见的事情这样做你的 ped 代理存在于一个命名的人口中),你可以通过 AnyLogic 在定义人口时创建的标准 remove_<popname>
函数删除它们 --- 请参阅 AnyLogic 帮助 > 代理基于建模 > 从总体中动态添加和删除代理 帮助页面。
请注意,使用汇块也直观地表示了流程中的 'remove and delete' 可能性(和逻辑),这在 IMO 中更好。
NB:话虽如此,只有 Pedestrian 库具有这种特殊的通用 cancel-from-blocks-into-a-special-visual-flow 机制,因此,在使用 process 时来自其他库(例如,标准过程建模库)的流程,如果需要删除它们(以及是否删除它们)是由过程流外部的逻辑(例如在代理状态图中)。
我有一个行人代理,它有两种状态:健康和受伤。我已将此状态图连接到 Ped 流程图。当 Ped 进入受伤状态时,它需要 deleteSelf()
并且应该向 ped 种群添加新的代理。这个人口有一个 ped 当它受伤时一个新的 ped 来到模型。
但是,我意识到当ped在流程图中的一个块中时,我不能在受伤状态下使用deleteSelf()
。而不是我在受伤状态下使用cancel(this)
;因为受伤时 ped 的所有积木都可能在那里。例如;
main.goToExcSite.cancel(this);
main.pedWait.cancel(this);
main.exitExcSite.cancel(this);
我在这些块的取消部分写了 ped.deleteSelf();
。再次。它不接受 deleteSelf();
而 运行 模型。
我该怎么做?谢谢。
deleteSelf
实际上是一个低级内部函数,您通常不需要显式调用自己。它只是将它们从它们的人口中移除,并且与流程没有 'synchronisation'(即,它也不会从流程中移除它们);所有流程都期望其中的代理在整个流程生命周期中都存在于人口中,因此如果您在流程中尝试将它们从人口中移除,就会出现您提到的错误。
一般来说,对于流程,您应该通过所有流程的标准机制删除一个代理:流入汇块。 (如果您希望它们离开流程但仍然存在,请使用退出块。)
在 Pedestrian 库的情况下,使用内置的取消端口(如您所尝试的那样)并将它们从这些端口发送到 PedSink 块。
(如果您有 其他 可能的原因从块中取消 peds,那很好;您只需要在取消流程中有条件逻辑来根据您必须这样做的原因执行所需的任何操作取消它们,这可能意味着将取消原因存储在 ped 代理中...)
AnyLogic 库 也 允许您使用块的 remove
功能从进程中 删除 代理,我认为存在于所有库中的所有块中,代理可以花时间在其中(因此从中删除它们是有意义的)。但是,如果你想删除它们,你必须自己明确地处理那部分:
如果行人已通过
PedSource
块添加到(隐藏的)默认人口中,那么在这里您将 必须 使用deleteSelf
.如果行人已通过
PedEnter
添加到流程中,或者PedSource
已设置为将他们添加到自定义人口(这是常见的事情这样做你的 ped 代理存在于一个命名的人口中),你可以通过 AnyLogic 在定义人口时创建的标准remove_<popname>
函数删除它们 --- 请参阅 AnyLogic 帮助 > 代理基于建模 > 从总体中动态添加和删除代理 帮助页面。
请注意,使用汇块也直观地表示了流程中的 'remove and delete' 可能性(和逻辑),这在 IMO 中更好。
NB:话虽如此,只有 Pedestrian 库具有这种特殊的通用 cancel-from-blocks-into-a-special-visual-flow 机制,因此,在使用 process 时来自其他库(例如,标准过程建模库)的流程,如果需要删除它们(以及是否删除它们)是由过程流外部的逻辑(例如在代理状态图中)。