是否可以将状态图的当前状态从一个代理复制到另一个代理?
Posted
技术标签:
【中文标题】是否可以将状态图的当前状态从一个代理复制到另一个代理?【英文标题】:is it possible to copy the current state of the statechart from one agent to another? 【发布时间】:2021-10-27 16:58:25 【问题描述】:我正在尝试使用 SEIR 和行人模型之间的混合来制作一个模型来模拟公共空间中 covid 的传染。 在另一个问题中,我要求使用静态人口。他们建议在删除代理之前将副本保存在列表中,并且在生成第一个 X 代理之后,我希望 pedSource 生成的下一个代理成为列表中的一个。
目前我所做的是从列表中随机抽取一个代理,如果它被感染,我会向新代理发送一条消息,使其进入感染状态。但是通过这样做,每次代理进入我正在建模的区域时,我都会重置超时以恢复。 这是退出时在 pedSource 中当前运行的代码:
if (personasEnCasa.size()+personasEnSuper.size() > poblacionMaxima)
Persona p = randomFrom(personasEnCasa);
if (p.statechart.getState() == Persona.Infeccioso)
send("Contagiado", ped);
;
personasEnCasa.remove(p);
;
personasEnSuper 是我的 Persona 人口,personasEnCasa 是我在区域外的代理列表,而 poblacionMaxima 是列表和人口中的最大代理数
我希望能够将列表中代理的当前状态图复制到生成我的 pedSource 的代理。或者使用类似于 pedSource.inject () 的东西,但从列表中插入一个代理而不是一个新代理。但我不知道该怎么做。
有什么办法吗?
【问题讨论】:
【参考方案1】:你的 ped 已经存在,你不需要复制它,你可以像这样将它移动到流中,pedWait 是你想要的任何行人街区,所以你可以用 send("Contagiado", ped);
代替 enter.take(ped);
但如果您坚持使用发送,那么您可以使用状态图上的分支来定义此 ped 的去向:
在这种情况下,您需要在发送之前使用 ped.infectious=true;并且分支中的条件将是感染==true 以移动到感染状态。
作为旁注,您应该使用 p.statechart.getState().equals(Persona.Infeccioso)
而不是 p.statechart.getState() == Persona.Infeccioso
仅将 == 与 boolean、int 和 double 等原语一起使用,否则您很容易出现难以发现的错误
【讨论】:
我试图做出你给我的第一个选项,但我收到了这个错误Agent (Agent#102[root.pedGoToSalida]:null) can't be in several flowcharts at the time. At least two flowchart blocks are in conflict: root.enter and root.pedGoToSalida java.lang.RuntimeException: root.personasEnCasa[37]:
我对 pedSink 所做的是,当代理进入时,我将副本保存在另一个 pupulation 中我会找代理让他们重新进入。我还尝试在 pedSink 中使用 goToPopulation () 命令从所有人口中删除。我应该使用另一个块而不是 pedSink 吗?
然后显示你的流程图,因为这意味着你的代理已经在一个块上,所以为什么不继续正常的流程图而不是所有这些parafernalia。以上是关于是否可以将状态图的当前状态从一个代理复制到另一个代理?的主要内容,如果未能解决你的问题,请参考以下文章
ios在“准备提交”状态下将应用程序从一个帐户转移到另一个帐户