注意
如果一个端口连接多个其他端口,则可能需要将目标对象写入消息,并在
接收端进行筛选,以便消息仅由预期的收件人处理。
(五)智能体间的消息传递
AnyLogic中,无论在模型层级中距离多远,一个活动对象中的某个结构都可以去访
问任何其他活动对象中的任何结构。AnyLogic提供了允许上下移动模型层次结构并渗透
到活动对象内部的表达式语法。通过这些语法,用户可以直接调用其他活动对象的函数,
或者读取和更改其他活动对象的变量和参数。
另外,AnyLogic为多智能体建模提供了特殊的通信机制:消息传递(message
passing)。一个智能体可以向一个智能体或一组智能体发送一条消息。消息可以是一个任
意类型和复杂性的对象,例如:文本字符串、整数、对对象的引用或具有多个字段的结构。
消息传递和智能体间函数调用的根本区别在于前者是异步通信,而后者是同步通信。
智能体a 在事件1 中间的某个位置调用函数send() 向智能体b 发送消息”Message”。
消息传递到b,但是对于该消息的反应执行延迟到事件1 结束,并在一个新的事件2 中
执行,事件2 在事件1 之后即刻执行。如图3-3-7 所示。
图3-3-7 智能体间的异步通信与同步通信示意图
将此与函数调用相比较。当智能体a 调用智能体b 的function() 时,function() 在事
件1 中立刻开始执行,智能体a 代码的执行推迟,并仅在function() 返回控制权时才恢复。
当使用特殊函数deliver() 和receive() 时是同样的机制,如图3-3-7 所示。
建议优先使用异步消息传递,因为它会带来更加清晰的事件顺序,也更加容易理解
和调试。直接函数调用有可能引起复杂链状和循环。
打开智能体(Agent)包含的“链接到智能体”connections 的属性界面,有一个代
码区域“接收消息时”,如图3-2-23 所示。可以在此输入代码,定义该智能体接收消息
的反应。