使用 JADE 平臺進行智能體開發

發表于:2007-05-24來源:作者:點擊數: 標簽:開發平臺JADE智能進行
作為一名軟件 開發 人員,我相信大家都對 面向對象 技術有個比較深刻的認識。面向對象技術的確為提高軟件開發效率做出了巨大的貢獻。但是在我們的開發過程中,面向對象也暴露了一些不足,其中最主要的不足可以歸納為:面向對象技術并不是對現實世界的最貼切的
作為一名軟件開發人員,我相信大家都對面向對象技術有個比較深刻的認識。面向對象技術的確為提高軟件開發效率做出了巨大的貢獻。但是在我們的開發過程中,面向對象也暴露了一些不足,其中最主要的不足可以歸納為:面向對象技術并不是對現實世界的最貼切的模擬。既然出現了不足,那么在這種特定的背景下,必然會出現一種軟件開發理論和技術來解決軟件開發中的問題。這就是智能體Agent。本文首先介紹一下智能體的基本概念,然后開發了一個應用程序演示了利用智能體開發平臺JADE來開發多智能體系統的過程。

智能體簡介

所謂智能體是指駐留在某一環境下能夠自主(autonomous)﹑靈活(flexible)地執行動作以滿足設計目標的行為實體。針對上述定義,下面對智能體的概念作進一步分析:

1. 智能體駐留在環境中并需要與環境進行交互
任何智能體都不是孤立和封閉的,它駐留在一定的環境之中,需要與環境持續不斷地進行交互。圖1給出了智能體與環境交互的抽象視圖。


圖1
圖1

2. 智能體是行為實體
智能體是一個行為實體,它具有一組動作并能執行這些動作,是動作執行的決策者和實施者。智能體的動作反應了其所具有的能力,這種能力主要體現在:智能體動作的實施有助于實現其設計目標并對其所駐留的環境產生影響。

3. 智能體能夠自主地實施行為
智能體具有屬于其自身的計算資源和局部于自身的行為控制機制,能在沒有人類或其他智能體的直接干涉和指導的情況下運行,并能根據其內部狀態和感知到的環境輸入決定自身的狀態,控制自身的行為。

4. 智能體有其設計目標
系統中的每個智能體都有其特定的設計目標。在其生命周期和持續運行過程中,智能體根據其設計目標和感知到的環境輸入自主地決定自身行為。所以智能體的設計目標對其行為決策產生直接的影響。

在我們的日?,F實生活中,有許多控制系統都可以視為智能體。例如,房間恒溫調控系統中的恒溫調節器就是一個智能體。恒溫調節器智能體的設計目標是要將房間的溫度維持在用戶設定的范圍。它駐留于物理環境(房間)之中,具有溫度感應器以感知環境輸入(房間的溫度),并能對感知到的房間溫度作出適時反應,從而影響所處的環境(調高或者降低房間的溫度)。





回頁首


初識JADE

JADE (Java Agent Development Framework)是一個完全由Java語言開發的一個軟件框架,并且符合FIPA規范。通過這個中間件,極大地簡化了我們程序員開發多智能體系統。JADE主要包括以下幾個組成部分:

  • 智能體賴以生存的一個運行時環境
  • 程序員用來開發智能體應用的一個運行時庫
  • 一系列圖形工具,幫助用戶管理和監控運行時智能體的狀態

安裝

在進行一系列的開發之前,我們需要先下載并且安裝JADE環境。您可以從JADE的官方網站http://jade.tilab.com/ 上下載JADE的最新版本,目前為3.4發布版本。一旦你下載完畢,請解壓縮安裝包,把其中lib目錄下的4個jar文件放入您的ClassPath系統環境變量中。打開命令行,輸入Java jade.Boot -gui,您將看到如圖2所示的圖形化用戶界面。


圖2
圖2

JADE基本概念

1. JADE平臺利用容器去容納智能體。一個平臺可以有多個容器,并且這些容器可以在不同的主機上。在一個JADE平臺中,有且僅有一個叫做主容器的容器。當其他的容器啟動時,他們必須在主容器中注冊。圖3顯示了在網絡中,存在兩個不同的JADE平臺。其中一個平臺由3個容器構成,另一個平臺由1個容器構成。JADE智能體在平臺上用獨一無二的名字來標識。一旦一個智能體知道網絡上另一個智能體的名字,它們便可以進行透明的通信,而不需要了解實際的位置。


