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