JADE学习笔记3:Agent行为

3.1 Behaviour类

Agent的实际工作包含在行为(Behaviour类)中,一个行为表示Agent携带的任务,继承jade.core.Behaviours类。
Behaviour类都包含两个抽象方法。action()方法定义了行为执行时Agent需要进行的工作,done()方法返回一个boolean型的变量,显示行为是否执行完整并从Agent行为执行队列中删除。行为定义好后,通过addBehaviour()方法添加到Agent上。
一个Agent可以并发执行多个behaviour。每个Agent线程启动后执行的过程如下:

Behavious类还有很多子类,分别对应着不同类型的Behaviour,包括SimpleBehaviour,SequencesBehaviour,ParallelBehavior,CyclicBehavior等。

3.2 SimpleBehaviour类(简单行为类)

这个抽象类构造了简单原子行为。先看一个简单例子:

package jadetest;

import jade.core.Agent;
import jade.core.behaviours.SimpleBehaviour;

public class Agent1 extends Agent {
    public void setup() {
        SimpleBehaviour b=new SimpleBehaviour() {
            boolean finished = false;
            @Override
            public boolean done() {
                // TODO 自动生成的方法存根
                System.out.println("Finished!");
                return finished;
            }

            @Override
            public void action() {
                // TODO 自动生成的方法存根
                System.out.println("Hello!");
                System.out.println("The local name is :"+getLocalName());
                System.out.println("The unique name is :"+getName());
                System.out.println("The AID is :"+getAID());
                finished = true;
            }
        };
        addBehaviour(b);
    }
}

运行 -gui:hello jadetest.Agent1,结果如下:

