问题描述
在我的模型中,我有一些代理;
-
“需求”代理,
-
“EnergyProducer1”代理
-
“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)至少有两个属性 msgStr 和 msgVal。使用这个发送消息的新类从这里改变:
...
send("boilerWorking",boiler);
...
为此:
...
send(new ModelMessage("boilerWorking",42.0),boiler);
...
并且必须将状态图中的触发转换更改为使用 if expression is true
,表达式为 msg.msgString == "boilerWorking"
。
有关代理通信的更多信息参见here。