Anylogic:如何比较状态图中的参数和变量值?

Anylogic: how to compare parameter and variable value within statechart?

在我的 Anylogic 模型中,我有一个 hub 可以存储 5 个容器。所以它有一个值为 5 的 capacity 参数。我还给它一个变量,其中 numberOfContainers 存储在那个时刻的集线器中。当我 运行 模型时,我看到变量有效(它随时间变化为当时存储的容器数量)。

现在我希望我的模型中的另一个代理根据当时(在其状态图中)是否达到集线器的容量来做出决定。我试图创建一个具有以下条件的分支: main.hub.numberOfContainers > main.hub.capacity 但它不起作用,状态图就像从未达到容量一样,即使容器的数量远高于容量。有人知道怎么做吗?

通常情况下,条件分支很棘手,因为条件可能不会在您希望的时间进行评估。这是一个例子。

  • 在时间 n 中有 3 个容器
  • 在时间 n+1 hub 中有 10 个容器
  • 在时间 n+2 hub 中有 2 个容器

模型可能错过了时间 (n+1) 的条件评估,这就是您的转换不会被触发的原因。

为了解决这个问题,我有 3 个可能的建议:

  1. 不使用条件转换。相反,使用消息。例如,如果您将容器存储在队列中,则在队列的“On Enter”和“On Exit”字段中添加条件:

     if(queue.size >= main.hub.numberOfContainers)
       <send msg to the statechart>
    
  2. 使用循环事件检查是否每秒或毫秒或任何对您有意义的时间段满足条件。当条件满足时,发送消息触发转换。但是这种方法的问题是它可能会降低你的模型的性能,导致性能不佳。

  3. 使用 onChange() 函数。此函数用于向您的模型发出信号,表明发生了变化并且需要评估条件触发器。因此,您需要确保在发生可能导致条件变为真的更改时放置 onChange() 。在上面选项 1 下提供的示例中,它位于队列“进入时”和“退出时”的字段中。