jade Agent执行的任务-Behaviour类
Agent实际上要完成的任务(task)应该在行为(behaviours)中被执行.每个行为都代表了Agent要执行的一个任务.每个行为都是一个继承了jade.core.behaviours.Behaviour.的类的对象.可以通过Agent类的addBehaviour方法把行为添加到Agent中.在任何地方都可以把行为添加到Agent中,比如在用来初始化Agent的setup()方法中,甚至在其它行为内部再添加一个行为.
每个继承了Behaviour的类,都必须执行action()方法,这个方法实际上定义了这个行为运行时执行的操作.done()方法的返回值是布尔型的.这个返回值表明了该行为是否已经结束,行为一旦结束,就必须从Agent的行为池中删除.
行为调度和执行
Agent可以同时执行几个行为.行为一旦被调度执行了它的action()方法,那么它将一直运行下去知道该方法返回.因此什么时候从一个行为的执行切换到下一个行为的执行是由程序员来决定的.
Agent线程的执行流程:
从上图可以看出来,下面示例的行为的action()方法是永远不会返回的:
public class OverbearingBehaviour extends Behaviour {
public void action() {
while (true) {
//执行某个任务
}
}
public boolean done() {
return true;
}
}
如果没有什么行为需要执行,那么Agent线程将要休眠,因为这样可以提高CPU的利用率.一旦有行为需要执行时,该线程将立即被唤醒.
Jade 行为类 有三种基本行为:只执行一次的行为(One-shot behaviours)、循环执行的行为(cyclic behaviours)和一般的行为(generic behaviours)。
只执行一次的行为:这种行为的action()方法只执行一次,并且行为立即结束.
jade.core.behaviours.OneShotBehaviour类已经把done()方法的返回值设为true,我们可以继承这个类,来完成我们自己定义的只执行一次的行为,举例如下:
public class MyOneShotBehaviour extends OneShotBehaviour {
public void action() {
//执行某个操作X
}
}
操作X只能执行一次
循环执行的行为:这种类型的行为从来不会结束,它的action()方法每次被调用时执行相同的操作,jade.core.behaviours.CyclicBehaviour类已经把done()方法的返回值设为false,我们可以通过继承这个类,来完成我们自己定义的循环执行的行为,举例如下:
public class MyCyclicBehaviour extends CyclicBehaviour {
public void action() {
// 执行某个操作Y
}
}
操作Y将永远被执行下去,知道执行这个行为的Agent结束.
一般的行为:这种类型的行为都包含了一个状态值,并依据这个状态值执行不同的操作.这种行为通常是一个大的switch语句,当满足某个条件时,这个行为就结束了.
举例如下:
public class MyThreeStepBehaviour extends Behaviour {
private int step = 0;
public void action() {
switch (step) {
case 0:
// 执行操作X
step++;
break;
case 1:
//执行操作Y
step++;,
break;
case 2:
// 执行操作Z
step++;
break;
}
}
public boolean done() {
return step == 3;
}
}
操作X,Y,Z将一次被执行,接着这个行为结束了.JADE也提供了将这些简单的行为组合成更复杂的行为的功能.
Behavious类还有很多子类,分别对应着不同类型的behavious,包括SimpleBehaviour,sequences behaviors ,parallel behaviors,cyclic behaviors等。
下面举几个例子。
1)SimpleBehaviour简单行为例子
import jade.core.*;
import jade.core.behaviours.SimpleBehaviour;
public class HelloWorldBehaviours extends Agent{
public void setup(){
SimpleBehaviour hello_behaviour = new SimpleBehaviour(this){
boolean finished = false;
// 覆盖 Behaviour 类的action这一抽象方法
public void action(){
System.out.println("Hello World Behaviour run: Hello World!");
System.out.println("-----About Me:-----");
System.out.println("My local name is:"+getLocalName());
System.out.println("My globally unique name is:"+getName() );
System.out.println("-----About Here:-----");
Location l = here();
System.out.println("I am running in a location called:"+l.getName());
System.out.println("Which is identified uniquely as:"+l.getID());
System.out.println("And is contactable at:"+l.getAddress());
System.out.println("Using the protocol:"+l.getProtocol());
finished = true;
}
// done()在父类中也是一个抽象方法
public boolean done(){
return finished;
}
};
addBehaviour(hello_behaviour);
}
}
// java jade.Boot helloBehaviours:HelloWorldBehaviours
2)简单行为和循环行为(CyclicBehaviour)组合的例子
一个Agent中可以加入各种Behaviour构成composite behaviour。
在netbeans工程中编写下列程序,过程如前所描述。
package examplesbehaviours;
import jade.core.Agent;
import jade.core.behaviours.Behaviour;
import jade.core.behaviours.CyclicBehaviour;
import jade.core.behaviours.OneShotBehaviour;
public class SimpleAgent extends Agent {
private class FourStepBehaviour extends Behaviour {
private int step = 1;
public void action() {
switch (step) {
case 1:
System.out.println("Operation 1");
break;
case 2:
System.out.println("Operation 2. Adding one-shot behaviour");
myAgent.addBehaviour(new OneShotBehaviour(myAgent) {
public void action() {
System.out.println("One-shot");
}
});
break;
case 3:
System.out.println("Operation 3");
break;
case 4:
System.out.println("Operation 4");
break;
}
step++;
}
public boolean done() {
return step == 5;
}
public int onEnd() {
myAgent.doDelete();
System.out.println("Finished!");
return super.onEnd();
}
}
/** Creates a new instance of SimpleAgent */
protected void setup() {
System.out.println("Agent "+getLocalName()+" started.");
addBehaviour(new CyclicBehaviour(this) {
public void action() {
System.out.println("Cycling");
}
}
);
// Add the generic behaviour
addBehaviour(new FourStepBehaviour());
}
}
运行参数为 jade.Boot –gui guojie: examplesbehaviours.SimpleAgent
输出结果:Agent guojie started.
Cycling
Operation 1
Cycling
Operation 2. Adding one-shot behaviour
Cycling
Operation 3
One-shot
Cycling
Operation 4
Finished!注意每个Agent内部都有一个parallel behaviour,我们如果加入多个behaviour到Agent中,他们会并行执行。Behaviours加入到队列的顺序就是他们执行的次序。最后,behaviours可以动态的加入到agent以及composite behaviours。