Behaviour類
原子行為。這個抽象類對由單個整體任務(wù)做出的且不能被中斷的行為進行建模。
一個行為表示Agent攜帶的任務(wù),繼承于jade.core.Behaviours類。
Behaviour類都包含兩個抽象方法。
action()方法定義了行為執(zhí)行時Agent需要進行的工作。
done()方法返回一個boolean型的變量,顯示行為是否執(zhí)行完整并從Agent行為執(zhí)行隊列中刪除。
addBehaviour()方法添加到Agent上。
代理可以同時執(zhí)行多種行為。 但是,必須注意的是,代理程序中行為的調(diào)度不是搶先的(對于Java線程而言),而是協(xié)作的。 這意味著當(dāng)計劃執(zhí)行某行為時,將調(diào)用其action()方法并一直運行直到返回。 因此,由程序員來定義代理何時從一種行為的執(zhí)行切換到另一種行為的執(zhí)行。
每個Agent線程啟動后執(zhí)行的過程如下:

Behavious類還有很多子類,分別對應(yīng)著不同類型的Behaviour,包括SimpleBehaviour,SequencesBehaviour,?ParallelBehavior,?CyclicBehavior等。?
SimpleBehaviour類
package cn.bcrab.agent;
import jade.core.Agent;
import jade.core.behaviours.SimpleBehaviour;
public class MyAgent01 extends Agent{
@Override
protected void setup() {
SimpleBehaviour sb = new SimpleBehaviour() {
boolean done = false;
@Override
public void action() {
System.out.println("---------SimpleBehaviour-------------");
System.out.println("The local name is :"+getLocalName());
System.out.println("The unique name is :"+getName());
System.out.println("The AID is :"+getAID());
done = true;
}
@Override
public boolean done() {
System.out.println("action done!");
return done;
}
};
this.addBehaviour(sb);
}
}
運行結(jié)果
---------SimpleBehaviour-------------
The local name is :simplehehaviour
The unique name is :simplehehaviour@Platform
The AID is :( agent-identifier :name simplehehaviour@Platform :addresses )
action done!
SimpleBehaviour類之 OneShotBehaviour類
原子行為僅執(zhí)行一次。應(yīng)用程序程序員可以擴展此抽象類,以為僅一次完成的操作創(chuàng)建行為。
package cn.bcrab.agent;
import jade.core.Agent;
import jade.core.behaviours.Behaviour;
import jade.core.behaviours.OneShotBehaviour;
public class MyAgent02 extends Agent{
@Override
protected void setup() {
Behaviour osb = new OneShotBehaviour() {
@Override
public void action() {
System.out.println("---------OneShotBehaviour-------------");
System.out.println("this is a OneShotBehaviour()");
}
};
this.addBehaviour(osb);
}
}
運行結(jié)果:
---------OneShotBehaviour-------------
this is a OneShotBehaviour()
SimpleBehaviour類之 CyclicBehaviour類
必須永遠執(zhí)行的原子行為。應(yīng)用程序程序員可以擴展此抽象類,以創(chuàng)建可連續(xù)執(zhí)行的行為(例如,簡單的反應(yīng)性行為)。其action()方法循環(huán)執(zhí)行,done()始終方法返回false。
package cn.bcrab.agent;
import jade.core.Agent;
import jade.core.behaviours.Behaviour;
import jade.core.behaviours.CyclicBehaviour;
import jade.lang.acl.ACLMessage;
public class MyAgent03 extends Agent{
@Override
protected void setup() {
Behaviour cb = new CyclicBehaviour() {
@Override
public void action() {
ACLMessage msg = receive();
if(msg != null){
System.out.println("---------CyclicBehaviour-------------");
System.out.println("Received message is from:"+msg.getSender());
System.out.println("Received message content :"+msg.getContent());
}
}
};
this.addBehaviour(cb);
}
}

