第三章 JADE學(xué)習(xí) - 使用Behaviour類

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í)行的過程如下:

Agent thread path of execution

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);
    }
}


DummyAgent

運行結(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容