Hello!
The local name is :hello
The unique name is :hello@10.160.31.56:1099/JADE
The AID is :( agent-identifier :name hello@10.160.31.56:1099/JADE  :addresses (sequence http://ASIA-20161230DB:7778/acc ))
Finished!

简单行为又分为四种:
OneShotBehaviour类:单次简单行为。其action()方法只执行一次,done() 方法始终返回true值。

import jade.core.Agent;
import jade.core.behaviours.Behaviour;
import jade.core.behaviours.OneShotBehaviour;

public class L1 extends Agent{

    public void setup() {
        Behaviour b1=new OneShotBehaviour() {

            @Override
            public void action() {
                // TODO 自动生成的方法存根
                System.out.println("this is a oneshotbehaviour");
            }
        };
        this.addBehaviour(b1);
    }
}

CyclicBehaviour类:循环简单行为。其action()方法循环执行,done()始终方法返回false。

package cyclicbehaviour;
import jade.core.*;
import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;

public class L2 extends Agent{
    public void setup() {
        Behaviour b1=new CyclicBehaviour() {

            @Override
            public void action() {
                // TODO 自动生成的方法存根
                ACLMessage al=receive();
                if(al!=null) {
                    System.out.println("I receive a message:"+al.getContent()+",this message is from"+al.getSender());
                }
            }
        };
        this.addBehaviour(b1);
    }
}

WakerBehaviour类:叫醒行为。实现了一个超出了指定时间之后只执行一次的任务。

new WakerBehaviour(this,5000) { //5s后执行

            @Override
            protected void onWake() {
                // TODO 自动生成的方法存根
                System.out.println("wakerbehaviour");
            }

        }

TickerBehaviour类:实现了一个周期性执行的循环任务。

new TickerBehaviour(this,5000) { //5s执行一次

            @Override
            protected void onWake() {
                // TODO 自动生成的方法存根
                System.out.println("wakerbehaviour");
            }

        }

综合实例:

package l_1_complexbehaviour;
import jade.core.*;
import jade.core.behaviours.*;

public class L1 extends Agent{

    class behaviour1 extends Behaviour{

        private int step=1;
        boolean finished = false;

        @Override
        public void action() {
            // TODO 自动生成的方法存根
            switch(step) {
            case 1:
                System.out.println("step 1");
                break;
            case 2:
                myAgent.addBehaviour(new OneShotBehaviour() {

                    @Override
                    public void action() {
                        // TODO 自动生成的方法存根
                        System.out.println("step 2");
                    }
                });
                break;
            case 3:
                myAgent.addBehaviour(new WakerBehaviour(myAgent,2000) {
                    @Override
                    protected void onWake() {
                        // TODO 自动生成的方法存根
                        System.out.println("step 3");
                    }
                });
                break;
            case 4:
                System.out.println("step 4");
                break;
            }
            step++;
        }

        @Override
        public boolean done() {
            // TODO 自动生成的方法存根
            if(step==5)finished=true;
            return finished;
        }       

        @Override
        public int onEnd() {  //done()方法返回真时调用
            // TODO 自动生成的方法存根
            myAgent.doDelete();
            System.out.println("finished");
            return super.onEnd();
        }
    }

    public void setup() {
        System.out.println("start");
        this.addBehaviour(new CyclicBehaviour() {

            @Override
            public void action() {
                // TODO 自动生成的方法存根
                System.out.println("cyclicing");
            }
        });
        this.addBehaviour(new behaviour1());
    }

}

运行结果:

start
cyclicing
step 1
cyclicing
cyclicing
step 2
cyclicing
step 4
finished

Agent运行占用一个独立的线程,并允许并发执行多个行为。这个例子中,行为类和循环行为同时运行,done()方法返回为真时,行为类action()方法不再运行,并调用行为类中的onEnd()方法,此时,循环行为类仍在继续。只有当doDelete()方法调用后,Agent终止,所有行为都要结束。

3.3 组合行为

JADE提供了三个常用的组合类:SequentialBehaviour、ParallelBehaviour以及FSMBehaviour类。

3.3.1 SequentialBehaviour(串行行为类)

按顺序将行为添加到复合类中,其包含两个常用方法:
addSubBehaviour()方法:将子行为添加到串行行为中。
removeSubBehaviour()方法:删除子行为。
实例:

package sequentialbehaviour;

import jade.core.Agent;
import jade.core.behaviours.*;
public class L3 extends Agent{
    public void setup() {
        SequentialBehaviour s=new SequentialBehaviour(this);
        s.addSubBehaviour(new OneShotBehaviour() {

            @Override
            public void action() {
                // TODO 自动生成的方法存根
                System.out.println("this is a oneshotbehaviour");
            }
        });
        s.addSubBehaviour(new WakerBehaviour(this,4000) {
            @Override
            protected void onWake() {
                // TODO 自动生成的方法存根
                System.out.println("this is a wakerbehaviour");
            }
        });
        s.addSubBehaviour(new SimpleBehaviour(this) {
            boolean fin=false;
            @Override
            public void action() {
                // TODO 自动生成的方法存根
                System.out.println("this is a simplebehaviour");
                fin=true;
            }

            @Override
            public boolean done() {
                // TODO 自动生成的方法存根
                return fin;
            }

        });
        this.addBehaviour(s);
    }
}

运行结果如下:

this is a oneshotbehaviour
this is a wakerbehaviour
this is a simplebehaviour

3.3.2 ParallelBehaviour(并行行为类)

addSubBehaviour()方法:将子行为添加到串行行为中。
removeSubBehaviour()方法:删除子行为。
另:ParallelBehaviour.WHEN_ALL:所有行为执行完后并行行为结束。
ParallelBehaviour.WHEN_ANY:任一行为执行完后并行行为结束。

package parallelbehaviour;
import jade.core.*;
import jade.core.behaviours.*;

public class L4 extends Agent{
    public void setup() {
        ParallelBehaviour p1=new ParallelBehaviour(this,ParallelBehaviour.WHEN_ALL);
        p1.addSubBehaviour(new OneShotBehaviour() {

            @Override
            public void action() {
                // TODO 自动生成的方法存根
                System.out.println("oneshotbehaviour");
            }
        });
        p1.addSubBehaviour(new WakerBehaviour(this,5000) {

            @Override
            protected void onWake() {
                // TODO 自动生成的方法存根
                System.out.println("wakerbehaviour");
            }

        });
        p1.addSubBehaviour(new SimpleBehaviour(this) {

            boolean finished =false;
            @Override
            public boolean done() {
                // TODO 自动生成的方法存根
                return finished;
            }

            @Override
            public void action() {
                // TODO 自动生成的方法存根
                System.out.println("simple behaviour");
                finished = true;
            }
        });
        this.addBehaviour(p1);
    }
}

执行结果:

simple behaviour
wakerbehaviour

3.3.3 FSMBehaviour类

有限状态机对子行为进行调度,并设定子行为状态转移规则。
例子:一个复合行为有A、B、C三个行为。首先执行A,并得到一个返回值作为选取下一个子行为的标准。当返回为0时,执行B,当返回为1时,执行C。A、B在没有转换条件时默认互相转换。C作为最后一个行为,执行后终止。
registerState():中间状态
registerFirstState():初始状态
registerLastState():终止状态
两个输入参数:行为类,String类(表示行为名称),onEnd()方法返回值作为状态转移标志。
registerTransition():转换规则函数,三个输入参数。行为A,行为B以及String类型转换条件。
registerDefaultTransition():默认转换函数,两个行为类参数。
代码:

import jade.core.*;
import jade.core.behaviours.*;
public class L5 extends Agent {

    public void setup() {
        FSMBehaviour fsm=new FSMBehaviour() {
            @Override
            public int onEnd() {
                // TODO 自动生成的方法存根
                System.out.println("FSMBehaviour finished");
                myAgent.doDelete();
                return super.onEnd();
            }
        };
        fsm.registerFirstState(new OperationA(), "A");//初始行为
        fsm.registerState(new OperationB(), "B");//中间行为
        fsm.registerLastState(new OperationC(), "C");//终止行为
        fsm.registerTransition("A", "B", 0);//转换规则
        fsm.registerTransition("A", "C", 1);
        fsm.registerDefaultTransition("B","A");//默认转换
        addBehaviour(fsm);
    }

    private class OperationA extends OneShotBehaviour{

        private int num;

        @Override
        public void action() {
            // TODO 自动生成的方法存根
            num=(int)(Math.random()*100+1);
            System.out.println("Here is A,and the random num is : "+num);
        }
        @Override
        public int onEnd() {
            // TODO 自动生成的方法存根
            return num%2;
        }
    }

    private class OperationB extends OneShotBehaviour{

        @Override
        public void action() {
            // TODO 自动生成的方法存根
            System.out.println("Here is B");
        }

    }

    private class OperationC extends OneShotBehaviour{

        @Override
        public void action() {
            // TODO 自动生成的方法存根
            System.out.println("Here is C");
        }

    }
}

运行结果:(随机产生的数不同,结果也不一样)

Here is A,and the random num is : 88
Here is B
Here is A,and the random num is : 20
Here is B
Here is A,and the random num is : 84
Here is B
Here is A,and the random num is : 28
Here is B
Here is A,and the random num is : 95
Here is C
FSMBehaviour finished
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值