3.1 通信方式的确定
MAS通信主要有四种连接方式:黑板模式、联邦方式、广播方式、点到点方式。通信传递方式有消息传递、方案传递两种。本系统Agent之间通信前都通过Agent管理平台提供的服务查询机制来定位欲通信的Agent,然后两个Agent进行直接通信;而Agent之间传输的信息是互操作命令、参数和操作结果,没有设计到方案传递。所以本系统采用的是点对点的消息传递通信方式。
3.2 通信策略
本系统中的数据服务Agent、冲突消解Agent、故障诊断Agent分别为整个系统中的其他Agent提供数据查询和写入服务、冲突识别和消解服务、故障诊断服务,请求每种服务的Agent必须要先定位到服务提供者,这就要求一种服务注册和定位机制。FIPA标准中定义了在Agent系统中必须存在的DF(Directory Facilitator)Agent。上述三个服务提供者启动时就会在DF中注册自己提供的服务,如:某个执行Agent需要冲突消解服务时,它会通过查询DF来得到冲突消解Agent的通信地址和服务使用的互操作协议等信息,然后根据互操作协议规定的对话方式与协调Agent通信。
JADE提供了默认的DF Agent,服务提供者(如数据服务Agent)欲注册自己的服务,其主要代码如下:
Service Description sd=new Service Description( );
//创建服务描述对象,描述服务属性
DF Agent Description DFad=new DF Agent Description( );
//创建自身描述对象,描述自身信息
Codec language=new SLCodec( );//采用SL内容语言规范
Ontology ontology=Basic Ontology.getInstance( );
//采用基本本体语言构建服务描述对象
sd.setName(getLocalName( ));
sd.setType(″SwageDisposeDataService″);//为服务命名,其他Agent查询服务时就用此名字
sd.addProtocols(InteractionProtocol.FIPA_REQUEST);
//服务所采用的互操作协议
sd.addLanguages(language.getName( ));
sd.addOntologies(ontology.getName( ));
//构建自身描述对象
DFad.addProtocols(InteractionProtocol.FIPA_REQUEST);
DFad.addLanguages(language.getName( ));
DFad.addOntologies(ontology.getName( ));
DFad.setName(getAID( ));
//使自身具有构建的服务描述对象
DFad.addServices(sd);
try{
DFService.register(this,DFad);//在平台提供的默认DF中注册自己的服务
}catch(FIPAException e){
//处理异常
}
当冲突消解Agent需要此服务时,可通过下面的代码来搜索DF,并定位到此服务的提供者,即数据服务Agent[6]。
…… //部分变量申明与上段代码相同
DFAgentDescription dfd[ ];//用于存储提供此服务的
//Agent描述信息(服务提供者可能不止一个)
//构建服务描述对象
sd.setType(″SwageDisposeDataService″);
sd.addLanguages(language.getName( ));
sd.addOntologies(ontology.getName( ));
sd.addProtocols(InteractionProtocol.FIPA_REQUEST);
DFad.addServices(sd);
try{
dfd=DFService.search(this,DFad);//在默认DF中搜索服务提供者
…… //与服务提供者通信
}catch (FIPAException e){
//处理异常
}
3.3 通信协议
本系统Agent之间通信都采用请求互操作协议,即ACL消息的protocol参数均为fipa-request,用UML表示的该协议流程如图3所示。
Agent提供服务所需的参数和操作结果都包含在ACL消息的content参数中。
3.4 通信内容
在本系统中,Agent之间的通信内容是封装在自定义的CSO(Communication Seriable Object)类中,通过JADE提供的串行化接口,可将CSO对象作为ACL消息的content参数在任意Agent之间传递,能达到很好的可扩展效果。CSO的类结构如下:
public class CSO implements Serializable {
private String[ ] arg;//服务参数
private float[ ] value;//服务结果
private String comment;//注释
……
}
系统中的数据服务Agent提供数据查询和数据写入服务,它根据服务使用者在CSO.arg[ ]中传送的参数进行实时数据库操作,并将查询结果存储在CSO.value[ ]中返回给请求者。冲突消解Agent接收执行Agent的冲突识别请求(此请求不带参数),并根据冲突识别算法的需要请求数据服务Agent的数据查询服务或故障诊断Agent的故障诊断服务,将消解结果命令或无冲突命令存放于CSO.arg[0]中,再向执行Agent传送。故障诊断Agent向冲突消解Agent提供故障诊断服务时也需要从CSO.arg[ ]中获取参数,并将诊断结果存放于CSO.value[ ]中,以表明请求诊断的故障是否出现。
本文基于FIPA-ACL提出了污水处理Multi-Agent智能化系统的通信技术,确定了其通信方式、通信策略与通信协议,并给出了JADE 3.1软件开发平台上的实现方法。