【问题标题】: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 () 的东西,但从列表中插入一个代理而不是一个新代理。但我不知道该怎么做。

有什么办法吗?

【问题讨论】:

    标签: anylogic agent-based-modeling


    【解决方案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。
    猜你喜欢
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2021-07-10
    • 2013-06-28
    • 2020-08-16
    • 2017-02-15
    • 1970-01-01
    相关资源
    最近更新 更多