anylogic 代理通信和消息发送

问题描述

在我的模型中,我有一些代理;

  1. “需求”代理,

  2. “EnergyProducer1”代理

  3. “EnergyProducer2”代理。

当我的每小时能源需求是在带有函数的 Main 代理中创建时,满足此需求的优先级属于“EnergyProducer1”代理。在这个代理中,我有一个函数可以根据某些情况计算能量产生。该函数内部的部分内容如下;

**" if (statechartA.isstateActive(Operating.busy)) && ( main.heatLoadDemandPerHour >= heatPowerNominal) { 生产的HeatPower = heatPowerNominal;

naturalGasConsumptionA = naturalGasConsumptionNominal;

send("boilerWorking",boiler);

} else ..... "**

这里我的问题与代码的第 4 行有关。如果我的 agent1 不能满足每小时的需求,我不得不说 agent2 “满足其余的需求”。如果我将此消息发送到 agent2,它的状态图将处于活动状态并且 agent2 的功能将起作用。我的问题是,所有情况都将在同一时间实现???如果不是,访问其他 agent2 的变量和参数是否更合适?

我希望我能解释我的问题。 提前感谢您的帮助...

**编辑问题...

解决方法

作为对您的问题的一般性评论,在 AnyLogic 环境中发送消息总是比直接访问另一个代理的变量和参数更可取。

特别是在示例中,send() 函数将在当前函数完成后安排下一个实例的消息传递。

更新:AnyLogic 中的消息可以是任何 Java 类。发送示例中使用的诸如“boilerWorking”之类的字符串有利于一般控制,但是如果需要共享更多信息(例如 double 值),那么创建一个新的 Java 类是一种很好的做法(让我们调用 ModelMessage 并跟随 these instructions)至少有两个属性 msgStrmsgVal。使用这个发送消息的新类从这里改变:

...
send("boilerWorking",boiler);
...

为此:

...
send(new ModelMessage("boilerWorking",42.0),boiler);
...

并且必须将状态图中的触发转换更改为使用 if expression is true,表达式为 msg.msgString == "boilerWorking"

有关代理通信的更多信息参见here