JADE(Java Agent Development Framework)笔记
2021/7/5 14:09:21
本文主要是介绍JADE(Java Agent Development Framework)笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
JADE笔记
JADE(Java Agent Development Framework)是一个软件开发框架,它可以为智能AGENT开发多AGENT系统和遵守FIAP协议的应用程序。
FIPA是1996年建立的,作为一个国际性非营利组织,它主要负责制定和软件Agent技术相关的一系列标准。FIPA标准提出的核心观念是Agent通信、Agent管理和Agent体系结构。这里简单介绍,之后用到在具体说明。
1)Agent通信。Agent之间是使用Agent通信语言(ACL)进行交互的。FIPA-ACL是基于言语行为理论的,强调消息代表了一种行为或者说通信行为,同时,根据消息的目的、表达方式等不同,定义消息行为有通知、请求、同意、拒绝等,其涵盖了基本通信中最常用的行为方式。
2)Agent管理。Agent管理框架中,兼容FIPA的Agent是可以存在、进行操作和有效管理的,其为Agent的创建、注册、定位、通信、迁移和操作建立了逻辑参考模型。
3)抽象体系结构。抽象体系结构允许建立具体实现,同时提供它们之间的互操作机制,包括传输和解码的网关转换。这种结构详细定义了ACL消息结构、消息传输、Agent目录服务,并将目录服务指定为强制性的服务。
FIPA定义的一个agent平台的标准模型,如下图所示:
AMS是管理控制进出和使用AP的agent。一个平台上只能有一个AMS。它提供百页和生命周期服务,维护AID目录和agent状态。为了获得有效的AID,每个agent都必须在AMS上注册。
DF是平台上提供默认黄页服务的agent。
消息传输系统也叫agent通信通道(ACC),由软件构成在平台内负责所有的消息交换,包括来自或发送到远程平台的消息。
JADE完全遵守这个参考架构,当一个JADE平台被启动,AMS和DF立刻被创建,ACC模块也设置为允许消息通信。Agent平台可以分布在不同的主机上。但一台主机上只能有一个应用程序即一个JAVA虚拟机运行。每个JVM是一个基本的agents容器,它为agent的执行提供完全运行时环境,并允许若干agents在同一台主机上并行执行。创建主容器或front-end,它是AMS和DF存在以及RMI注册的agent容器,被JADE内部使用。其它agent容器与主容器相连,为任何JADE agents的执行提供完全运行时环境。
Agent类
agent生命周期
根据FIAP规范中的AP生命周期理论,JADE agent可以处于若干状态中的一种,如图3所示,下面将详细介绍:
l 创建:创建agent对象,但没有在AMS上注册,也没有名字和地址,不能其它agents通信。
l 活动:agent对象在AMS上注册,有一个合格的名字和地址,可以访问所有JADE特征。
l 挂起:agent对象当前被停止。它的内部线程被暂停,没有agent行为被执行。
l 等待:agent对象被阻塞,等待什么。它的内部线程处于睡眠状态,当一些条件满足时被唤醒(典型地是消息到达)。
l 删除:agent明确地死亡。内部线程终止它的执行,agents不再注册在AMS上。
l 转移:当移动agent向新的地址迁移时进入这个状态。系统连续缓存消息,之后将发往它的新的地址。
Agent类提供公共方法使其在各种状态间转换,这些方法从FIPA规范agent管理中的有限状态机(the Finite State Machine)内的适当的转换中获取它们的名字。
例如,doWait()方法把agent从活动的状态转变为等待状态,doSuspend()方法把agent从活动或等待状态转变为挂起状态,…参考agent类的HTML文档,它提供这些doXXX()方法的完整列表。
注意:只有在活动状态下,代理才能执行它的行为(即它的任务)。小心:如果任何一个行为调用doWait()方法,那么整个agent和它的所有活动都将被阻塞,而不仅仅是调用该方法的行为。block()方法是Behaviour类的一部分,它允许单个agent行为挂起。
-
运行配置–基于idea
-
JADE框架根据如下步骤控制一个新agent的产生:执行了agent的构造器,赋予agent一个ID(详情见HTML文档中jade.core.AID类),注册到AMS上,处于活动状态,最终执行setup()方法。通过getAID()得到agent的标识。
任何行为都可以调用Agent.doDelete()方法来停止agent执行。
当agent准备转到删除状态,即它将要被销毁,就要执行Agent.takeDown()方法。程序员可以通过重载takeDown()方法来实现任何必须的清除行动。当调用这个方法时,agent仍然是注册到AMS上的,因此可以发送消息到其他的agent,但是只要在takeDown()方法完成之后,agent就会被注销,它的线程也会被销毁。 -
Behaviour类
-
Agent的实际工作包含在行为(Behaviour类)中,一个行为表示Agent携带的任务,继承jade.core.Behaviours类。
Behaviour类都包含两个抽象方法。action()方法定义了行为执行时Agent需要进行的工作,done()方法返回一个boolean型的变量,显示行为是否执行完整并从Agent行为执行队列中删除。行为定义好后,通过addBehaviour()方法添加到Agent上。Behavious类还有很多子类,分别对应着不同类型的Behaviour,包括SimpleBehaviour,SequencesBehaviour,ParallelBehavior,CyclicBehavior等。 -
agent线程生命周期
-
SimpleBehaviour类
1.OneShotBehaviour:立即完成且其 action() 方法仅执行一次的“一次性”行为。
jade.core.behaviours.OneShotBehaviour 已经通过返回 true 实现了 done() 方法,并且可以方便地扩展以实现一次性行为。public class MyOneShotBehaviour extends OneShotBehaviour { public void action() { // perform operation X } }
2.CyclicBehaviour:永远不会完成的“循环”行为,其 action() 方法在每次调用时都执行相同的操作。 jade.core.behaviours.CyclicBehaviour 已经通过返回 false 实现了 done() 方法,并且可以方便地扩展以实现循环行为。
public class MyCyclicBehaviour extends CyclicBehaviour { public void action() { // perform operation Y } }
JADE 提供了两个现成的类(在 jade.core.behaviours 包中),通过它们可以轻松实现在给定时间点执行某些操作的行为。
3.WakerBehaviour 的 action() 和 done() 方法已经实现,在给定的时间(在构造函数中指定)到期后执行 handleElapsedTimeout() 抽象方法。 执行 handleElapsedTimeout() 方法后,行为完成。
public class MyAgent extends Agent { protected void setup() { System.out.println(“Adding waker behaviour”); addBehaviour(new WakerBehaviour(this, 10000) { protected void handleElapsedTimeout() { // perform operation X } } ); } }
4.TickerBehaviour 的 action() 和 done() 方法已经以这样一种方式实现,即在每次执行后重复等待给定时间段(在构造函数中指定)执行 onTick() 抽象方法。 TickerBehaviour 永远不会完成。
public class MyAgent extends Agent { protected void setup() { addBehaviour(new TickerBehaviour(this, 10000) { protected void onTick() { // perform operation Y } } ); } }
-
-
Agent通信
JADE Agent提供的最重要的特性之一是通信能力。 采用的通信范式是异步消息传递。 每个Agent都有一种邮箱(Agent消息队列),JADE 运行时在其中发布其他Agent发送的消息。 每当在消息队列中发布消息时,都会通知接收Agent。 然而,如果Agent真正从消息队列中提取消息进行处理,则完全取决于程序员。
- 消息格式遵循FIPA-ACL消息结构,每条消息包括以下几个内容:
1)sender:消息的发送者,用Agent标志AID表示。
2)receivers:接受Agent消息的Agent,可以是多个。
3)Reply-to:应收到回应的接受者。
4)Performative:通信行为或称通信原语,标志发送消息的目的,即发送者想要通过发送消息干什么。通常有这样一些常值:REQUEST,INFORM,ACCEPT_PROPOSAL,REJECT_PROPOSAL,PROPOSE等。如REQUEST表示发送者希望接收者执行一个特定的任务,INFORM表示发送者希望接收者了解一些事情,PROPOSE或者CFP(Call For Proposals)表示发送者希望进行一次谈判。
5)Content:消息的内容。
6)Language:内容语言,比如内容的编码格式。
7)ontology:双方都能够理解的消息内容的概念说明和语义描述。
public class Sender extends Agent{ public void setup() { addBehaviour(new Behaviour() { private boolean finished = false; @Override public void action() { // TODO 自动生成的方法存根 doWait(5000); ACLMessage acl=new ACLMessage(ACLMessage.INFORM); //通知 AID r=new AID(); r.setLocalName("Rec"); //设置接收Agent的本地名 acl.addReceiver(r); //添加到ACL消息中 acl.setSender(getAID()); //设置发送者本地名,这里可以省略 acl.setContent("Hello,Rec"); //设置内容 send(acl); //向Rec发送消息 System.out.println("local name is:" + getLocalName()); System.out.println(getLocalName()+" send Hello to Rec"); System.out.println("the content is : "+acl.getContent()); System.out.println("send finished"); doWait(5000); finished=true; doDelete(); } @Override public boolean done() { // TODO 自动生成的方法存根 return finished; } }); } }
public class Receiver extends Agent { public void setup() { addBehaviour(new CyclicBehaviour() { @Override public void action() { // TODO 自动生成的方法存根 ACLMessage acl1=receive(); if(acl1!=null) { System.out.println("receiving"); doWait(2000); System.out.println(getLocalName()+" receive a message"); System.out.println("the message is: "+acl1.getContent()); System.out.println("the message is: "+acl1.getSender().getLocalName()); doDelete(); } }}); } }
这篇关于JADE(Java Agent Development Framework)笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-23线下车企门店如何实现线上线下融合?
- 2024-12-23鸿蒙Next ArkTS编程规范总结
- 2024-12-23物流团队冬至高效运转,哪款办公软件可助力风险评估?
- 2024-12-23优化库存,提升效率:医药企业如何借助看板软件实现仓库智能化
- 2024-12-23项目管理零负担!轻量化看板工具如何助力团队协作
- 2024-12-23电商活动复盘,为何是团队成长的核心环节?
- 2024-12-23鸿蒙Next ArkTS高性能编程实战
- 2024-12-23数据驱动:电商复盘从基础到进阶!
- 2024-12-23从数据到客户:跨境电商如何通过销售跟踪工具提升营销精准度?
- 2024-12-23汽车4S店运营效率提升的核心工具