運行結(jié)果:
---------CyclicBehaviour-------------
Received message is from:( agent-identifier :name da0@Platform :addresses )
Received message content :hello, can you see me ??
SimpleBehaviour類之 WakerBehaviour類
這個抽象類實現(xiàn)了OneShot任務(wù),該任務(wù)僅在給定的超時時間過去之后才可以執(zhí)行。
叫醒行為。實現(xiàn)了一個超出了指定時間之后只執(zhí)行一次的任務(wù)。
package cn.bcrab.agent;
import jade.core.Agent;
import jade.core.behaviours.Behaviour;
import jade.core.behaviours.WakerBehaviour;
import jade.lang.acl.ACLMessage;
public class MyAgent04 extends Agent{
@Override
protected void setup() {
Behaviour wb = new WakerBehaviour(this, 10000) {
@Override
protected void onWake() {
System.out.println("---------WakerBehaviour-------------");
}
};
this.addBehaviour(wb);
}
}
運行結(jié)果:
等待了10秒后打印出
---------WakerBehaviour-------------
SimpleBehaviour類之 TickerBehaviour類
該抽象類實現(xiàn)了Behavior,該Behavior定期執(zhí)行用戶定義的代碼。預(yù)期用戶將擴展此類,以重新定義方法onTick()并包括必須定期在其中執(zhí)行的代碼段。
package cn.bcrab.agent;
import jade.core.Agent;
import jade.core.behaviours.Behaviour;
import jade.core.behaviours.TickerBehaviour;
public class MyAgent05 extends Agent{
@Override
protected void setup() {
Behaviour tb = new TickerBehaviour(this, 10000) {
@Override
protected void onTick() {
System.out.println("---------TickerBehaviour-------------");
}
};
this.addBehaviour(tb);
}
}
運行結(jié)果:
每隔10秒后打印出
---------TickerBehaviour-------------
---------TickerBehaviour-------------
---------TickerBehaviour-------------
---------TickerBehaviour-------------
...
SequentialBehaviour
具有順序子項調(diào)度的復(fù)合行為。它是一個CompositeBehaviour,它按順序執(zhí)行其子行為,并在最后一個子項結(jié)束時終止。
package cn.bcrab.agent;
import jade.core.Agent;
import jade.core.behaviours.*;
public class MyAgent06 extends Agent{
@Override
protected void setup() {
SequentialBehaviour sb = new SequentialBehaviour(this);
OneShotBehaviour b1 = new OneShotBehaviour() {
@Override
public void action() {
System.out.println("OneShotBehaviour()");
}
};
sb.addSubBehaviour(b1);
SimpleBehaviour b2 = new SimpleBehaviour(this) {
boolean done = false;
@Override
public void action() {
System.out.println("SimpleBehaviour()");
done = true;
}
@Override
public boolean done() {
return done;
}
};
sb.addSubBehaviour(b2);
TickerBehaviour b3 = new TickerBehaviour(this, 5000) {
@Override
protected void onTick() {
System.out.println("TickerBehaviour()");
}
};
sb.addSubBehaviour(b3);
this.addBehaviour(sb);
}
}
運行結(jié)果:
OneShotBehaviour()
SimpleBehaviour()
5月 10, 2020 2:04:15 上午 jade.core.AgentContainerImpl startBootstrapAgents
信息: Container-Monitor agent activated
5月 10, 2020 2:04:15 上午 jade.core.AgentContainerImpl joinPlatform
信息: --------------------------------------
Agent container Main-Container@192.168.0.107 is ready.
--------------------------------------------
TickerBehaviour()
TickerBehaviour()
ParallelBehaviour
具有并發(fā)子項調(diào)度的復(fù)合行為。 它是一個CompositeBehaviour,它同時執(zhí)行其子行為,并且在滿足其子行為的特定條件時終止,即當(dāng)所有子項都完成,N個子項完成或任何子項都完成時終止。
addSubBehaviour() - 將子行為中添加ParallelBehaviour
removeSubBehaviour() - 從此ParallelBehaviour中刪除子行為
WHEN_ALL - 預(yù)定義的常量將在構(gòu)造函數(shù)中使用,以創(chuàng)建一個ParallelBehaviour,在其所有子級完成后終止。
WHEN_ANY - 在構(gòu)造函數(shù)中使用的預(yù)定義常量,以創(chuàng)建一個ParallelBehaviour,在其任何子級完成時終止。
package cn.bcrab.agent;
import jade.core.Agent;
import jade.core.behaviours.*;
public class MyAgent07 extends Agent{
@Override
protected void setup() {
ParallelBehaviour pb = new ParallelBehaviour(this, ParallelBehaviour.WHEN_ALL);
OneShotBehaviour b1 = new OneShotBehaviour() {
@Override
public void action() {
System.out.println("OneShotBehaviour()");
}
};
pb.addSubBehaviour(b1);
SimpleBehaviour b2 = new SimpleBehaviour(this) {
boolean done = false;
@Override
public void action() {
System.out.println("SimpleBehaviour()");
done = true;
}
@Override
public boolean done() {
return done;
}
};
pb.addSubBehaviour(b2);
WakerBehaviour b3 = new WakerBehaviour(this, 5000) {
@Override
protected void onWake() {
System.out.println("TickerBehaviour()");
}
};
pb.addSubBehaviour(b3);
this.addBehaviour(pb);
}
}
運行結(jié)果:
OneShotBehaviour()
SimpleBehaviour()
5月 10, 2020 2:13:30 上午 jade.core.AgentContainerImpl startBootstrapAgents
信息: Container-Monitor agent activated
5月 10, 2020 2:13:30 上午 jade.core.AgentContainerImpl joinPlatform
信息: --------------------------------------
Agent container Main-Container@192.168.0.107 is ready.
--------------------------------------------
TickerBehaviour()
FSMBehaviour
基于有限狀態(tài)機的子級調(diào)度的復(fù)合行為。 它是一個CompositeBehaviour,它根據(jù)用戶定義的FSM執(zhí)行其子行為。 更具體地說,每個孩子代表FSM中的一個狀態(tài)。 該類提供了注冊狀態(tài)(子行為)和過渡的方法,這些方法定義了如何安排子行為。
registerState(Behaviour state, java.lang.String name) - 將“行為”注冊為此FSMBehaviour的狀態(tài)。當(dāng)FSM達到此狀態(tài)時,將執(zhí)行注冊的行為。
registerFirstState(Behaviour state, java.lang.String name) - 將一個行為注冊為該FSMBehaviour的初始狀態(tài)。
registerLastState(Behaviour state, java.lang.String name) - 將一個行為注冊為該FSMBehaviour的最終狀態(tài)。當(dāng)FSM達到此狀態(tài)時,將執(zhí)行注冊的行為,完成后,F(xiàn)SMBehaviour也將終止。
registerTransition(java.lang.String s1, java.lang.String s2, int event) - 在FSM中注冊一個過渡,為該FSMB行為的子級調(diào)度定義策略。三個輸入?yún)?shù)。行為A,行為B以及String類型轉(zhuǎn)換條件。
registerDefaultTransition(java.lang.String s1, java.lang.String s2, ) - 在FSM中注冊一個默認過渡,為該FSMBehaviour的子級調(diào)度定義策略。當(dāng)狀態(tài)s1因未明確關(guān)聯(lián)到任何過渡的事件而終止時,將觸發(fā)此過渡。兩個行為類參數(shù)。
onEnd() - 重寫onEnd()方法以返回上一次執(zhí)行狀態(tài)的退出值。
package cn.bcrab.agent;
import jade.core.Agent;
import jade.core.behaviours.*;
public class MyAgent08 extends Agent{
@Override
protected void setup() {
FSMBehaviour fb = new FSMBehaviour(){
@Override
public int onEnd() {
System.out.println("FSMBehaviour done!");
myAgent.doDelete();
return super.onEnd();
}
};
fb.registerFirstState(new Behaviour1(), "Behaviour1");//初始行為
fb.registerState(new Behaviour2(),"Behaviour2"); //中間行為
fb.registerLastState(new Behaviour3(),"Behaviour3"); //終止行為
fb.registerTransition("Behaviour1","Behaviour2",0); //轉(zhuǎn)換規(guī)則
fb.registerTransition("Behaviour1","Behaviour3",1); //轉(zhuǎn)換規(guī)則
fb.registerDefaultTransition("Behaviour2","Behaviour1");
this.addBehaviour(fb);
}
private class Behaviour1 extends OneShotBehaviour{
private int num;
@Override
public void action() {
num=(int)(Math.random()*100+1);
System.out.println("Behaviour1 , and the random num is : "+num);
}
@Override
public int onEnd() {
return num%2;
}
}
private class Behaviour2 extends OneShotBehaviour{
@Override
public void action() {
System.out.println("Behaviour2");
}
}
private class Behaviour3 extends OneShotBehaviour{
@Override
public void action() {
System.out.println("Behaviour3");
}
}
}
運行結(jié)果:
根據(jù)隨機數(shù)不同結(jié)果產(chǎn)生不同。
Behaviour1 , and the random num is : 8
Behaviour2
Behaviour1 , and the random num is : 92
Behaviour2
Behaviour1 , and the random num is : 47
Behaviour3
FSMBehaviour done!
相關(guān)代碼
https://gitee.com/2010jing/JADE-tutorial/tree/tutorial03/
reference
- Wiley.Developing.Multi.Agent.Systems.with.JADE