一种基于XML的多Agent消息通讯方法技术领域
一种基于XML的多Agent消息通讯方法主要涉及计算机通讯方面领域。
背景技术
基于多Agent分布式系统是以网络技术为基础,将分布在不同地理位置上的Agent集成在一个时间和空间相一致的环境中,通过它们之间的通讯与互操作,实现知识与信息共享,从而完成复杂任务的求解。多Agent分布式系统广泛应用在如电子商务、机器人控制、生产计划与调度等不同领域中。目前,关于多Agent分布式系统的研究,主要集中在支持协作的通讯方式上,并提出了许多协作通讯模型。如基于黑/白板结构和基于消息的通讯模型。在基于黑板结构的多Agent通讯模型中,黑板提供公共工作区,Agent可以交换信息、数据和知识。但当Agent结点数目增多时,黑板中的数据量会呈指数增长,导致系统的通讯效率降低。在基于消息的通讯模型中,Agent间通过使用统一的消息传送协议,克服了黑板系统的缺陷,提高了系统的通讯能力。但是,在消息的通讯模型中,如何进行Agent间消息的传送和同步,保证通讯的可靠性与有效性,即在通信的情况下保证消息以最小的通讯时间可靠提交;如何保证消息不受协议响应结构的限制,提高系统通讯的灵活性仍然是研究的一个难点。
主要以消息传输的方式实现多Agent分布式系统的通讯,通过采用消息的XML格式封装和解析实现消息的传送。封装后的消息由于可以绑定更多的信息,支持对其的扩展,因此克服了协议响应结构对消息的限制,提高了消息传送的灵活性。同时为了保持Agent之间消息传送的时空一致性,在消息传输过程中采用了基于消息优先级的传输同步控制算法,保证了消息可靠有效传输。最后给出了系统仿真的实现框架,并在Win2000系统上应用Java语言得以实现验证。
发明内容
通过国家专利检索没有发现关于此系统方面的申请资料。
在多Agent分布式系统中,为了实现Agent之间的通讯,要求每一个Agent知道其它Agent的名称、通信地址、通讯端口、协作能力等等。因此,在每个仿真Agent中设计一个通讯Agent模块。该模块负责所有与通讯有关的动作,同时该模块也是Agent间进行通讯的一个接口。每个通讯模块包含信息表、消息缓存池和一个通讯服务管理器三部分。信息表用来记录Agent中的一些基本特性。信息表主要包括以下两部分:(1)静态信息表:存储Agent自身的静态信息,如Agent标识、本身的性能、IP地址等;(2)动态信息表:主要存储通讯状态下的其它Agent信息。在每个Agent启动与其他Agent通讯时,会将各种通讯状态信息登记到动态信息表中,并在退出时删除这些信息,以保持动态信息表的实时更新;消息缓存池:Agent用来存储发送和接收到的消息;通讯服务管理器:主要负责消息的XML格式封装和解析、消息同步传输控制。避免由于同步问题造成的因果错误。
将信息表、消息缓存池、通讯服务管理器和其他各部分分别定义成Java类的形式;把发送的消息封装成XML格式文档,然后进行传输。在底层采用TCP/IP通讯协议和socket通讯技术实现多仿真Agent结点的通讯。具体的操作方法是:
1.基于XML的消息封装和解析:1)在消息传输中,消息的语义内容是Agent通讯的核心部分。主要应用FIPA-ACL消息结构[5]。通过使用FIPA-ACL消息,每个Agent可以向其他Agent发送请求或请求服务。FIPAACL消息结构是一种基于原语的消息结构,由外到内分为3个层次:envelope、content、message。envelope:描述消息传输的各种附加信息,如发送者、接受者等;content:描述消息传输的具体内容;message:描述消息传输的各种参数,如消息使用的编码格式,传输的协议等。
每次消息只有在固有的原语范围内进行消息请求与服务(如接受(accept)、请求(request)等),扩展性较差。因此,为了克服协议响应结构对消息传送的限制。本文将这种消息结构封装成XML格式。XML格式的优点在于可以自定义诸多XML标记元素,并且XML元素可以绑定更多的信息,支持对其扩展。同时,传送时易于实现数据的压缩传输,提高了传输效率,即节约网络流量,减少通讯时间。如在message.dtd中扩展了优先级的属性。
基于XML的消息结构(message.dtd)如下:
<!ELEMENTacl-message(msg-type,msg-param)
<!ELEMENTmsg-type(agree|request|refuse|accept-proposal|cancel)>
<!ELEMENTagree(#PCDATA)>
……
<!ELEMENTmsg-param(#PCDATA)>
<!ATTLISTmsg-paramsenderCDATA#REQUIRED
receiverCDATA#REQUIRED
contentCDATA#REQUIRED
in-reply-toCDATA#REQUIRED
languageCDATA#REQUIRED
priorityCDATA#REQUIRED
>
例如:AgentA请求(request)AgentB去推动一个箱子。
传递消息结构(move.xml)如下:
<?xmlversion="1.0"?>
<!DOCTYPEacl-messageSYSTEM"message.dtd">
<acl-message>
<msg-type>request</msg-type>
<msg-paramsender="A"
receive="B"
content="action(agent-identifier:nameB)(deliverbox(loc12)"
language="fipa-sl"
protocol="fipa-request"
reply-with="order567"
priority="5">
</msg-param>
</acl-message>。
2)XML文档的解析
接收端为了识别具体的请求消息内容,需要对XML文档进行解析。解析的目的就是要从XML文档中读取用户所需要的数据。应用DOM解析器[6]实现对XML文档的解析。文档解析后,首先判断属于哪种类型的消息,然后根据消息激活相应的
动作。解析步骤如下:
(1)在javax.xml.parsers.DocumentBuilderFactory类中,调用newInstance()方法,生成一个DocumentBuilderFactory对象。
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
(2)应用factory调用newDocumentBuilder()方法生成DocumentBuilder
对象。
javax.xml.parsers.DocumentBuilderbuild=factory.newDocument-
Builder();
(3)build对象调用publicDocumentparse(Filef)方法解析f指定的XML文档,并通过Element类型对象来分析具有子孙关系节点的数据。
Org.w3c.dom.Documentdom=build.parse(newFile(move.xml));
Elementroot=dom.getDocumentElement();
(4)最后,解析出来的数据调用getElementByTagName(String)方法,识别各个标记节点内容。另外,对于含有属性的节点要做特殊的处理,让该节点对象调用NamedNodeMapgetAttributes()方法来解析属性内容。
NodeListnodelist=root.getElementByTagName(“acl-message”);
NamedNodeMapnnm=nodelist.item(i).getAttributes();//第i个结
点属性。
2.通讯服务管理器:1)仿真Agent间实现相互通讯就要处理Agent通讯过程中的各种事务。在每个通讯模块中设置一个通讯服务管理器。通讯服务管理器作为消息通讯的枢纽,在系统中起着核心作用。通讯服务管理主要包括XML文档转换与解析、Agent系统管理、Agent域名管理和消息传输过程管理。XML文档转换与解析:完成消息的XML格式封装和XML文件的解析;Agent域名管理:解析和查询其他Agent的名称、通讯地址和通讯端口等信息;Agent系统管理:负责仿真Agent内部其他模块间的协同操作;消息传输过程管理:主要完成通讯中服务监听与线程管理和消息发送与接收的传输控制,如消息传输同步控制;为其它Agent分配线程等。
通过定义如下的类与方法来实现通讯服务管理器的功能。服务监听与线程管理是由run方法进行处理。方法doComm-Manage用于完成消息传输的同步控制管理。消息的XML格式封装和解析分别由CreateXml类中的doConverXml方法和parseXml方法实现。
通讯服务管理类定义为:
ClassCommServerimplementsRunnable,IEventHandler
{CreateXmlcrxml=newCreateXml();
publicvoidsetup(){//启动服务监听}
pulicvoiddoCommManage(Stringmessage){}
publicvoidrun(){//服务监听与线程管理}
publicvoidsent()
{ZipOutputStreamout=newZipOutputStream(socket.getOutputStream());
out.putNextEntry(newZipEntry(“message1.xml”));
out.write();//将数据压缩后写入输出流;
}
publicStringreceive(){}
publicvoidaction(){
synchronized(this){}
//消息处理过程}
}。
2).鉴于多Agent仿真环境分布式的特点,为保证仿真Agent结点间通讯在时间和空间上的一致,本文给出了基于消息优先级的传输控制算法。首先让封装好的消息XML文件根据优先级高低进入传输任务就绪队列。优先级是根据传输任务紧急程度来确定的。
系统总是允许优先级最高的任务开始执行。当一个优先级更高的任务到达时,允许将当前传输任务暂时挂起,而令高优先级任务立即投入运行。采用这种方式能满足最紧急的消息优先传输。若所有的进程都具有相同的优先级初值,则最先进入先执行。在具体实现时对高优先级任务采用同步代码块策略来控制,从而保证消息传送在时间和空间上的一致。在传送时,为了保证通讯的有效性,以最小的通讯时间来决定何时采用本地通讯,何时采用远程通讯。