【问题标题】:SelectOutput malfunctioning选择输出故障
【发布时间】:2017-03-03 11:44:40
【问题描述】:

使用 selectOutput 我遇到了问题(我认为这是故障)。 条件如下:

main.controlLot[agent.orderID][workcenterID]==
  main.alreadyEntered[agent.orderID][workcenterID] || 
  agent.numberProductsInPallet ==
    ((int) selectFrom(routings)
      .where(routings.work_center.eq(Name))
      .where(routings.component_id.eq(agent.component))
      .firstResult(routings.palletization))

在输入时我正在检查self.condition(agent),当它被条件(main.controlLot[agent.orderID][workcenterID]==main.alreadyEntered[agent.orderID][workcenterID]) 的第一段验证时,它不会通过True 端口。但是,self.condition(agent) 返回 True。

我将以下代码置于退出 (False) 以确认条件是否可以更改中间逻辑:

traceln(main.controlLot[agent.orderID][workcenterID] + " " + main.alreadyEntered[agent.orderID][workcenterID]);
traceln(agent.numberProductsInPallet);
traceln(self.condition(agent));

并且 traceln(self.condition(agent) 打印为 true。我不明白为什么它会将条件评估为 true,而是通过 false 端口发送代理。

【问题讨论】:

    标签: java anylogic


    【解决方案1】:

    这可能与您使用的系统类型有关。
    如果您使用“拉”协议(请参阅:http://www.anylogic.com/blog?page=post&id=157),代理将在进入它之前向前看并评估选择输出。由于在 selectoutput 对象中花费的时间为 0,因此它必须这样做。
    如果条件在 评估了 selectoutput 函数后发生变化,即使它是真的,它仍然会选择假路径。 要修复它,根据您的代码,您可以使用 queue 对象。这将为代理提供 1 个额外的时间步来放松参数并正确评估条件

    【讨论】:

    • 这是有道理的,我会说这是我问题的正确答案。但是,我在条件已经为真的 selectoutput 之前有一个 release 对象。只有当你告诉我代理向前看两个对象时,这才是正确的答案,因为当它退出 restricted area end 对象并经过 release 时条件变为真输入 selectoutput 之前的对象。这可能吗?感谢您花时间回答这个问题!
    • 据我所知,确实如此。它会向前看,直到找到一个队列或允许花费时间步长的东西,并且释放对象是那些花费零时间的对象之一,因此它将继续向前看(参见:help.anylogic.com/topic/com.xj.anylogic.help/html/_ELR/…) .
    • 禁区结束对象也是如此(见help.anylogic.com/topic/com.xj.anylogic.help/html/_ELR/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多