圖3
圖3

2. 主容器除了可以提供其他一般容器注冊功能之外,它還包含了兩個特殊的智能體。AMS(Agent Management System)提供一些智能體管理功能。例如:它給智能體提供命名服務,并且它也可以從容器中創建和刪除智能體。DF(Directory Facilitator)提供了黃頁功能。當一個智能體需要利用其他智能體提供的服務時,它便可以到DF中去查找。





回頁首


一個簡單的多智能體系統

這個簡單的實例主要介紹的是智能體如何在DF中注冊,并且對其他智能體的請求做出響應。智能體之間的具體交互過程如下:首先Ping Agent在DF中注冊,等待接收ACL消息。如果接收到了QUERY_REF類型的消息,并且消息內容為"ping",那么它就用內容為"pong"的INFORM類型的消息響應。創造JADE智能體-Agent 在JADE平臺中,每個智能體都需要從其父類jade.core.Agent類派生,并且實現其setup方法。


import jade.core.Agent;
            Public Class BookBuyerAgent extends Agent
            {
            protected void setup()
            {
            System.out.println("Hello! Buyer-agent "+getAID().getName()+" is ready.");
            }
            }
            

每個智能體都由一個jade.core.AID類的實例唯一標識。Agent類中的方法getAID就是用來獲取智能體標識的。一個AID對象包括一個唯一的名字和一系列地址。JADE平臺中智能體名字有如下格式:<nickname>@<platform-name>。

智能體任務-Behaviour

一個行為就代表了智能體能夠執行的任務。在JADE中,行為必須從其父類jade.core.behaviours.Behaviour派生。為了使智能體具有某種行為,編程人員必須利用Agent類的addBehaviour方法向智能體中顯示的加入。行為可以在任何時候加入到智能體中。每個從Behaviour派生的行為類必須實現action和done方法。Action方法定義了一系列智能體執行的操作,而done方法表明行為是否結束完畢。如果done方法返回的值為真,那表示這個行為已經執行完畢,可以從智能體的行為池刪除。

圖4表明了智能體行為的執行方式:


圖4
圖4

JADE為我們預定義了幾種行為類型,主要包括:

1. jade.core.behaviours.OneShotBehaviour
這種類型的行為只執行一次,然后就從智能體的行為池中被刪除。例如:


public class MyOneShotBehaviour extends OneShotBehaviour
            {
            public void action()
            {
            //perform operation X
            }
            }
            

操作X僅被執行一次。

2. jde.core.behaviours.CyclicBehaviour
這種類型的行為將循環執行。

3. Generic behaviours
一般行為包含一個狀態位,并且由狀態位決定執行不同的操作。當滿足所給定條件時,行為結束。例如:


public class MyTwoStepBehaviour extends Behaviors
            {
            private int step=0;
            public void action()
            {
            switch(step)
            {
            case 0:
            //perform operation X
            step++;
            break;
            case 1:
            //perform operation Y
            step++;
            break;
            }
            }
            public Boolean done()
            {
            return step==2;
            }
            }
            

操作X和Y依次執行一次,然后行為結束。JADE也提供了把以上幾種簡單的行為組合成復雜行為的能力。例如:順序行為SequentialBehaviour, 并發行為ParallelBehaviour和有限狀態機行為FSMBehaviou。

智能體通信

JADE智能體提供的最重要的特征之一就是其通信能力。通信過程中所采用的通信模式為圖5所示的異步消息傳遞。也就是說,每個智能體都有一個消息隊列,如果其他智能體需要與其通信時,JADE runtime就把相應消息投遞到其隊列中。當消息隊列中出現消息時,相應的智能體被通知。這時是否對消息做出響應那就是程序員的事了。


圖5
圖5

1. ACL語言

智能體是通過ACL(Agent Communication Language)語言進行通信的,而ACL是由FIPA制定的智能體互操作國際標準。ACL消息格式主要包括消息發送方﹑消息接收方﹑通信原語以及消息內容。在JADE中,消息是由jade.lang.acl.ACMessage類對象表示。

