AnyLogic中的意外行为SelectOutput块

AnyLogic中的意外行为SelectOutput块,anylogic,Anylogic,在一个模型中,我使用一个selectoutput块,使用一个基于代理的p_Dx_EGFR_SOC_AH参数的条件,该参数的类型为选项列表(选项:突变、未突变、未知状态)。如果agent.p\u Dx\u EGFR\u SOC\u AH==Mutated计算结果为true,则通过true端口退出,否则通过false端口退出。为了检查它是否正常工作,我加入了一个traceln(agent.p\u Dx\u EGFR\u SOC\u AH)(True) 结果证明它没有按预期工作。轨迹线显示具有参数的

在一个模型中,我使用一个selectoutput块,使用一个基于代理的p_Dx_EGFR_SOC_AH参数的条件,该参数的类型为
选项列表
(选项:突变、未突变、未知状态)。如果
agent.p\u Dx\u EGFR\u SOC\u AH==Mutated
计算结果为
true
,则通过true端口退出,否则通过false端口退出。为了检查它是否正常工作,我加入了一个
traceln(agent.p\u Dx\u EGFR\u SOC\u AH)字段中的code>(True)

结果证明它没有按预期工作。轨迹线显示具有参数的三个选项之一的代理通过真实端口退出:


假端口也是如此;具有三个选项之一的代理通过该端口退出。我在这里做错了什么,或者这是任何逻辑中已知的错误吗?

这里的问题是,事物的计算顺序是相反的。。。因此,让我们假设以下模型,退出true的条件是agent.parameter==0,参数的默认值是0

事情发生的顺序是

  • 代理在源块的出口处处于打开状态
  • 代理计算selectoutput块上的条件
  • 代理移出源块,并对“退出时”操作进行计算
  • 这意味着,如果更改源块代理的“退出时”操作上的参数值。参数=1,代理仍将在selectoutput的真正退出时退出,因为条件已计算完毕

    如果更改“在退出时打开”操作上的参数值,代理将通过selectoutput块的假退出退出

    这有点奇怪,但事情就是这样做的

    有时您没有“在退出时打开”操作,在这种情况下,您可能需要介于1毫秒的辅助延迟之间的时间来获得所需的顺序。

    Good catch:-)包括延迟为epsilon的延迟块确实修复了这种奇怪的行为。