【问题标题】:AnyLogic: Agent not sure where exactly it need to goAnyLogic:代理不确定它到底需要去哪里
【发布时间】:2022-08-18 19:42:36
【问题描述】:

延迟1只能包含agent.paint。在出口处延迟1,一个新的代理从延迟. 但发布的代理不是agent.paint,而是agent.repairagent.bwork。 这延迟 2、延迟 4 和延迟 7可以包含agent.repairagent.bwork 但是这些延迟已经满了,所以现在代理是一个问题,这是不应该发生的。

问题:

延迟1只有agent.paint可以去,从延迟延迟 2、延迟 4 或延迟 7只有agent.repairagent.bwork 可以去,如果延迟拥有他们。 而这在现有模型中并没有发生。

我尝试在下图中进行解释:

我现有的方法行不通。

    标签: java simulation anylogic


    【解决方案1】:

    在延迟中,您将 stopDelay 与代理一起使用,而不关心其 3 个参数的值。 因此,当 delay1 为空时,完全有可能释放一个未绘制的代理......并且该代理将进入其他 3 个延迟中的任何一个......没有理由不这样做。

    除此之外..你有 moveTo 块弄乱你的条件......所以如果一个代理在 moveTo4 并且 delay2 是空的,它会去延迟 2 反正......因为为什么不呢?您对此没有任何限制

    你把一个非常简单的问题复杂化了

    【讨论】:

    • 我如何使用 StopDelay 离开具有特定参数的代理?例如,我尝试了 delay.stopDelay(agent.paint) 但这是错误的。
    • 请始终为新问题打开新问题,请参阅benjamin-schumann.com/blog/2021/4/1/… :)
    【解决方案2】:

    您的模型中有几处不正确。首先,请记住,当你使用这个词时代理人在流程图块中,它总是指包含在当前流程图块从你调用它的地方。

    我假设,在delay1 的“退出”功能中,您想从delay 释放一个具有参数paint == true 的代理。但是,您将函数编写为

    if (delay.size() > 0 && agent.paint == true) delay.stopDelay(delay.get(0));
    

    第二个条件agent.paint == true 指的是delay1 流程图块中的当前代理,而不是您要释放的delay 中的代理。此外,您正在为延迟块中位置 0 处的代理调用 stopDelay(),无论该代理是否是正确的代理。

    相反,您需要遍历delay 流程图块中包含的所有代理,找到满足您的条件的代理并释放此特定代理。您的代码可能如下所示:

    if (delay.size() > 0) {
       Agent agentToRelease = null;
       for (int i = 0; i++; i < delay.size() {
            if (delay.get(i).paint == true) {   // Note: The function delay.get(i) is very slow. See if you can use Collection instead.
                agentToRelease = delay.get(i);
                break;
            }
       }
    
       if (agentToRelease != null) {
          delay.stopDelay(agentToRelease);
       }
    }
    

    delay2delay4delay7 也是如此。

    delay 的“on enter”函数始终由当前正在进入延迟的代理调用。因为您在这里检查了此特定代理的条件,所以您可以直接为该代理调用stopDelay(),以防条件返回true。所以你的代码的第一部分应该是这样的(其余的条件也是如此)

    if (agent.paint == true && delay1.size() + moveTo.size() < 2) {
       delay.stopDelay(agent);
    } else if (...)
    

    【讨论】:

    • 我是否也必须在“进入”时提及延迟阻止应该释放哪个特定代理参数?如果是的话怎么办?现在它的' delay.stopDelay(delay.get(0)); '。请让我知道,有关的更多详细信息延迟上图中给出的“进入”。
    • 延迟块的“on enter”函数将由当前进入延迟块的代理调用。因此,如果参数正确(= 如果条件返回 true),那么您可以使用 delay.stopDelay(agent) 而不是调用 delay.stopDelay(delay.get(0))
    • 我编辑了我的答案以包含延迟块的“输入”功能的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2020-01-21
    • 2017-01-03
    相关资源
    最近更新 更多