2. 發送消息

在JADE中發送消息非常簡單,您只需使用Agent類的send方法即可。以下代碼表明了如何向別名為Peter的智能體發出通知消息,告訴其今天下雨。


ACLMessage msg=new ACLMessage(ACLMessage.INFORM);
            Msg.addReceiver(new AID("Peter",AID.ISLOCALNAME));
            Msg.setLanguage("English");
            Msg.setContent("Today it's raining");
            Send(msg);
            

3. 接收消息

智能體通過receive方法就可以從其消息隊列中接收消息。這個方法返回消息隊列中第一條消息。如果隊列為空,則返回null。

構造PingAgent 通過以上的一系列介紹,我們就開始建立PingAgent,清單一給出了部分源代碼。


 package examples.PingAgent;
            public class PingAgent extends Agent {
            class WaitPingAndReplyBehaviour extends SimpleBehaviour {
            private boolean finished = false;
            public WaitPingAndReplyBehaviour(Agent a) {
            super(a);
            }
            public void action() {
            ACLMessage msg = blockingReceive();
            if(msg != null){
            ACLMessage reply = msg.createReply();
            if(msg.getPerformative()== ACLMessage.QUERY_REF){
            String content = msg.getContent();
            if ((content != null) && (content.indexOf("ping") != -1)){
            reply.setPerformative(ACLMessage.INFORM);
            reply.setContent("pong");
            }
            }
            send(reply);
            }
            }else{
            System.out.println("No message received");
            }
            }
            public boolean done() {
            return finished;
            }
            }
            protected void setup() {
            DFAgentDescription dfd = new DFAgentDescription();
            ServiceDescription sd = new ServiceDescription();
            sd.setType("AgentcitiesPingAgent");
            sd.setName(getName());
            sd.setOwnership("TILAB");
            dfd.setName(getAID());
            dfd.addServices(sd);
            try {
            DFService.register(this,dfd);
            } catch (FIPAException e) {
            System.err.println(getLocalName()+" registration with DF unsuclearcase/" target="_blank" >cceeded.
            Reason: "+e.getMessage());
            doDelete();
            }
            WaitPingAndReplyBehaviour PingBehaviour = new
            WaitPingAndReplyBehaviour(this);
            addBehaviour(PingBehaviour);
            }
            }
            

在清單1中,我們注意到PingAgent擁有一個WaitPingAndReplyBehaviour行為。這個行為的action方法很簡單,它的邏輯主要是判斷智能體是否收到了類型為QUERY_REF并且內容為"ping"的消息。在setup方法中,主要的操作是在DF中注冊智能體。

部署運行 PingAgent

在編譯 PingAgent 之前,請確保 JADE 所需的 jar 文件在您系統的 CLASSPATH 環境變量中。在命令行下定位到 PingAgent 所在目錄,鍵入 javac examples.PingAgent.PingAgent。編譯完成后,在命令行下輸入 java jade.Boot -gui,出現圖 2 所示的主界面,此時表明 JADE平臺已經成功啟動。鼠標右擊圖 2 左邊樹狀的 Main-Container 項,選擇 Start New Agent,出現圖6所示的界面。在 Agent Name 中輸入智能體的名稱,在 Class Name 中輸入智能體的類名,點擊 OK 按鈕。此時 PingAgent 已經正常啟動,并且等待其它智能體的通知消息。


圖6
圖6

為了模擬智能體之間的通信,我們利用 JADE 平臺提供的 Dummy Agent。點擊菜單 Tools,選擇 Start DummyAgent,出現圖7所示的界面。按照圖7所示輸入相應字段信息,點擊工具條中的 ,此時 DummyAgent 向 PingAgent 發送了一條類型為 QUERY_REF 的ACL 消息了,并且 PingAgent 也向 DummyAgent 返回了一條 INFORM 類型的消息。


圖7
圖7




回頁首


總結

我希望本文已經向你展示了利用 JADE 平臺構建和開發多智能體系統是多么容易。您也可以發揮您自己的想象,開發更加實用的多智能體系統。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97