[JADE]agent任务behaviours
在JADE中,一个活动的agent相当于一个完成任务的主体,而真正的任务的载体是 behaviour实例。每个Behaviour是jade.core.behaviours.Behaviours子类,agent实例通过引用其addBehaviour(behaviour)方法将behaviour加入agent中执行,在agent生命周期中的任何时刻都可以加入behaviours,behaviour中也可以嵌套behaviour。
每个behaviour必需实现jade.core.behaviours.Behaviours的两个抽象方法:action()和done()。
Action()方法中为需要实现任务的代码,done()方法返回一个布尔值来判断这个Behaviour是否完成其任务,是否应将其移出其所在的Agent所管理的behaviours池(每个agent可同时执行多个beheaviour,这些behaviour之间是相互合作关系)。
如下所示的OverbearingBehaviour 将永远阻止其它behaviour的执行,因为OverbearingBehaviour的done()返回在永远为真,如图一示;
public class OverbearingBehaviour extends Behaviour{
public void action(){
while(true){
//do something here..
}
}
public boolean done(){
return true;
}
}
图一
Agent生命周期及任务执行方式图二,需要注意的是,当一个agent没有可以执行的behaviour时,agent对应线程进入休眠状态,以节省CPU资源。
图二
JADE中三种主要的Behaviour
JADE中三种主要的Behaviour为: One-shot Behaviours,Cyclic behaviours和Generic behaviours.
One-shot Behaviours:即OneShotBehaviour类,是jade.core.behaviours.Behaviour的子类,其action()方法只执行一次,done()返回真, 如图三
Public class MyOneShotBehaviour extends OneShotBehaviour{
Public void action(){
// perform operation X
}
}
X只会执行一次;
图三
Cyclic behaviours: 即CyclicBehaviour类,是jade.core.behaviours.Behaviour的子类,其action()方法会不停的执行,直到agent执行behaviour结束,done()方法返回假。
Generic behaviours: 即普通的Behaviour, 其执行次数依赖于对象的状态,如图四:
public ThreeStepBehaviour extends Behaviour{
private int step=0;
public void action(){
switch(step){
case 0:
System.out.println("step 0");
step ++;
break;
case 1:
System.out.println("step 1");
step ++;
break;
case 2:
System.out.println("step 2");
step ++;
break;
}
}
public boolean done(){
return step==3;
}
}
图四
ThreeStepBehaviour中的action()方法会执行三次,因为在三次step++后,done()方法才会返回true;
每个behaviour都继承了jade.core.behaviours.Behaviours的onStart()和onEnd()方法,onStart()方法在第一次执行action()前调用,以初始化环境。onEnd方法将在done()方法返回真后调用,以做善后处理。
在任务时候,一个agent都可以调用其removeBehaviour()方法来移除一个任务,一个任务在被移除后,会自动调用其onEnd()方法。
一个Agent任务池中的每一个behavior,都会有一个宿主agent的引用,以调用宿主agent的资源。
另外,当任务池中的一个behaviour成功执行后需要重复执行,必先调用behaviour的reset()方法,否则会导致错误。