编程语言
首页 > 编程语言> > JADE(Java Agent Development Framework)笔记

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行为挂起。

Agent通信

JADE Agent提供的最重要的特性之一是通信能力。 采用的通信范式是异步消息传递。 每个Agent都有一种邮箱(Agent消息队列),JADE 运行时在其中发布其他Agent发送的消息。 每当在消息队列中发布消息时,都会通知接收Agent。 然而,如果Agent真正从消息队列中提取消息进行处理,则完全取决于程序员。

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();
                }
            }});
    }
}

标签:Development,Java,JADE,agent,Agent,方法,public,消息
来源: https://blog.csdn.net/sunamnxin/article/details/118488154