jade的中文资料

 
 
 
第一章 绪论
1.1问题概述
多Agent系统是由多个可以相互交互的,称为Agent的计算单元所组成的系统.Agent作为计算机系统具有两种重要的能力.首先,每个Agent至少在某种程度上可以自治行动,由它们自己决定需要采取什么行动以实现其设计目标.其次,每个Agent可以与其他Agent进行交互,这种交互不是简单地交换数据,而是参与某种社会行为,就像我们在每天的生活中发生的那样:合作,协作和协商等.
多Agent系统是计算机科学中比较新的一个分支,从20世纪80年代才开始研究,而直到20世纪90年代中才得到广泛的认同.从此以后国际上对这个领域的兴趣大为增加.这种研究热情的快速增加至少部分的是由于认识到Agent是一种合适的软件范例,这种范例为研究大规模分布式开放系统(如Internet)提供了可能性.尽管多Agent系统在探索Internet的潜力方面能起到关键的作用,但是多Agent系统的作用远不止如此.对于理解和构造各种所谓的人工社会系统来说,多Agent系统似乎是一个自然的比喻.多Agent的思想并不局限在某个特定的领域,像在此前出现的对象一样,多Agent系统会在许多不同的应用领域中广泛出现.
1.2该领域技术发展现状
近年来,随着计算机技术的不断发展和应用的广泛普及,随着国际互联网络的出现和发展,计算机软件系统结构和计算机组织结构的复杂性不断增加,从而为软件系统的开发提出了更多,更复杂的要求,如可伸缩性,多功能性,可重用性,鲁棒性,一致性.传统的整体设计和集中控制的软件开发方法越来越显示出其固有的局限性.同时软件系统的设计越来越向个性化,智能化方向发展,一些大型软件系统纷纷采用了人工智能的技术.因此可以说智能化,分布式是未来软件设计的方向.
作为人工智能和分布式计算的结合,分布式人工智能正逐渐收到人们的重视.分布式人工智能研究的目标是要创建描述自然和社会系统精确的概念模型.在分布式人工智能中,由于智能本质上不是一个独立存在的概念,而智能在团体中实现,因此分布式人工智能研究感兴趣的主要是几个Agent之间的合作,交互等方面.分布式问题求解考虑怎样将一个特殊问题求解工作在多个合作的,知识共享的模块或节点之间划分;在多Agent系统中,主要研究一组自治的智能Agent之间智能行为的协调.知识,规划,不同技能和自身动作的协调是一个过程,在多Agent系统非常重要.
目前对Agent和多Agent系统的研究主要集中在以下几个方面:Agent和多Agent的理论,Agent的体系结构和组织,Agent语言,Agent之间的协作和协调,通信和交互技术,多Agent学习以及多Agent系统应用等.关于多Agent系统的应用已经有人做了许多工作,甚至应用于一些大型,复杂的系统,例如机场管理,自动驾驶,高级机器人系统,分布式电力管理,信息检索等.
现在,关于Agent的研究不仅得到了人工智能研究人员的关注,也吸引了数据通讯,人机界面设计,机器人,并行工程等各个领域的研究人员的兴趣.有人认为:"基于Agent的计算(Agent-based
Computing,简称ABC)将成为软件开发的下一个重要的突破."
1.3全文安排
本文首先简单的介绍了Agent特点,接着引出一个用于开发多Agent系统的平台-JADE.并结合一个"图书交易"系统,分析如何利用JADE平台创建多Agent系统,以及Agent是如何在平台上执行任务,进行通讯的.内容概要如下:
第二章 Agent简介
第三章 JADE平台介绍
第四章 基于JADE平台的"图书交易"系统
第五章 全文总结
最后是附录,参考书目以及致谢.
第二章 Agent简介
2.1Agent技术的起源与发展
进入20世纪90年代以来,在各种计算机文献和众多公司的技术发展规划中,Agent正日渐成为使用频率最高的词汇之一.下面就对Agent技术的发展做一个简要的阐述.
智能Agent技术的诞生和发展是人工智能 技术(AI)和网络技术发展的必然结果.从20世纪60年代起,传统的AI技术开始致力于对 知识表达 , 推理 , 机器学习等技术的研究,其主要成果是 专家系统.专家系统把专业领域知识与推理有机的组合在一起,为应用程序的智能化提供了一个低级而实用的解决办法.作为人工智能的一个分支,AI计划理论的研究成果使应用程序有了初步的面向目标和特征,即应用程序具有了某种意义上的主动性;而人工智能的另一个分支-决策理论和方法则使应用程序具有了自主判断和选择的行为的能力.人工智能围绕着知识所进行的广泛研究和应用正逐步形成一门新的学科,这就是 知识工程,它涉及的知识的获取,存储和管理等许多课题.所有这些技术的发展加快了应用程序智能化的进程.
随着网络技术的发展,多个应用程序间相互作用的模式正从单一的集成式系统向分布式系统演化.一个在物理上和地理上分布的应用程序之间通信与合作的网络地层基础结构正逐渐建立起来.分布式对象技术(如CORBA或DCOM技术)则进一步使分布且异构的应用程序之间能以一种共同的方式提供和获得服务,实现了在分布式状态下的"软"集成.
智能化和网络化的发展促成了Agent技术的发展,Agent技术正是为解决复杂,动态,分布式智能应用而提供的一种新的计算手段.
2.2Agent定义
目前并不存在一个被普遍接受的Agent的定义,事实上,对这个问题尚有争论,并存在不同的看法.尽管把自治性作为Agent的核心概念已经达成了普遍的共识,但除此之外很少有一致的看法.
Wooldridge和Jennings在总结了前人在Agent领域的一些工作后认为,可以从狭义和广义两个方面去理解Agent的特性
(1)Agent弱概念
这是从广义的角度来规定Agent的特性.几乎所有被称为Agent的软件或硬件系统都具有以下的特性:
自治性 (Autonomy):Agent运行时不直接由人或者其它东西控制,它对它们自己的行为和内部状态有一定的控制权.
社会能力(Social Ability)或称可通信性:Agent能够通过某种Agent通信语言(agent communication language)与其它Agent进行信息交换.
反应能力(Reactivity):即对环境的感知和影响.无论Agent生存在现实的世界中(如机器人,Internet上的通讯Agent,用户界面Agent等)还是虚拟的世界中(如虚拟商场中的Agent,交互式游戏中的Agent等),它们都应该可以感知它们所处的环境,并通过行为改变环境.一个不能对环境做出影响的物体不能被称作Agent.
自发行为(Pro-activeness):传统的应用程序是被动地由用户来运行的,而且机械地完成用户的指令;而Agent的行为应该是主动的,或者说自发的.Agent感知周围环境的变化,并作出基于目标的行为(goal-directed behaviour).
在这种定义下,最简单的Agent就是具有上述特性的一个计算机进程,这个进程可以简单到只是个具有某种智能的子程序,能够与别的Agent交换消息.Agent弱概念使Agent不仅仅只应用于人工智能领域,而且广泛地应用在诸如人机界面,通信,并行工程,软件工程,搜索引擎等.因此很多计算机软件都可以纳入Agent的范畴里来,例如处理Internet事务,帮助用户处理E-mail的助理Agent等.
Marvin Minsky从多Agent系统的社会智能的角度给出Agent的一个定义:"这些进程我们称之为Agent,每个Agent本身只会做一些简单的事情,但当我们用特定的方法将这些Agent组成一个Agent群(society),就产生了真正的智能."
Minsky的定义显然也是一种广义的定义.
(2)Agent强概念
对某些研究者,尤其是人工智能的研究者来说,Agent除了应具有上面这些特性以外,还应该具有某些通常人类具有的特性.例如知识,信念,意图,承诺等心智状态.有的学者甚至提出了有情感的Agent.
当前对强概念Agent的研究主要集中在理论方面.例如,Shoham提出的面向Agent编程(AOP Agent-Oriented Programming)使用的就是强概念的Agent定义:"一个Agent是这样一个实体,它的状态可以看作是由信念(belief),能力(capability),选择(choice),承诺(commitment)等心智构件(mental component)组成."
(3)Agent的其它属性
长寿性(Longevity):传统应用程序在用户需要时激活,不需要时或者运算结束后停止.Agent与之不同,它应该至少在"相当长"的时间内连续地运行.
移动性(Mobility):Agent可以从一个地方移动到另一个地方而保持其内部状态不变.Agent可以携带数据和能够在远处执行智能指令.
推理能力(Reasoning):Agent可以根据其当前的知识和经验,以理性的,可再生的方式推理或推测.
规划能力(Planning):根据目标,环境等的要求,Agent应该至少对自己的短期行为作出规划.虽然程序设计人员可以提供一些常见情况的处理策略,但这些策略不可能覆盖Agent将遇到的所有情况.所以,Agent应该有生成规划的能力.
学习和适应能力(Learning and Adaptability):Agent可以根据过去的经验积累知识,并且修改其行为以适应新的环境.另外,有些学者还提出Agent应该具有自适应性,个性等特性.
诚实(Veracity):假定Agent不会故意提供错误信息.
善意(Benevolence):假定在Agent之间不会存在相互冲突的目标,且Agent总是尽力去帮助其它Agent.
理性(Rationality):假定Agent总是尽力去实现自己的目标.
2.3Agent的适用领域
与用户有灵活的相互作用,在互相作用中智能地协助用户完成琐碎的工作.
在对海量分布式信息搜索中,建立快速智能的搜索机制.
在高度动态的环境下,要求应用程序能对多边的环境作出响应或自适应.
需要应用程序能自主处理失效或冲突,以进行在调度,再计划或资源再分配.
需要应用程序既能进行长期计划驱动的行为,又能从事短期试试响应行为.
在复杂的或安全性很重要的应用程序中,保证适宜的反应和应答时间.
在地理上或逻辑上分布,自主或异构的节点间提供应用服务或中间件服务.
在不完全信息下的复杂或分散的资源分配问题.
2.4agent技术的标准化
FIPA(Foundation for Intelligent Physical Agents)是一个由IBM,NHK,BT等公司和政府,学术机构组成的权威的Agent标准化组织(http://www.fipa.org),目前该组织正致力于以下三个主要领域的标准制定:
Agent管理需要认同和发现Agent(白,黄页服务),需要定义它们的各种状态以及哪些角色能与它们相互作用.
Agent相互作用覆盖最高层Agent间相互作用的标准,包括Agent间传递的信息的意义,命令,请求,义务等.
Agent与软件的接口.
此外FIPA还制定了4个参考应用领域的标准,包括个人旅行助手,个人助手,声/视娱乐广播,网络管理等.正在制定的标准包括人类Agent的相互作用,产品设计与制造Agent,Agent安全管理,支持移动性的Agent管理,Ontology(共享语汇)服务,Agent消息传送,Agent命名,内容语言库等.尽管FIPA标准仍在制定和发展之中,但是随着越来越多组织的加入,它必将称为促进Agent应用和发展的主要推动力.
第三章JADE平台介绍
3.1JADE平台简介
JADE(Java Agent Development Framework)是一个软件开发框架,用于开发多Agent系统和符合FIPA标准的智能Agent应用程序.它包含两个主要的产品:一个符合FIPA标准的Agent平台和一个开发JAVA
Agent的包.
JADE完全是由JAVA编写的,由各种JAVA包组成,它为应用程序员既提供现成的功能片断,同时也为自定义的应用程序任务提供抽象接口.由于JAVA的许多良好的特性,它是一种很特别的编程语言,特别是它在分布式的不同环境中的面向对象编程方法,例如对象序列化(Object Serialization),反映性API(Reflection API)和远程方法唤醒(Remote Method Invocation RMI).
JADE主要由下面的包组成:
jade.core实现系统的核心.它包含必须被应用程序员继承的Agent类,除此以外,jade.core.behaviours子包还包含一个Behaviour类层次结构.行为实现了一个Agent的任务或意图.它们是逻辑活动单元,并且可以以不同的方式组合,以获取不同的执行方式,当然,它们是可以并行执行的.应用程序员定义Agent的操作,编写行为以及Agent的执行路径.
jade.lang.acl子包用于依照FIPA标准规定处理Agent通讯语言(ACL).
jade.content包包含了一组类用于支持用户定义的概念和语言.
jade.domain包包含了所有那些由FIPA标准定义的,描述Agent管理实体的JAVA类,特别是AMS和DF
Agent,它们提供生命周期服务和白黄页服务.子包jade.domain.FIPAAgentManagement包含了FIPA Agent管理的概念和描述其概念的类.子包jade.domain.JADEAgentManagement则包含了JADE对Agent管理的扩展(例如,对消息的探测以及控制Agent的生命周期).子包jade.domain.introspection包含了用于描述在JADE工具和JADE内核之间沟通领域的概念.子包jade.domain.mobility包含了描述移动通信的概念.
子包Jade.gui包含了一组一般的类,用于建立用户图形界面,用来显示和编辑Agent标识符,Agent描述,ACL消息……
jade.mtp包包含了一个JAVA接口.为了容易用JADE框架集成,每个消息传送协议必须利用这个接口,它还包含了一组这些协议的执行.
jade.proto包包含了建模标准交互协议的类(如:fipa-request, fipa-query, fipa-contract-net, fipa-subscribe和其他一些被FIPA定义的类),同时也包含了帮助应用程序员建立自定义的协议的类.
3.2JADE的特点
下面是JADE提供给Agent编程人员的JADE特点列表:
-分布式Agent平台.Agent平台可以分散在几个主机上(假设它们可以通过RMI连接起来).
-从远方主机用图形用户界面来管理Agent和Agent容器.
-在开发基于JADE的多Agent应用程序时,可以利用调试工具.
-平台内的Agent移动性,包括传递Agent的状态和代码(当需要的时候).
-通过行为模型,对多个平行,并行的Agent活动的支持.JADE以无优先权的方式对Agent行为进行调度.
-FIPA标准的Agent平台,包括AMS
(Agent管理系统),DF(目录服务),和ACC(Agent通讯通道).这三个组成部分在Agent平台启动时被自动激活.
-为了多域的应用程序,许多FIPA标准的DF在运行时可以被启动.在程序中,每个域是一组逻辑Agent,它们提供的服务通过一个公共的设备被公布出来.每个DF继承了GUI和所有由FIPA定义的标准功能(即,注册,注销,修改,搜索Agent标识符的功能和在网内连接DF的功能).
-在同一个Agent平台内有效率的ACL消息传输.事实上,消息在传送时是以JAVA对象被编码,而不是字符串,这样是为了避开编组和未编组的程序.当消息跨越平台边界的时候,它们被自动转换为FIPA标准的语法,编码方式,传输协议或反之.这种转换对于Agent执行者来说是透明的,它们只需要处理JAVA对象.
-FIPA交互协议库是现成可用的.
-通过AMS,Agent可以自动进行注册和注销.
-符合FIPA标准的命名服务:在启动时,Agent从平台上获取它们的GUID(全球唯一标识).
-对应用程序定义的相关语言和概念的支持.
-程序内接口,它允许外部应用程序启动自治的Agent.
3.3用JADE创建多Agent系统
3.3.1Agent平台
由FIPA定义的标准的Agent平台模式由以下几部分组成:
Agent管理系统(AMS)是负责监督管理对Agent平台的访问和使用的Agent.在一个单独的平台上,只能有一个AMS.AMS提供白黄页服务,以及生命周期服务,它保留了一个Agent标识符目录(AID)和Agent状态信息.每个Agent必须在AMS注册,以获得一个有效的AID.
目录服务(DF)是在平台上提供默认的黄页服务的Agent.
消息传输系统,又叫做Agent通信通道(ACC),是控制平台内所有的信息交换,包括与远端平台进行信息交换的软件.
图3-1JADE完全参照这个标准体系结构.因此,当一个JADE平台启动的时候,AMS和DF就自动被建立了,同时ACC模块允许消息进行传输.Agent平台允许建立在几个主机上.在每个主机上只有一个JAVA应用程序,当然也只有一个JAVA虚拟机(JVM)被执行.每个JAVA虚拟机是一个基本的Agent容器,它为Agent的执行提供一个运行环境,同时它允许几个Agent在同一个主机上并行的执行.主容器(main-container)是Agent容器,它包括AMS和DF,在那里注册RMI(它由JADE在内部使用).与主容器相关的其它容器,为任何一组JADE Agent的执行提供一个完整的运行环境.
图3-2
3.3.1.1DF服务
jade.domain.DFService利用一组静态方法来实现与一个标准的FIPA DF服务进行交互.它包含了从DF请求注册,注销,修改,搜索行为的方法.每个方法都有一个带有所有所需参数的版本,以及一个所 有省略参数都是默认值的版本 .
注意 , 这些方法将会阻塞每个 Agent 活动直至行为被成功的执行或者掷出了一个 jade.domain.FIPAException 违例 , 也就是说直到会话的结束 . 在某些情况下 , 以不阻塞的方式执行这些方法可能会更方便 . 在这些情况下 ,jade.proto.AchieveREInitiator
或者 jade.proto.SubscriptionInitiator 将与 createRequestMessage(),
createSubscriptionMessage(),decodeDone(), decodeResult()
decodeNotification() 联合使用 , 这将简化向 DF 发送消息的准备 , 以及从 DF 接受消息时的解码 .
3.3.1.2AMS服务
这个类与DFService类是成对的,它的服务是由一个标准的FIPA AMS
Agent提供的,并且它的界面是与DFService完全一致的.注意JADE在调用setup()前和takeDown()返回以后分别自动调用注册和注销方法,所以一般的程序员不用去调用它们.但是在某些特定的环境下,程序员可能需要调用它们.
3.3.2Agent类
Agent类是用户自定义Agent的公共基类.因此,从程序员的角度看,一个JADE Agent仅仅是用户自定义的继承了Agent类的一个实例.这表现了特性的继承性,这种继承行主要体现在Agent平台间交互(注册,配置,远程管理),以及用以实现自定义的Agent行为的一组基本方法(如收发消息,使用标准交互协议,注册域,...).Agent的计算模型是多任务的,任务(或是行为)是并行执行的.每个由Agent提供的功能/服务应该作为一个或者多个行为被执行(参考3.4行为的执行).Agent基类内的调度对程序员是透明的,它自动管理行为的调度.
3.3.2.1Agent生命周期
图3-3根据FIPA中的Agent平台生命周期,JADE Agent可以处于这几个状态之一,它们在Agent类中用几个常量来表示.这些状态分别是:
初始状态AP_INITIATED:Agent对象已经建立,但是还没有由AMS注册,既没有名字,也没有地址,而且不能与其它Agent进行通讯.
激活状态AP_ACTIVE:Agent对象已经由AMS注册,有正规的名字和地址,而且具有JADE的各种特性.
挂起状态AP_SUSPENDED:Agent对象当前被停止.内部的线程被挂起,没有Agent行为被执行.
等待状态AP_WAITING:Agent对象被阻塞,等待其它事件.内部的线程在JAVA 监控器上休眠,当条件满足时被唤醒(典型的情形是消息到达).
删除状态AP_DELETED:Agent死亡.内部的线程的执行被终结,Agent不再在AMS上有注册信息.
传送状态AP_TRANSIT:移动Agent移动至一个新的位置时进入这个状态.系统继续缓存将被送到这个新位置的消息.
拷贝状态AP_COPY:这是JADE在Agent克隆时的一个内部状态.
离开状态AP_GONE:这是JADE在移动Agent移至一个新的地点时的一个内部稳定状态.
注意Agent只有在激活状态时才允许执行行为(也就是任务). 注意如果任何一个行为调用 doWait() 方法 , 那么整个 Agent 及其所有的活动都被阻塞 , 而不仅仅是调用这个方法的行为 . block() 方法是 Behaviour 类的一部分 , 这是为了挂起一个单独的 Agent 行为 .
3.3.2.2Agent内的通讯
Agent类同样提供了一组用于Agent内通讯的方法.根据FIPA说明,Agent通过异步消息传输进行通讯,ACL消息的对象是交换的有效载荷.一些由FIPA定义的交互协议也是可由Agent活动调度的现成可用的行为,它们是jade.proto包的一部分.
Agent.send()方法可以发送ACL消息.接收槽保留了正在接收消息的Agent的ID.这种方法调用对于Agent的位置来说是透明的,也就是说无论是本地或是远程的Agent,是平台负责选择最合适的地址和传输机制.
3.3.2.3带有图形用户界面(GUI)的Agent
一个构造为多Agent系统的应用程序仍然需要与它的用户进行交互.因此,在应用程序中有必要至少在某些Agent上提供GUI.虽然这可能引起一些问题,这主要是因为Agent自治特性和普通用户图形界面的反映性间的不匹配造成的. 使用 JADE ,JADE Agent 采用的每个 Agent 一个线程的并发模式必须要与 Swing 并发机制配合使用 .
3.3.3Agent任务.执行Agent行为
为了响应不同的外部事件,Agent必须能够执行几个并行的任务.为了使Agent管理更加有效率,每个JADE Agent都由一个单独的执行线程组成,并且它的任务都是模型化的,可以作为Behaviour的对象来执行.同样可以执行多线程的Agent,但是JADE并没有对此提供特别的支持.
想要执行一个基于Agent的任务的开发者应该定义一个或者更多Behaviours子类,实例化它们,并把任务对象添加到Agent任务列表中.类Agent是必须由Agent程序员继承的,提供了两个方法:addBehaviour(Behaviour)和removeBehaviour(Behaviour),它们允许用来管理一个具体任务的就绪队列.注意行为和子行为可以在需要的时候添加进来,而不仅仅是在Agent.setup()方法内部.添加一个行为应该被看做在Agent内产生一个新的(合作)执行线程的方式.
由Agent基类执行的调度程序对于程序员来说是透明的,对于就绪队列中所有有效的行为,它的调度策略是无优先权的时间片轮转法,执行Behaviour-derived类,直至释放控制权(这在action()方法返回时执行).如果任务没有放弃控制权,它将在下一次轮转是被重新调度.在等待消息到达时,行为同样可以被阻塞.具体的说,Agent调度程序执行就绪行为队列中每个行为的action()方法.当action()返回时,done()方法被调度,它用来检测行为是否完成.如果完成了,行为对象将从队列中删除.
行为像合作线程一样工作,但是,没有保存任何栈.因此,整个运行状态必须被保留在Behaviour和它相关的Agent的临时变量中.
为了防止在激活状态等待消息(这样会浪费CPU的时间),允许每个Behaviour阻塞它自己的运行.当action()方法返回时,block()方法就把行为放到阻塞行为队列中.注意,因此,阻塞的结果并不是在调用block()方法后立即体现出来,而是在action()方法返回后.
在新的消息到达后,所有被阻塞的行为将重新被调度,因此程序员必须考虑再次阻塞与到达的消息不相关的行为.此外,一个行为对象可以通过向block()方法传递一个时间域值把自己阻塞一端有限的时间.在JADE后来的版本中,考虑了更多的唤醒事件.
因为从Agent行为中进行选择时,采用的是无优先权的多任务模型,Agent程序员必须注意避免使用无限循环,以及在action()方法内部执行长的操作.记住,当某个行为的action()运行时,其它的行为都不能执行,直至action()结束(这当然只是考虑同一个Agent内的行为,其它Agent的行为是运行在不同的java线程内,当然可以继续独立的运行).
除此以外,既然没有保存任何堆栈,每次action()方法都是从头开始运行,action()方法不可以在中间打断,也不可以把CPU让给其它的行为,然后从行为离开的位置,启动最初的那个行为.
3.4交互协议
FIPA规定了一组标准的交互协议,可以以它们作为标准模板来建立Agent间的对话.对于Agent间的每一次对话,JADE都区分了发起者(发起会话的Agent)和回应者(在与其它Agent取得联系后参与到会话中的Agent).JADE依据大部分的FIPA交互协议,为会话中的两个角色都提供了行为类.正如在这节中所描述的,这些类都可以在jade.proto包中找到.它们通过一个同类的API提供了回叫方法来处理协议的各个状态.
所有的发起者行为一达到交互协议的某个最终状态,就会立即结束,并从Agent的任务队列中删除.为了不必重新建立新的java对象就能再次使用代表这些行为的java对象,所有的发起者都包含了一些带有合适参数的复位方法.此外,所有的发起者行为,不只是FipaRequestInitiatorBehaviour都可以进行一对多的会话,也就是说可以在同一时间处理几个回应者.
所有的回应者行为则是循环的,并且它们在达到交互协议的某个最终状态时将被重新调度.注意,这个特性允许程序员限制Agent应该并行执行的回应者的最大数量.
3.5对移动Agent的支持
使用JADE,应用程序的开发者能够建立移动Agent,它能够在多网络主机结见移动或复制自己.在JADE的这个版本中,只支持intra-platform移动性,这是一个能够在不同的Agent的container间移动的JADE移动Agent,但是它被限制于一个单独的JADE平台内.
移动或者克隆被视为Agent生命周期状态转换过程的一个状态.如同所有的其它生命周期的操作一样,Agent移动或是克隆可以由Agent自己或是AMS发起.Agent类提供了一个合适的API,而AMS
Agent能够通过FIPA ACL访问.
移动Agent为了能够决定什么时间以及向哪里移动,它们需要记住自己的位置.因此,JADE提供了一个所有者的概念,命名为jade-mobility-ontology,它保留了必要的概念和行动.
第四章 基于JADE平台上的"图书交易"系统
"图书交易"系统是一个利用JADE创建Agent的例子,利用这个例子来分析Agent是如何执行任务以及彼此间通讯的.
4.1"图书交易"系统要实现的功能
这个"图书交易"系统包括了一些代表个各自用户的"售书"Agent和"买书"Agent.
4.1.1买方Agent
买方Agent不带有GUI,用户将要购买的书目("target
book")以命令行参数的方式传递给买方Agent.买方Agent接着定期的向已知的卖方Agent发送购书请求.当有卖方Agent提供(offer)该书时,买方Agent接受该消息,并执行"买"的动作.如果不止一个卖方Agent提供这本书,买方Agent将接受最优(也就是最便宜)的一个.在交易完成后,买方Agent结束.
4.1.2卖方Agent
卖方Agent启动了一个简单的GUI,通过它,用户可以向本地的书目列表(catalogue)中添加新的书目.卖方Agent将一直运行,不断的等待来自买方Agent的购书请求.当收到买方Agent的请求时,它们先要检查请求的书目是否在本地的书目列表中.如果在,它们该书的价格作为回应发送给请求该书的买方Agent;如果不在,它们将发送拒绝(refuse)消息.当收到购买(purchase)命令时,卖方Agent将执行这个操作,并将请求的图书从本地的图书列表中删除.
4.2建立JADE Agent-Agent类
建立一个JADE Agent,最主要的是要定一个继承了jade.core.Agent类的类.并且该类还要执行setup()方法.代码如下:
import jade.core.Agent;
public class BookBuyerAgent extends Agent {
protected void setup() {
// 打印问候语
System.out.println("Hallo! Buyer-agent "+getAID().getName()+" is ready.");
}
}
setup()方法主要是用于Agent的初始化.而Agent实际上要完成的任务将在行为(behaviours)中执行.
4.2.1agent标识符
前面已经介绍了Agent标识符的表示方法.每个Agent标识符都是jade.core.AID的一个实例.Agent类的getAID()方法可以用来获取Agent的标识符.如果知道了Agent的昵称(nickname),可以通过下面的方式获取它的AID:
String nickname = "Peter";
AID id = new AID(nickname, AID.ISLOCALNAME);
ISLOCALNAME常量表明,方法的第一个参数代表的只是一个昵称,并不是一个全球唯一的标识.
4.2.2结束Agent
在上面给出的简单的代码中,Agent即使执行完了打印问候语的任务,Agent仍然是继续运行的.如果想结束这个Agent,必须调用这个Agent类的doDelete()方法.takeDown()在Agent结束前被调用,它的作用是进行一些Agent的清除工作,比如释放Agent占用的各种资源.
4.2.3向Agent中传递参数
在Agent启动时,我们可以通过命令行向Agent传递一些参数,参数在命令行要用小括号括起来.这些参数可以作为Object数组,通过Agent类的getArguments()方法获得.正如在前面提到的,我们希望把用户要买的书目以命令行参数的方式传递给买方Agent.为此,代码可以扩展如下:
import jade.core.Agent;
import jade.core.AID;
public class BookBuyerAgent extends Agent {
// 想要买的书目
private String targetBookTitle;
//已知卖方列表
private AID[] sellerAgents = {new AID("seller1", AID.ISLOCALNAME),
new AID("seller2", AID.ISLOCALNAME)};
//agent初始化
protected void setup() {
// 打印问候语
System.out.println("Hallo! Buyer-agent "+getAID().getName()+" is ready.");
// 获取启动参数,以便得到要买的书目名,
Object[] args = getArguments();
if (args != null && args.length > 0) {
targetBookTitle = (String) args[0];
System.out.println("Trying to buy "+targetBookTitle);
}
else {
//立即结束买方Agent
System.out.println("No book title specified");
doDelete();
}
}
// 把Agent的清除操作放在这里
protected void takeDown() {
//打印结束信息
System.out.println("Buyer-agent "+getAID().getName()+" terminating.");
}
}
4.3Agent执行的任务-Behaviour类
Agent实际上要完成的任务(task)应该在行为(behaviours)中被执行.每个行为都代表了Agent要执行的一个任务.每个行为都是一个继承了jade.core.behaviours.Behaviour.的类的对象.可以通过Agent类的addBehaviour方法把行为添加到Agent中.在任何地方都可以把行为添加到Agent中,比如在用来初始化Agent的setup()方法中,甚至在其它行为内部再添加一个行为.
每个继承了Behaviour的类,都必须执行action()方法,这个方法实际上定义了这个行为运行时执行的操作.done()方法的返回值是布尔型的.这个返回值表明了该行为是否已经结束,行为一旦结束,就必须从Agent的行为池中删除.
4.3.1行为调度和执行
Agent可以同时执行几个行为.行为一旦被调度执行了它的action()方法,那么它将一直运行下去知道该方法返回.因此什么时候从一个行为的执行切换到下一个行为的执行是由程序员来决定的.图4-1描述了Agent线程的执行流程:
图4-1
从上图可以看出来,下面示例的行为的action()方法是永远不会返回的:
public class OverbearingBehaviour extends Behaviour {
public void action() {
while (true) {
//执行某个任务
}
}
public boolean done() {
return true;
}
}
如果没有什么行为需要执行,那么Agent线程将要休眠,因为这样可以提高CPU的利用率.一旦有行为需要执行时,该线程将立即被唤醒.
4.3.2只执行一次的行为(One-shot behaviours),循环执行的行为(cyclic behaviours)和一般的行为(generic
behaviours)
这里主要讲讲三种主要类型的行为.
只执行一次的行为:这种行为的action()方法只执行一次,并且行为立即结束.jade.core.behaviours.OneShotBehaviour类已经把done()方法的返回值设为true,我们可以继承这个类,来完成我们自己定义的只执行一次的行为,举例如下:
public class MyOneShotBehaviour extends OneShotBehaviour {
public void action() {
//执行某个操作X
}
}
操作X只能执行一次
循环执行的行为:这种类型的行为从来不会结束,它的action()方法每次被调用时执行相同的操作,jade.core.behaviours.CyclicBehaviour类已经把done()方法的返回值设为false,我们可以通过继承这个类,来完成我们自己定义的循环执行的行为,举例如下:
public class MyCyclicBehaviour extends CyclicBehaviour {
public void action() {
// 执行某个操作Y
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值