JADE笔记之:消息模板简介
MessageTemplate class 利用MessageTemplate可以针对ACLMessage的每个属性设置模式,以达到过滤消息的目的。
为了可以构建更复杂的匹配规则,多个模式也可以进行and,or,not运算。
最有用的一些规则或方法包括:通信行为匹配,发送者匹配,会话ID匹配。
比如MatchPerformative( performative ) 是通信行为的匹配。
这里 performative 可能是:
RM
ACLMessage.PROPOSE
ACLMessage.AGREE
还有发送者匹配MatchSender( AID ),会话匹配
MatchConversationID( String ),通信协议匹配MatchProtocol( String ) ,本体匹配MatchOntology( String)。
比如:MessageTemplate mt = MessageTemplate.and(
MessageTemplate.Match Performative( R M ),
MessageTemplate.Match Sender( new
AID( "a1", AI D.ISLOCALNAME))) ;
相当于建立了一个模板,表示消息规则为INFORM行为并且发送者为“a1”。
接收过程如下:ACLMessage msg = receive( mt );
if (msg != null) { ... handle message }
block();
示例:package jadePrime.acl;
import jade.core.Agent;
import jade.core.AID;
import jade.core.behaviours.*;
import ng.acl.*;
public class Template extends Agent {
MessageTemplate mt1 = MessageTemplate.and(
MessageTemplate.MatchPerformative( R M ),
MessageTemplate.MatchSender( new
AID( "a1",AID.ISLOCALNAME))) ;
protected void setup()
{
// Send messages to "a1" and "a2"
ACLMessage msg = new ACLMessage(RM); msg.setContent( "Ping" );
for (int i = 1; i<=2; i++)
msg.addReceiver( new AID( "a" + i,
AID.ISLOCALNAME) );
send(msg);
// Set-up Behaviour 1
addBehaviour(new CyclicBehaviour(this)
{
public void action( )
{
System.out.print("Behaviour ONE: ");
ACLMessage msg= receive( mt1 );
if (msg!=null
System.out.println( "gets "
+ msg.getPerformative() + " from
" + msg.getSender().getLocalName() + "="
+ msg.getContent() );
else
System.out.println( "gets NULL" ); block();
}
});
// Set-up Behaviour 2
addBehaviour(new CyclicBehaviour(this)
{
public void action()
{
System.out.print("Behaviour TWO: ");
ACLMessage msg= receive();
if (msg!=null)
System.out.println( "gets "
+ msg.getPerformative() + " from "
+ msg.getSender().getLocalName() + "=" + msg.getContent() );
else
System.out.println( "gets NULL" );
block();
}
});
}
}
package jadePrime.acl;
import jade.core.Agent;
import jade.core.behaviours.*;
import ng.acl.*;
public class Responder extends Agent {
protected void setup()
{
addBehaviour(new CyclicBehaviour(this)
{
public void action()
{
ACLMessage msg = receive();
if (msg!=null) {
ACLMessage reply = msg.createReply();
reply.setPerformative( RM );
reply.setContent(" Gossip....." );
send(reply);
reply.setPerformative( ACLMessage.PROPOSE );
reply.setContent(" Really sexy stuff... cheap! "); send(reply);
}
block();
}
});
}
}
输出结果::。
jade用法 -回复
jade用法-回复Jade是一种快速而简单的模板引擎,用于将数据和静态内容结合生成HTML代码。
它使用简洁的语法和有效的嵌套,可以轻松地创建可维护和可读性强的模板。
本文将一步一步回答关于Jade的用法和功能的问题。
第一步:安装和设置Jade要开始使用Jade,首先需要安装它。
可以使用npm(Node Package Manager)在命令行中运行以下命令进行安装:npm install jade安装完成后,就可以在Node.js环境中使用Jade了。
第二步:创建Jade模板接下来,需要创建一个Jade模板文件。
可以使用任何文本编辑器,创建一个新文件,并将其保存为`.jade`文件类型。
例如,可以创建一个名为`index.jade`的文件作为我们的示例。
第三步:Jade语法基础Jade的语法非常简洁,使用缩进和标签代替HTML中的添加斜杠和尖括号。
以下是一些常用的Jade语法规则:1. 标签:在Jade中,可以使用缩进和行内标签来表示HTML标签。
例如,使用`div`关键字可以创建一个`<div>`标签。
2. ID和类:可以使用井号`#`和点号`.`来定义ID和类。
例如,`#container`表示`<div id="container">`,`.red`表示`<div class="red">`。
3. 属性:可以使用圆括号和等号来设置HTML元素的属性。
例如,`(href='/page')`表示`<a href="/page">`。
4. 文本:可以直接在Jade模板中添加文本。
例如,`h1 Hello Jade!`表示`<h1>Hello Jade!</h1>`。
第四步:变量和数据绑定与其他模板引擎类似,Jade允许将数据绑定到模板中,以便在渲染时动态更新内容。
JADE中文教程,包还一个真实系统
目录第一章绪论 (3)1.1问题概述 (3)1.2该领域技术发展现状 (3)1.3全文安排 (5)第二章AGENT简介 (6)2.1Agent技术的起源与发展 (6)2.2Agent定义 (7)2.3Agent的适用领域 (10)2.4agent技术的标准化 (10)第三章JADE平台介绍 (12)3.1JADE平台简介 (12)3.2JADE的特点 (14)3.3用JADE创建多Agent系统 (15)3.3.1Agent平台 (15)3.3.2Agent类 (17)3.3.3Agent任务.执行Agent行为 (19)3.4交互协议 (21)3.5对移动Agent的支持 (22)第四章基于JADE平台上的"图书交易"系统 (23)4.1"图书交易"系统要实现的功能 (23)4.1.1买方Agent (23)4.1.2卖方Agent (23)4.2建立JADE Agent-Agent类 (24)4.2.1agent标识符 (24)4.2.2结束Agent (25)4.2.3向Agent中传递参数 (25)4.3Agent执行的任务-Behaviour类 (27)4.3.1行为调度和执行 (28)4.3.2在特定的时间点执行某个操作 (31)4.4"图书交易"系统执行的行为 (32)4.4.1买方Agent的行为 (33)4.4.2卖方Agent的行为 (34)4.5Agent间通讯-ACLMessage类 (37)4.5.1发送消息 (37)4.5.2"图书交易"系统中的各类消息 (37)中文翻译 (95)1 介绍 (95)2 JADE 特点 (99)3 用JADE创建多agent系统 (100)3.1 Agent平台 (100)3.2 Agent类 (105)第一章绪论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标准化组织(),目前该组织正致力于以下三个主要领域的标准制定: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的执行路径.ng.acl子包用于依照FIPA标准规定处理Agent通讯语言(ACL).jade.content包包含了一组类用于支持用户定义的概念和语言.jade.domain包包含了所有那些由FIPA标准定义的,描述Agent 管理实体的JAVA类,特别是AMS和DFAgent,它们提供生命周期服务和白黄页服务.子包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-23.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 AMSAgent提供的,并且它的界面是与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都可以进行一对多的会话,也就是。
zotero文献笔记模板
zotero文献笔记模板
在使用Zotero进行文献笔记时,可以根据个人需求和研究领域的不同,制定适合自己的模板。
下面是一个常见的Zotero文献笔记模板,包括了一些常用的字段和内容:
1. 文献信息:
作者,作者的姓名或团体名称。
标题,文献的标题。
出版年份,文献的出版年份。
期刊/书名,文献所属的期刊名称或书籍名称。
卷号/期号,文献所在期刊的卷号和期号。
页面范围,文献所在期刊或书籍的页面范围。
2. 摘要,文献的摘要内容,可以是作者自己总结的关键信息。
3. 主要观点/结论,文献中的主要观点或结论,可以是作者的研究发现或分析结果。
4. 方法/实验设计,文献中使用的方法或实验设计,可以是作者的研究方法或实验步骤的描述。
5. 关键词,文献的关键词,用于标识文献的主题或内容。
6. 相关文献,与该篇文献相关的其他文献,可以是引用该篇文献的其他研究,或者是该篇文献引用的其他研究。
7. 个人评论/评价,个人对该篇文献的评论或评价,可以包括对该篇文献的优点、不足或进一步研究的建议。
这只是一个基本的模板,你可以根据自己的需求进行调整和扩展。
使用Zotero时,可以在文献条目的“笔记”或“附注”字段中填写上述内容,以便更好地整理和管理你的文献信息。
希望以上信息对你有帮助!。
jade模板引擎用法
jade模板引擎用法Jade(也被称为Pug)是一种流行的模板引擎,常用于和Express应用程序中。
以下是使用Jade模板引擎的一些基本步骤:1. 安装Jade:首先,确保你的系统已经安装了。
然后,通过npm(Node 包管理器)安装Jade。
在终端中运行以下命令:```npm install jade```2. 设置视图引擎:在你的Express应用程序中,将视图引擎设置为Jade。
这可以通过在你的应用代码中添加以下行来完成:```javascript('view engine', 'jade');```3. 设置视图目录:设置视图文件的存放路径。
例如,如果你的视图文件位于`views`文件夹中,可以使用以下代码设置视图目录:```javascript('views', (__dirname, 'views'));```4. 渲染视图:在你的Express路由处理程序中,使用`()`方法来渲染视图。
例如,如果你有一个名为`index`的视图,可以这样渲染它:```javascript('index');```5. 在Jade模板中编写HTML:在Jade模板中,你可以编写HTML标记,并使用Jade的语法来定义变量、条件语句和循环。
例如:```pugdoctype htmlhtmlheadtitle= pageTitlebodyh1 My Jade Templatep= message```在上面的例子中,`pageTitle`和`message`是在渲染模板时传递给模板的变量。
6. 传递数据给视图:在渲染视图时,你可以传递数据给模板。
例如,你可以这样传递一个名为`user`的对象:```javascript('user', { user: { name: 'John', age: 30 } });```然后在模板中访问这些数据:```pugh1= , // 输出 "John 30"```7. 使用条件语句和循环:在Jade模板中,你可以使用条件语句和循环。
学习agent必备!最全的JADE程序员指南
JADE程序员指导Jade集成开发环境是一个入门级的产品,但是它仍然拥有强大的功能。
它提供的用户图形界面包含了大部分SUN SDK工具,可以方便的编辑源代码,生成一个类,执行一个java程序或java applet. Jade提供的高效率的功能可以让你为每个project生成单独的类模板,这个功能包括生成使用AWT或Swing APIs对话窗口。
Jade可以使用Sure shot的Jive Lint支持静态代码检查,同时也提供了入门级的调试功能。
新版本提供了如下功能:允许用户在XML 编辑器中调用用户提供的函数;方法定位(method location)采用了树形视图。
1简介程序员指南由管理员指南作为补充,在jade/doc目录下可以找到可用的HTML文档。
如果本指南和HTML文档之间哪里出现了冲突,以经常更新的HTML文档为准。
JADE(Java Agent Development Framework)是一个软件开发框架,它可以为智能AGENT 开发多AGENT系统和遵守FIAP协议的应用程序。
它包含两个主要的产品:一个是与FIPA 相适应的agent平台,另一个是开发Java agents的包。
JADE是完全用JA V A编码的,如果agent程序员想探索本框架,他/她的agents就应该按照这个程序员指南中描述的大纲用Java 编码。
这个指南是在假设读者熟悉FIPA标准,至少是熟悉Agent Management specifications(FIPA no.23),Agent Communication Language和ACL Message Structure(FIPA no.61)的基础上编写的JADE是用JA V A写的由各种JA V A包构成,给程序设计者以完备的功能接口和规范的抽象性界面,具体应用取决与任务。
选择JA V A语言是因为它有许多独特的特点,尤其是在分布式异质环境下的面向对象的编程连接方式;这些特点还包括Object Serialization,Reflection API和Remote Method Invocation(RMI)。
Express全系列教程之(十):jade模板引擎
Express全系列教程之(⼗):jade模板引擎⼀、前⾔随着前端业务的不断发展,页⾯交互逻辑的不断提⾼,让数据和界⾯实现分离渐渐被提了出来。
JavaScript的MVC思想也流⾏了起来,在这种背景下,基于node.js的模板引擎也随之出现。
什么是模板引擎?它⽤于解析动态数据和静态页⾯所⽣成的视图⽂件,将原本静态的数据变为动态,快速地实现页⾯交互;⽬前使⽤较⼴的模板引擎有以下⼏种:Jade / Pug、EJS、Handlebars。
jade模板引擎jade模板引擎相较于原来的html会显得更加简洁,它将标签原本的"<>"符号去掉,⽤括号代替,层级使⽤tab缩进来分,并且也⽀持js语法;⼆、jade的基本使⽤安装jade:cnpm install jade --save 在程序中引⼊jade:app.set('views',"public"); //设置视图的对应⽬录app.set("view engine","jade"); //设置默认的模板引擎app.engine('jade', require('jade').__express); //定义模板引擎 特定路由渲染:e("/",function(req,res){res.render("index.jade");}); 完整实例:const express=require("express");const jade=require("jade");const fs=require('fs');var app=express();//引⽤jadeapp.set('views',"public"); //设置视图的对应⽬录app.set("view engine","jade"); //设置默认的模板引擎app.engine('jade', jade.__express); //定义模板引擎//获取jade⽂件var str=jade.renderFile("./public/index.jade",{pretty:true});console.log(str);e("/",function(req,res){res.render("index.jade");});app.listen(8080); 由上⾯的app.set('views',"public");可知,这⾥将jade⽂件放在了public⽂件夹下:在执⾏res.render时,会⾃动渲染public中的index.jade⽂件,之后转换为HTML5进⾏dom渲染显⽰。
jade用法
Jade(或 Pug)是一种流行的模板引擎,用于将HTML代码转换为动态网页。
它使用简洁的语法,使HTML代码更易于编写和维护。
1.安装Jade:首先,您需要在项目中安装Jade。
您可以使用npm(Node包管
理器)来安装Jade。
在终端中运行以下命令:
2.创建Jade文件:在您的项目中创建一个以.pug为扩展名的文件。
例如,您
可以创建一个名为index.pug的文件。
3.编写Jade语法:在Jade文件中,您可以使用特定的语法来编写HTML代
码。
例如,要编写一个段落,您可以使用以下语法:
这将生成以下HTML代码:
您还可以使用条件语句、循环等来动态生成HTML代码。
例如,以下代码将根据条件显示不同的内容:
这将生成以下HTML代码:
或
4.编译Jade文件:使用Jade编译器将Jade文件编译为HTML代码。
您可以使
用命令行工具或构建工具(如Webpack或Gulp)来完成此操作。
例如,使
用命令行工具编译Jade文件的命令如下:
这将生成一个名为index.html的输出文件,其中包含编译后的HTML代码。
5. 渲染Jade模板:最后,您可以使用服务器或框架(如Express)来渲染Jade 模板并呈现动态网页。
具体实现方式取决于您使用的技术和工具。
jade用法 -回复
jade用法-回复Jade是一种流行的HTML模板引擎,为web开发提供了一种优雅简洁的方式来生成HTML代码。
本文将一步一步地回答有关Jade用法的问题,帮助读者更好地理解和应用Jade。
第一步:安装Jade要使用Jade,首先需要在本地环境中安装它。
可以通过npm(Node.js 的包管理器)来安装Jade,打开终端或命令行界面,并运行以下命令:npm install jade -g这将全局安装Jade,使您可以在任何项目中使用它。
第二步:创建Jade文件在项目文件夹中创建一个新的Jade文件,使用`.jade`作为文件扩展名。
例如,创建一个名为`index.jade`的文件。
第三步:编写Jade代码在Jade文件中,可以使用缩进来表示元素层次结构。
Jade还提供了许多特殊语法和功能,使得编写HTML变得更简洁。
以下是Jade的一些常用用法:1. 标签:只需在标签名称后面加上一个空格,然后输入元素内容。
例如,要创建一个标题,可以使用以下代码:h1 This is a heading2. 类和ID选择器:可以使用`.`和`#`来表示类和ID选择器。
例如,要将一个元素指定为具有类名为"container"的div,可以使用以下代码:div.container3. 属性:可以使用括号将属性添加到元素中。
例如,要在a标签中添加href属性,可以使用以下代码:a(href=' Link to example4. 循环:使用`each`关键字可以轻松地进行循环操作。
例如,要遍历一个数组并创建一个无序列表,可以使用以下代码:uleach item in ['Item 1', 'Item 2', 'Item 3']li= item5. 条件语句:可以使用`if`和`else`语句来实现条件逻辑。
例如,要根据条件显示不同的消息,可以使用以下代码:- var isLoggedIn = trueif isLoggedInp Welcome back, user!elsep Please log in.第四步:编译Jade文件编写完Jade代码后,需要将其编译为HTML文件。
jade模板引擎中文教程
• 没有前缀的标签
•
AST filters
• 过滤器
o
:sass 必须已经安装 sass.js
o
:less 必须已经安装 less.js
o
:markdown 必须已经安装 markdown-js 或者 node-discount
o
:cdata
o
:coffeescript 必须已经安装 coffee-script
} return buf.join("");
}
通过使用 Jade 的 ./runtime.js 你可以在浏览器使用这些预编译的模板而不需要使用 Jade, 你 只需要使用 runtime.js 里的工具函数, 它们会放在 jade.attrs, jade.escape 这些里。 把选 项 { client: true } 传递给 pile(), Jade 会把这些帮助函数的引用放在 jade.attrs, jade.escape. function anonymous(locals, attrs, escape, rethrow) {
会被 翻译成 下面的 函数:
function anonymous(locals, attrs, escape, rethrow) { var buf = []; with (locals || {}) { var interp;
buf.push('\n<p>Hello ' + escape((interp = name) == null ? '' : interp) + '\n</p>');
bar(); } else {
baz(); }
JADE中文教程及笔记
目录第一章绪论 (3)1.1问题概述 (3)1.2该领域技术发展现状 (3)1.3全文安排 (5)第二章AGENT简介 (6)2.1Agent技术的起源与发展 (6)2.2Agent定义 (7)2.3Agent的适用领域 (10)2.4agent技术的标准化 (10)第三章JADE平台介绍 (12)3.1JADE平台简介 (12)3.2JADE的特点 (14)3.3用JADE创建多Agent系统 (15)3.3.1Agent平台 (15)3.3.2Agent类 (17)3.3.3Agent任务.执行Agent行为 (19)3.4交互协议 (21)3.5对移动Agent的支持 (22)第四章基于JADE平台上的"图书交易"系统 (23)4.1"图书交易"系统要实现的功能 (23)4.1.1买方Agent (23)4.1.2卖方Agent (23)4.2建立JADE Agent-Agent类 (24)4.2.1agent标识符 (24)4.2.2结束Agent (25)4.2.3向Agent中传递参数 (25)4.3Agent执行的任务-Behaviour类 (27)4.3.1行为调度和执行 (28)4.3.2在特定的时间点执行某个操作 (31)4.4"图书交易"系统执行的行为 (32)4.4.1买方Agent的行为 (33)4.4.2卖方Agent的行为 (34)4.5Agent间通讯-ACLMessage类 (37)4.5.1发送消息 (37)4.5.2"图书交易"系统中的各类消息 (37)中文翻译 (95)1 介绍 (95)2 JADE 特点 (99)3 用JADE创建多agent系统 (100)3.1 Agent平台 (100)3.2 Agent类 (105)第一章绪论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标准化组织(),目前该组织正致力于以下三个主要领域的标准制定: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的执行路径.ng.acl子包用于依照FIPA标准规定处理Agent通讯语言(ACL).jade.content包包含了一组类用于支持用户定义的概念和语言.jade.domain包包含了所有那些由FIPA标准定义的,描述Agent 管理实体的JAVA类,特别是AMS和DFAgent,它们提供生命周期服务和白黄页服务.子包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-23.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 AMSAgent提供的,并且它的界面是与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都可以进行一对多的会话,也就是。
