學(xué)習(xí)agent必備!最全的JADE程序員指南_第1頁(yè)
學(xué)習(xí)agent必備!最全的JADE程序員指南_第2頁(yè)
學(xué)習(xí)agent必備!最全的JADE程序員指南_第3頁(yè)
學(xué)習(xí)agent必備!最全的JADE程序員指南_第4頁(yè)
學(xué)習(xí)agent必備!最全的JADE程序員指南_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.wd.wd.wd.JADE程序員指導(dǎo)Jade集成開發(fā)環(huán)境是一個(gè)入門級(jí)的產(chǎn)品,但是它仍然擁有強(qiáng)大的功能。它提供的用戶圖形界面包含了大局部SUN SDK工具,可以方便的編輯源代碼,生成一個(gè)類,執(zhí)行一個(gè)java程序或java applet. Jade提供的高效率的功能可以讓你為每個(gè)project生成單獨(dú)的類模板,這個(gè)功能包括生成使用AWT或 Swing APIs對(duì)話窗口。Jade可以使用Sureshot的JiveLint支持靜態(tài)代碼檢查,同時(shí)也提供了入門級(jí)的調(diào)試功能。新版本提供了如下功能:允許用戶在XML編輯器中調(diào)用用戶提供的函數(shù);方法定位(method location)采用了樹形視圖。簡(jiǎn)介程序

2、員指南由管理員指南作為補(bǔ)充,在jade/doc目錄下可以找到可用的HTML文檔。如果本指南和HTML文檔之間哪里出現(xiàn)了沖突,以經(jīng)常更新的HTML文檔為準(zhǔn)。JADEJava Agent Development Framework是一個(gè)軟件開發(fā)框架,它可以為智能AGENT開發(fā)多AGENT系統(tǒng)和遵守FIAP協(xié)議的應(yīng)用程序。它包含兩個(gè)主要的產(chǎn)品:一個(gè)是與FIPA相適應(yīng)的agent平臺(tái),另一個(gè)是開發(fā)Java agents的包。JADE是完全用JAVA編碼的,如果agent程序員想探索本框架,他/她的agents就應(yīng)該按照這個(gè)程序員指南中描述的大綱用Java編碼。這個(gè)指南是在假設(shè)讀者熟悉FIPA標(biāo)準(zhǔn),至少

3、是熟悉Agent Management specificationsFIPA no.23,Agent Communication Language和ACL Message StructureFIPA no.61的根基上編寫的JADE是用JAVA寫的由各種JAVA包構(gòu)成,給程序設(shè)計(jì)者以完備的功能接口和標(biāo)準(zhǔn)的抽象性界面,具體應(yīng)用取決與任務(wù)。選擇JAVA語(yǔ)言是因?yàn)樗性S多獨(dú)特的特點(diǎn),尤其是在分布式異質(zhì)環(huán)境下的面向?qū)ο蟮木幊踢B接方式;這些特點(diǎn)還包括Object Serialization, Reflection API和Remote Method InvocationRMI。JADE由如下的包構(gòu)成:J

4、ade.core-執(zhí)行系統(tǒng)核心問題,包括必須由軟件程序員擴(kuò)展的Agent類,除此之外一個(gè)行為類包含在jade.core.behaviours子包內(nèi)。行為執(zhí)行agent的任務(wù)或目的。它們是可以完成不同復(fù)雜任務(wù)或并行任務(wù)的邏輯行為單元。程序員編寫行為定義agent的操作,并相互連接他們定義agent執(zhí)行路徑。jade.lang.acl子包用來根據(jù)FIAP標(biāo)準(zhǔn)標(biāo)準(zhǔn)處理ACL的。jade.content子包包含了一系列支持用戶定義的本體和內(nèi)容語(yǔ)言的類。單獨(dú)有一個(gè)指南描述如何使用JADE支持消息內(nèi)容。尤其是jade.content.lang.sl包含了SL編碼解碼器,包含有皮剖析器和解碼器。jade.d

5、omainb包:包含了FIPA標(biāo)準(zhǔn)定義的表示Agent管理實(shí)體的所有Java類,特別是AMS agents和DF agents,提供生命周期服務(wù),白頁(yè)和黃頁(yè)服務(wù)。子包jade.domain.FIPAAgentManagemnt包含F(xiàn)IPA-Agent-Management Ontology和所有表示它的概念的類。而子包jade.domain.JADEAgentManagemnt包含JADE的Agent管理的擴(kuò)展名比方,為sniffing messages,controlling the life-cycle of agents,包括本體和表示它的概念所有類。子包r

6、ospection包含用于JADE工具比方,sniffer和Introspector間引用域和JADE核心的概念。子包jade.domain.mobility包含用于移動(dòng)通信的概念。jade.gui包:包含了一系列有助于創(chuàng)立GUIs的普通類,用于顯示和編輯Agent-Identifiers,Agent Descriptions,ACLMessages,jade.mtp包:包含一個(gè)為容易地與JADE框架整合,每一個(gè)MTP都應(yīng)該執(zhí)行的Java接口,和一系列這些協(xié)議的實(shí)現(xiàn)。to包:包含模擬標(biāo)準(zhǔn)交互協(xié)議例如:fipa-request, fipa-query, fipa-contract

7、-net, fipa-subscribe和由FIPA定義的其它一些協(xié)議的類,和幫助程序員創(chuàng)立他們自己的協(xié)議的類。FIPA包包含由FIPA為基于IIOP的消息傳輸定義的IDL模塊。最后,jade.wrapper包提供JADE高層次封裝功能,這可以將JADE的用法作為庫(kù),從而使外部的Java程序啟動(dòng)JADE agents和agent容器見3.8節(jié)。JADE還包括一些工具,用來簡(jiǎn)化平添管理和應(yīng)用開發(fā)。每個(gè)工具包含在jade.tools的一個(gè)單獨(dú)的包內(nèi)。目前,以下工具是可用的:Remote Management AgentRMA:作為平臺(tái)管理和控制的圖形控制臺(tái)。第一個(gè)RMA實(shí)例可以通過命令行選項(xiàng)“-g

8、ui來啟動(dòng),但是以后可以激活多個(gè)GUI。通過簡(jiǎn)單的用多臺(tái)調(diào)頻發(fā)射機(jī)向所有RMAs播送一個(gè)事件,JADE在多RMAs保持一致性。而且,RMA控制臺(tái)能啟動(dòng)其它JADE工具。Dummy Agent:是一個(gè)監(jiān)控和調(diào)試工具,由圖形用戶界面和潛在的JADE agent構(gòu)成。用GUI可能寫出ACL消息,并將消息發(fā)送給其他agents;也可能顯示所有發(fā)送或接收到的ACL消息,以及為了便于agent通話記錄和復(fù)述的時(shí)間戳信息。Sniffer:是一個(gè)在ACL消息傳輸時(shí)可以截取ACL消息,并用類似與UML程序表的符號(hào)將消息圖形式顯示的agent。它有助于通過觀察agents如何交換ACL消息來調(diào)試你的agent社會(huì)

9、。Introspector:可以監(jiān)控agent生命周期,它交換的ACL消息和執(zhí)行的行為的agent。DF GUI:是一個(gè)完全的圖形用戶界面,被默認(rèn)的JADE DF使用,也可以被其它每一個(gè)用戶可能需要的DF使用。以這種方式,用戶可能創(chuàng)黃頁(yè)域和子域的復(fù)雜網(wǎng)絡(luò)。GUI可以用簡(jiǎn)單直覺的方式控制DF的知識(shí)庫(kù),使DF和其它DF聯(lián)合,和遠(yuǎn)程控制注冊(cè)/注銷/修改/搜索DF父親DF和孩子DF的知識(shí)庫(kù)執(zhí)行域和子域網(wǎng)絡(luò)。LogManagerAgent:允許在運(yùn)行時(shí)設(shè)置日志信息,如日志水平,對(duì)于用Java日志的JADE和程序應(yīng)用的特殊類來說。SocketProxyAgent:是一個(gè)普通的agent,作為JADE平臺(tái)和

10、普通TCP/IP連接間的雙向通道。仔細(xì)考慮JADE所有的傳輸服務(wù),ACL消息被轉(zhuǎn)換成簡(jiǎn)單的ASCII字符串并通過套接字連接傳輸。反過來,ACL消息可以通過TCP/IP連接到JADE平臺(tái)傳送。這個(gè)agent是有用的,例如,處理網(wǎng)絡(luò)防火墻或在Web瀏覽器中提供與Java applets交互的平臺(tái)。JADETM是一個(gè)由CSELT3注冊(cè)的商標(biāo)。JADE由五局部組成:混淆器、加密器、封裝器、類編輯器和輸出工具。 混淆器能夠保護(hù)軟件使之不被反編譯。它通過混淆類文件使得反編譯無效,并把敏感的名字指代變成另一個(gè)名字空間,這樣可以使反編譯的結(jié)果毫無疑義?;煜饔小巴耆汀翱焖賰煞N選項(xiàng),能處理任何Java產(chǎn)品包括

11、API,應(yīng)用程序和小程序。它遵從Java虛擬機(jī)標(biāo)準(zhǔn)。 加密器隱藏和加密用戶產(chǎn)品的主類,處理的結(jié)果是一個(gè)類文件。它為編碼和反編碼提供了一個(gè)界面。JADE有一些類用DES完成這個(gè)界面。加密和解密的過程對(duì)于用戶來說是透明的。用戶感覺不到使用原始的主類和使用處理后的結(jié)果類有什么不同。當(dāng)然,用戶也可以不加密地處理這些主類和產(chǎn)品。封裝器不僅僅處理類文件,它還隱藏和加密在產(chǎn)品根目錄下的其它文件。它封裝產(chǎn)品并只產(chǎn)生一個(gè)類。軟件廠商把這個(gè)類銷售給用戶,用戶將運(yùn)行這個(gè)類文件,安裝買來的軟件。封裝器使用和加密器一樣的安全類。 對(duì)于高級(jí)Java開發(fā)人員,JADE還提供了一個(gè)叫做“類編輯器的工具。它能夠直接修改類的代碼

12、字節(jié)。類編輯器也是一個(gè)獨(dú)立的應(yīng)用程序,它將把所有的結(jié)果生成到j(luò)ar格式的的文件里。 輸出工具把所有的結(jié)果生成到一個(gè)jar格式的文件中,這個(gè)文件能夠被其它的壓縮工具如Unzip, Winzip和Jar處理。 JADE是由上面的工具集成起來的應(yīng)用程序,它由純Java語(yǔ)言編寫。這些應(yīng)用既能夠在命令行下運(yùn)行,也可以在圖形界面環(huán)境下交互使用。用戶可以分別使用這些功能,也可以按以以下列圖中的序列運(yùn)行一組特征。JADE允許用戶把配置參數(shù)存到一個(gè)文本文件里,并可以編輯它。這樣,下一次只要裝入該配置文件就可以在一樣的參數(shù)下運(yùn)行了。2 JADE的特征下面是JADE為agent程序員提供的特征列表:分布式的agen

13、t平臺(tái):agent平臺(tái)可以分布在許多主機(jī)之中假設(shè)他們通過RMI連接。在每臺(tái)主機(jī)上只有一個(gè)Java應(yīng)用程序,因此也就只有一個(gè)Java虛擬機(jī)運(yùn)行。Agents以Java的思路執(zhí)行,存在于Agent容器中,agent容易為在運(yùn)行時(shí)為agent執(zhí)行提供支持。圖形用戶界面:從遠(yuǎn)程主機(jī)來管理假設(shè)干agents和agents容器。調(diào)試工具:幫助開發(fā)基于JADE的多agents軟件程序。通過行為模型支持agent活動(dòng)的多重、平行和并行執(zhí)行。JADE以非優(yōu)先權(quán)的方式安排agent的行為。遵循FIPA的agent平臺(tái):它包括AMS、DF和ACC。所有這三個(gè)組成都在agent平臺(tái)啟動(dòng)時(shí)自動(dòng)激活。許多遵循FIPA的D

14、Fs可以在運(yùn)行時(shí)啟動(dòng)以執(zhí)行多域程序,一個(gè)域是指一系列邏輯agents,它們的服務(wù)通過一個(gè)共同的facilitator發(fā)布。每個(gè)DF繼承一個(gè)GUI和所有由FIPA定義的標(biāo)準(zhǔn)能力例如,注冊(cè),注銷,修改和搜索agent描述的能力,DF網(wǎng)絡(luò)內(nèi)聯(lián)盟的能力。在同一個(gè)agent平臺(tái)內(nèi)有效傳輸ACL消息。事實(shí)上,消息被編譯成Java對(duì)象而不是字符串的形式進(jìn)展傳輸,以防止集結(jié)或未編組的程序。當(dāng)跨越平臺(tái)邊界時(shí),消息自動(dòng)轉(zhuǎn)換成/自基于FIPA語(yǔ)法、編碼和傳輸協(xié)議。這種轉(zhuǎn)換對(duì)只需要處理Java對(duì)象的agent的執(zhí)行者是很明顯的。備用的FIPA交互協(xié)議庫(kù)。Agent在AMS上的自動(dòng)注冊(cè)和注銷。遵循FIPA的命名服務(wù):在

15、啟動(dòng)agents時(shí)從平臺(tái)上獲取它們的GUIDGlobally Unique Identifier。支持程序定義的內(nèi)容語(yǔ)言和本體。InProcess接口允許外部程序啟動(dòng)自治agents。3用JADE創(chuàng)立多agent系統(tǒng)本章描述支持多agent系統(tǒng)開發(fā)的JADE類。JADE遵循句法規(guī)那么,有寫地方遵循FIPA標(biāo)準(zhǔn)的語(yǔ)法3.1代理平臺(tái)FIPA定義的一個(gè)agent平臺(tái)的標(biāo)準(zhǔn)模型,如以以下列圖所示:AMS是管理控制進(jìn)出和使用AP的agent。一個(gè)平臺(tái)上只能有一個(gè)AMS。它提供百頁(yè)和生命周期服務(wù),維護(hù)AID目錄和agent狀態(tài)。為了獲得有效的AID,每個(gè)agent都必須在AMS上注冊(cè)。DF是平臺(tái)上提供默認(rèn)

16、黃頁(yè)服務(wù)的agent。消息傳輸系統(tǒng)也叫agent通信通道ACC,由軟件構(gòu)成在平臺(tái)內(nèi)負(fù)責(zé)所有的消息交換,包括來自或發(fā)送到遠(yuǎn)程平臺(tái)的消息。JADE完全遵守這個(gè)參考架構(gòu),當(dāng)一個(gè)JADE平臺(tái)被啟動(dòng),AMS和DF立刻被創(chuàng)立,ACC模塊也設(shè)置為允許消息通信。Agent平臺(tái)可以分布在不同的主機(jī)上。但一臺(tái)主機(jī)上只能有一個(gè)應(yīng)用程序即一個(gè)JAVA虛擬機(jī)運(yùn)行。每個(gè)JVM是一個(gè) 基本的agents容器,它為agent的執(zhí)行提供完全運(yùn)行時(shí)環(huán)境,并允許假設(shè)干agents在同一臺(tái)主機(jī)上并行執(zhí)行。創(chuàng)立主容器或front-end,它是AMS和DF存在以及RMI注冊(cè)的agent容器,被JADE內(nèi)部使用。其它agent容器與主容器

17、相連,為任何JADE agents的執(zhí)行提供完全運(yùn)行時(shí)環(huán)境。根據(jù)FIPA標(biāo)準(zhǔn),DF和 AMS agents通信使用FIPA-SL0內(nèi)容語(yǔ)言,fipa-agent-management本體,fipa-request交互協(xié)議。JADE為所有這些局部提供編譯執(zhí)行:SL0內(nèi)容語(yǔ)言是由jade.content.lang.sl.SLCodec類執(zhí)行的,使用此語(yǔ)言的自動(dòng)功能可以用getContentManager().registerLanguage(new SLCodec(0)方法添加到任何agent。本體概念除了jade.core.AID執(zhí)行的AID被jade.domain.FIPAAgentManag

18、ement包中類執(zhí)行。FIPAManagementOntology類定義了與本體符號(hào)一致的詞匯。用下面的代碼使用本體的自動(dòng)能力可以添加到任何agent:最后,fipa-request交互協(xié)議作為ready-to-use行為執(zhí)行,存在于to包內(nèi)。3.1.1FIPA-Agent-Management本體每一個(gè)使用fipa-agent-management本體的類都是一個(gè)簡(jiǎn)單的屬性集合,根據(jù)基于表示FIPA的fipa-agent-management本體概念的模型框架,用公共方法讀寫它們。使用下面的規(guī)定:為類的每個(gè)屬性的attrName命名和attrType指明類型,有兩種可能的情況

19、:屬性類型是一個(gè)單一值,那么它們由attrType getAttrName讀取,由void setAttrNameattrType a寫入,每次調(diào)用setAttrName后的執(zhí)行結(jié)果將重寫以前的屬性值。屬性類型是一系列的值,那么用void addAttrName(attrType a)方法插入一個(gè)新值,void clearAllAttrName()方法移除所有的值列表變?yōu)榭?。讀取那么用返回Iterator對(duì)象的Iterator getAllAttrName方法,允許程序員查看列表并將列表元素設(shè)置適宜的類型。參考HTML文檔查看這些類和它們的接口的完整列表。本體的 基本概念包jad

20、e.content.onto.basic之中包含一系列類,它們是每個(gè)本體的通用局部,如Action, TrueProposition, Result, , 正如3.6節(jié)所講的BasicOntology可以參加任何用戶定義的本體。注意:Action類被用于表示行為。它有一對(duì)方法來set/get行為者的AID如應(yīng)該表現(xiàn)行為的agent和行為本身如注冊(cè)/注銷/修改。3.1.2 簡(jiǎn)化API以訪問DF和AMS服務(wù)目前為止描述的JADE特征允許FIPA系統(tǒng)agents和用戶定義agents之間通過簡(jiǎn)單的發(fā)送和接收由標(biāo)準(zhǔn)定義的消息進(jìn)展交互。然而,因?yàn)槟切┙换ケ怀浞值臉?biāo)準(zhǔn)化,因?yàn)樗鼈兎浅R话?,下面的類可以用?jiǎn)

21、化的接口成功完成這一任務(wù)。Agent類用兩種方法得到平臺(tái)默認(rèn)DF和AMS的AID:getDefaultDF()和getAMS()。DF服務(wù)jade.domain.DFService執(zhí)行了一系列與標(biāo)準(zhǔn)FIPA DF服務(wù)通信的靜態(tài)方法如黃頁(yè)agent。它包括的方法有:從DF請(qǐng)求注冊(cè),注銷,修改和搜索行為。這種方法的每個(gè)版本帶有所有需要的參數(shù),以及它們的子集,省略的參數(shù)以缺省值填充。注意:這些方法block每一個(gè)agent活動(dòng)直到該活動(dòng)成功執(zhí)行或拋出一個(gè)jade.domain.FIPAException異常如因?yàn)镈F接收到一個(gè)failure消息,即直到對(duì)話完畢。另外,有一些情況,以no

22、n-blocking方式執(zhí)行這些任務(wù)更方便。在這些情況下,應(yīng)該用to.AchieveREInitiator或to.SubscriptionInitiator(見3.4.12節(jié))關(guān)聯(lián)createRequestMessage, createSubscriptionMessage, decodeDone, decodeResult和DecodeNotification方法,以方便到/從DF發(fā)送/接收的消息的準(zhǔn)備和解碼。下面這段代碼解釋了agent與默認(rèn)的DF協(xié)商的情況: 基本的DF語(yǔ)句:AMS服務(wù)這個(gè)類是DFService的二重類,訪問由標(biāo)準(zhǔn)的FIPA

23、AMSagent提供的服務(wù),它的接口完全相當(dāng)于一個(gè)DFService接口。注意:在分別調(diào)用setup方法前和takeDown方法后,JADE用默認(rèn)的AMS自動(dòng)調(diào)用注冊(cè)和注消方法,所以對(duì)一般程序員來說不需要調(diào)用它們。然而,在某些情況下,程序員可能需要調(diào)用它的方法。例如:當(dāng)一個(gè)agent想在遠(yuǎn)程agent平臺(tái)的AMS上注冊(cè)時(shí),或者當(dāng)一個(gè)agent想通過添加私有地址到它的地址序列從而修改它的描述時(shí),3.2 agent類Agent類對(duì)用戶定義的agents來說表示一個(gè)通用的 基本類。因此,從程序員觀點(diǎn)來說,JADE agent簡(jiǎn)單地說就是一個(gè)從 基本Agent類擴(kuò)展來的用戶定義的Java類的實(shí)例。這就

24、意味著對(duì)在agent平臺(tái)上完成 基本交互的特征注冊(cè)、配置、遠(yuǎn)程管理、和可以被調(diào)用執(zhí)行agent規(guī)定的行為的一系列 基本方法如send/receive message, use standard interaction protocols, register with several domains,的繼承。Agent的計(jì)算模型是多任務(wù)的,任務(wù)或行為是并發(fā)執(zhí)行的。Agent提供的每項(xiàng)功能/服務(wù)應(yīng)該作為一個(gè)或多個(gè)行為執(zhí)行參考3.4節(jié)行為執(zhí)行。調(diào)度程序?qū)?基本agent類是內(nèi)部的,而對(duì)程序員來說是隱藏的,自動(dòng)管理行為的調(diào)度。3.2.1agent的生命周期根據(jù)FIAP標(biāo)準(zhǔn)中的AP生命周期理論,JADE

25、 agent可以處于假設(shè)干狀態(tài)中的一種,如圖3所示,下面將詳細(xì)介紹:創(chuàng)立:創(chuàng)立agent對(duì)象,但沒有在AMS上注冊(cè),也沒有名字和地址,不能其它agents通信?;顒?dòng):agent對(duì)象在AMS上注冊(cè),有一個(gè)合格的名字和地址,可以訪問所有JADE特征。掛起:agent對(duì)象當(dāng)前被停頓。它的內(nèi)部線程被暫停,沒有agent行為被執(zhí)行。等待:agent對(duì)象被阻塞,等待什么。它的內(nèi)部線程處于睡眠狀態(tài),當(dāng)一些條件滿足時(shí)被喚醒典型地是消息到達(dá)。刪除:agent明確地死亡。內(nèi)部線程終止它的執(zhí)行,agents不再注冊(cè)在AMS上。轉(zhuǎn)移:當(dāng)移動(dòng)agent向新的地址遷移時(shí)進(jìn)入這個(gè)狀態(tài)。系統(tǒng)連續(xù)緩存消息,之后將發(fā)往它的新的地

26、址。Agent類提供公共方法使其在各種狀態(tài)間轉(zhuǎn)換,這些方法從FIPA標(biāo)準(zhǔn)agent管理中的有限狀態(tài)機(jī)the Finite State Machine內(nèi)的適當(dāng)?shù)霓D(zhuǎn)換中獲取它們的名字。例如,doWait方法把a(bǔ)gent從活動(dòng)的狀態(tài)轉(zhuǎn)變?yōu)榈却隣顟B(tài),doSuspend方法把a(bǔ)gent從活動(dòng)或等待狀態(tài)轉(zhuǎn)變?yōu)閽炱馉顟B(tài),參考agent類的HTML文檔,它提供這些doXXX方法的完整列表。注意:只有在活動(dòng)狀態(tài)下,代理才能執(zhí)行它的行為即它的任務(wù)。小心:如果任何一個(gè)行為調(diào)用doWait方法,那么整個(gè)agent和它的所有活動(dòng)都將被阻塞,而不僅僅是調(diào)用該方法的行為。block方法是Behaviour類的一局部,它允許

27、單個(gè)agent行為掛起詳見3.4節(jié)的行為用法。啟動(dòng)agent執(zhí)行JADE框架根據(jù)一下步驟控制新的agent的誕生:執(zhí)行agent構(gòu)造器,給agent賦一個(gè)標(biāo)識(shí)符見jade.core.AID類的HTML文檔,在AMS上注冊(cè),進(jìn)入活動(dòng)狀態(tài),最后執(zhí)行setup方法。根據(jù)FIPA標(biāo)準(zhǔn),agent標(biāo)識(shí)符有一下屬性:一個(gè)全局唯一的名字。默認(rèn)情況下由JADE用本地名字串聯(lián)組成例如,命令行提供的agent名字加上“,再加上本地AP標(biāo)識(shí)符例如: / JADE);還有一種情況在命令行說明平臺(tái)名字,本地名字加上加上規(guī)定的平臺(tái)名字串聯(lián)組成agent名字。一系列agent地址。每個(gè)agent繼承本地age

28、nt平臺(tái)的傳輸?shù)刂?。一系列解釋器,例如agent注冊(cè)用的白頁(yè)服務(wù)。setup方法是應(yīng)用程序定義的agent活動(dòng)開場(chǎng)的點(diǎn)。程序員要想初始化agent,必須執(zhí)行setup()方法。setup()方法執(zhí)行后,agent就已在AMS上注冊(cè),它的AP狀態(tài)處于活動(dòng)狀態(tài)。程序員應(yīng)該用以下初始化程序:可選的如果需要,修改AMS注冊(cè)數(shù)據(jù)見3.1.2可選的如果需要,設(shè)置agent的描述和它提供的服務(wù),以及在一個(gè)或多個(gè)域注冊(cè)agent,比方DFs見3.1.2必選的用addBehaviour()方法添加任務(wù)到準(zhǔn)備好的任務(wù)隊(duì)列。一旦setup方法完畢,就安排這些行為。setup()方法給agent至少添加一個(gè)行為。se

29、tup()方法完畢后,JADE自動(dòng)執(zhí)行準(zhǔn)備好的任務(wù)隊(duì)列中的第一個(gè)行為,然后用無優(yōu)先的循環(huán)調(diào)度方法切換到隊(duì)列中的其它行為。Agent類的addBehaviour(Behaviour和removeBehaviour(Behaviour方法可以用于管理任務(wù)隊(duì)列。停頓agent執(zhí)行任何行為都可以調(diào)用Agent.doDelete()方法來停頓agent運(yùn)行。當(dāng)agent將要進(jìn)入DELETED狀態(tài)時(shí),運(yùn)行Agent.takeDown方法,例如agent被銷毀的時(shí)候。takeDown方法可以被程序員重寫以執(zhí)行任何必要的清理。當(dāng)這個(gè)方法執(zhí)行的時(shí)候,agent仍然注冊(cè)在AMS上,從而可以給其它ag

30、ents發(fā)送消息,但是takeDown()方法完成后,agent將注銷,它的線程也將被銷毀。這個(gè)方法想要的目的的執(zhí)行程序指定的去除操作,如DF agents上的注銷。3.2.2 agents間通信Agent類也提供一系列agents間通信的方法。根據(jù)FIPA標(biāo)準(zhǔn),agents通過異步消息傳輸通信,ACLMessage類的對(duì)象是交換的有效載荷。也可以參見3.3節(jié)對(duì)ACLMessage類的描述。FIPA定義的一些交互協(xié)議如ready-to-use行為一樣可以為agent活動(dòng)指定;它們是to包的一局部。Agent.send方法允許發(fā)送ACLMessage。receiver字段的值說明

31、接收anget的IDs列表。該方法在agent所在的地方是完全透明的,比方作為本地的或遠(yuǎn)程的agent,平臺(tái)認(rèn)真選擇的最適宜的地址和傳輸機(jī)制。訪問私有消息隊(duì)列平臺(tái)通過一個(gè)agent將所有收到的消息參加agent私有隊(duì)列。從JADE2.5開場(chǎng)隊(duì)列的默認(rèn)規(guī)模是無限制的,但是,有限資源的事情下,可以通過setQueueSize()方法改變?nèi)笔≈???梢酝ㄟ^假設(shè)干中訪問模式從這個(gè)私有隊(duì)列中得到消息:可以以控制使用blockingReceive方法或非控制方式用receive()方法訪問消息隊(duì)列。必須慎用控制方式,因?yàn)樗鼤?huì)引起所有agent活動(dòng)掛起,尤其是它所有的行為。當(dāng)隊(duì)列中沒有請(qǐng)求消息時(shí)

32、,非控制方式立刻返回null。兩種方法都可以通過pattern-matching能力擴(kuò)展,傳入一個(gè)描述請(qǐng)求的ACLMessage的方式的參數(shù)。3.3.4描述的MessageTemplate類。控制訪問可以有一個(gè)時(shí)間間隔參數(shù)。它是長(zhǎng)整型的,用來描述為請(qǐng)求消息agent活動(dòng)應(yīng)該保持控制等待狀態(tài)的最大毫秒數(shù)。如果消息到達(dá)前超過了間隔時(shí)間,該方法返回null。兩個(gè)行為ReceiverBehaviour和SenderBehaviour可以用來安排請(qǐng)求接收或發(fā)送消息的agent任務(wù)。3.2.3圖形交互界面agent一個(gè)構(gòu)建多agent系統(tǒng)的應(yīng)用程序仍然需要與用戶交互。所以,有必要提供GUI,至少是為程序中

33、的一些agents提供。這一需要仍引發(fā)了一些問題,是由agent的自治屬性和普通 GUI的反作用屬性之間的不匹配引發(fā)的。這些是JADE需要提高一些問題。當(dāng)JADE被使用,JADE agents的thread-per-agent并行模型必須和Swing并行模型一起工作。 Java GUI并行模型在一個(gè)JAVA虛擬機(jī)上有一個(gè)單一線程,成為Event Dispatcher Thread,它的任務(wù)是從System Event Queue它是java.awt.EventQueue類的一個(gè)實(shí)例中連續(xù)選擇事件對(duì)象比方:java.awt.AWTEvent類的實(shí)例。然后其它事情中的事件調(diào)度線程,調(diào)

34、用各種注冊(cè)到事件資源的監(jiān)聽者。重要觀察的是所有的事件監(jiān)聽者都在一個(gè)單一的控制線程the event dispatcher中執(zhí)行;因?yàn)檫@遵循的規(guī)那么,所以每個(gè)事件監(jiān)聽者的執(zhí)行時(shí)間應(yīng)該縮短小于0.1s以確保界面響應(yīng)。一個(gè)重要的Swing特征是Model/View系統(tǒng)來管理GUI更新。Swing控制器有某種狀態(tài)JCheckBox有checked標(biāo)識(shí),JList持有元素,等等,這狀態(tài)保存在Model對(duì)象DefaultButtonModel類,ListModel類,等中。model類提供修改狀態(tài)的命令比方,檢測(cè)或不檢測(cè)checkbox,list中添加或去除元素,等,并且Swing建設(shè)了告知機(jī)制,更新可見

35、的GUI的外觀以反映狀態(tài)的改變。所以JCheckBox對(duì)象可以在兩種情況下改變它的外觀:從用戶接收到事件如,一個(gè)MouseClick事件程序中的其它局部改變了和JChecBox相關(guān)的model對(duì)象正如在JAVA指南JFC/Swing trail、Threads和Swing局部里指出的一樣,Swing框架不是線程安全的,因此任何更新GUI元素的代碼必須在事件調(diào)度線程之內(nèi)執(zhí)行;因?yàn)楦淖円粋€(gè)model對(duì)象會(huì)引發(fā)GUI的更新,所以按照上面所說的,model對(duì)象也必須由事件調(diào)度線程來控制。Swing框架提供了一個(gè)簡(jiǎn)單但通用的方式將一些用戶定義的代碼傳給Event Dispatcher thread:Sw

36、ingUtilities類包含了兩個(gè)靜態(tài)方法,承受Runnable對(duì)象,用RunnableEvent將其封裝,并把它放到System Event Queue中。invokeLater()方法把Runnable放入System Event Queue中,并立即返回此行為類似于異步交互線程調(diào)用,而invokeAndWait()方法把Runnable放入System Event Queue中,就休眠直到Event Dispatcher thread處理了RunnableEvent此行為類似于同步交互線程調(diào)用。而且,invokeAndWait()方法可以捕獲由Runnable對(duì)象拋出的異常。3.2.3

37、.2為響應(yīng)一個(gè)GUI事件做一次ACL信息交換當(dāng)一個(gè)agent被給一個(gè)GUI時(shí),那么因?yàn)橛脩舻膭?dòng)作,要求該agent發(fā)送一個(gè)消息例如,用戶點(diǎn)擊了pushbutton。ActionListener按鈕將在事件調(diào)度線程之內(nèi)運(yùn)行,而Agent.send方法應(yīng)當(dāng)在agent線程之內(nèi)調(diào)用。所以:在事件監(jiān)聽者中,給agent添加一個(gè)新的行為,以執(zhí)行必須的通信。如果做的通訊是一個(gè)簡(jiǎn)單的信息傳送操作,可以使用SenderBehaviour類,事件管理者將包括一行代碼如下:myAgent.addBehaviournew SenderBehaviourmsgToSend );如果通訊操作是一個(gè)信息接收操作,同樣地可

38、以用ReceiverBehaviour類:myAgent.addBehaviournew ReceiverBehaviourmsgToRecv );更一般地說,當(dāng)用戶在GUI上操作時(shí),一些復(fù)雜的會(huì)話例如,遵循交互協(xié)議的整個(gè)交互過程就會(huì)啟動(dòng)。在一次,這個(gè)方法給agent添加一個(gè)新的行為;這個(gè)行為將為交互協(xié)議擴(kuò)展預(yù)先定義的JADE behaviours類,或?qū)⑹且粋€(gè)定制的復(fù)雜行為。下面的代碼是從JADE RMA management agent中抽取出來的。當(dāng)用戶要?jiǎng)?chuàng)立一個(gè)新的agent的時(shí)候,他/她就在RMA GUI上操作通過菜單欄,工具欄或彈出菜單執(zhí)行StartNewAgentAction對(duì)象

39、,該對(duì)象調(diào)用rma類的newAgent()方法。這一方法代碼如下:AMSClientBehaviour類是ram類的一個(gè)私有內(nèi)部類,它擴(kuò)展自FipaRequestInitiatorBehaviour,與AMS agent間使用fipa-request交互協(xié)議。在這種情況下,addBehaviour()調(diào)用和特定行為類的添加都被完全封裝到rma類內(nèi)。RMA GUI主要是action類的各種類都參考RMA agent,并用它來調(diào)用方法,如newAgent()。注意:像newAgent()之類的方法并不是真正屬于該agent的,因?yàn)樗鼈儾灰匀魏畏绞皆L問該agent。所以,它們是為了從外部不同的執(zhí)行線

40、程調(diào)用而設(shè)計(jì)的:接下來,這些方法將稱為external methods。一般來說,一個(gè)外部軟件組件維持關(guān)于agent的直接對(duì)象不是件好事,因?yàn)檫@個(gè)組件可以直接調(diào)用該agent的任何公共方法而不僅僅是外部的方法,跳過異步消息傳輸層,把自治agent轉(zhuǎn)換為服務(wù)對(duì)象,附屬于它的調(diào)用者。更好的方法是將所有的外部方法集中到一個(gè)接口,再由agent類使用。這樣涉及到該接口的對(duì)象將被傳送到GUI,這樣只有外部方法可以從事件管理者那里調(diào)用。下面的代碼將解釋這個(gè)方法;上面的例子,GUI智能調(diào)用RMA agent的外部方法。收到ACL消息時(shí)修改GUIAnget可以通過ACL消息從其它agents獲取

41、消息:FIPA通信原語(yǔ)inform就是用于此目的。如果該gent有一個(gè)GUI,它會(huì)想經(jīng)常通過改變可視的GUI外觀和它的用戶交流新的信息。根據(jù)Model/View模式,新消息應(yīng)該用于修改一些model對(duì)象,Swing會(huì)自動(dòng)更新GUI。用于讀取消息的Agent.receive()操作在agent線程中執(zhí)行,但是對(duì)Swing model對(duì)象的修改必須從Event Dispathcer線程中執(zhí)行。所以:在agent行為中,將所有對(duì)GUI model對(duì)象的訪問封裝成一個(gè)Runnable對(duì)象,用SwingUtilities.invokeXXX()將Runnable提交給Event Dispathcer線程

42、。例如,當(dāng)一個(gè)新的agent在JADE平臺(tái)誕生,AMS就會(huì)發(fā)送inform消息給所有的活動(dòng)的RMA agents;它們當(dāng)中的每個(gè)agent都要更新它的AgentTree,添加代表新agent的節(jié)點(diǎn)。rma類掌管著內(nèi)部的和私有的AMSListerner類的行為,它不斷從AMS接收inform消息,并將消息發(fā)送給適宜的內(nèi)部事件管理者它 基本上是一個(gè)簡(jiǎn)單地分布式的ACL消息上的事件系統(tǒng)。與agent-born事件相對(duì)應(yīng)的管理者有下面的代碼:正如從上面代碼中看到的,對(duì)agent樹的所有訪問都被封裝到Runnable中,用SwingUtilities.invokeLater()方法提交到Event Di

43、spatcher線程執(zhí)行。整個(gè)Runnable創(chuàng)立和提交過程都包含在MainWindow類的addAgent()方法中,這樣rma agent不直接處理Swing調(diào)用它甚至不必引用Swing相關(guān)類。如果我們將整個(gè)MainWindow作為一個(gè)活動(dòng)對(duì)象,它的線程是Event Dispatcher線程,addAgent()方法明顯的是一個(gè)外部方法,這個(gè)方法準(zhǔn)確反映了上面局部中用到的技術(shù)。但是,因?yàn)镚UI沒有被看做自治軟件組件,所以是否選擇使用外部方法只是一個(gè)軟件構(gòu)造問題,沒有特殊的概念意義。在JADE上構(gòu)建GUI可用的agents使agents擁有GUI是件很普通的事情, JADE包含

44、jade.gui.GuiAgent類以到達(dá)這個(gè)目的。這個(gè)類是jade.core.Agent類的簡(jiǎn)單擴(kuò)展:在啟動(dòng)(setup()方法執(zhí)行的時(shí)候)的時(shí)候,它建設(shè)ad-hoc behaviour的實(shí)例,管理jade.gui.GuiEvent事件對(duì)象的隊(duì),該隊(duì)列可以被其它線程接收。當(dāng)然,這個(gè)行為對(duì)程序員是隱藏的,他們只需要實(shí)現(xiàn)和每個(gè)事件相關(guān)的應(yīng)用程序代碼。詳細(xì)地說,必須執(zhí)行下面的操作。一個(gè)線程尤其是GUI希望通知一個(gè)事件給一個(gè)agent,它就應(yīng)該創(chuàng)立一個(gè)新的jade.gui.GuiEvent類型的對(duì)象,并將它作為參數(shù)傳給jade.gui.GuiAgent對(duì)象的postGuieEvent方法的調(diào)用。po

45、stGuiEvent()方法調(diào)用后,agent通過喚醒所有它的活動(dòng)行為作為反響,尤其是上面提到使agent線程執(zhí)行onGuiEvent()方法的行為。注意:GuiEvent對(duì)象有兩個(gè)必須的屬性the source of the event和an integer identifying the type of event和一個(gè)可以添加到event對(duì)象的可選參數(shù)列表。作為結(jié)果,希望從另一線程尤其是它的GUI接收事件的agent應(yīng)該定義它想接收的事件的類型,然后執(zhí)行onGuiEvent()方法。一般來說,這個(gè)方法是一個(gè)大的循環(huán),每種情況對(duì)應(yīng)一種事件類型。JADE發(fā)布的mobile例子就是一個(gè)很好的例

46、子。為了進(jìn)一步解釋前面的概念,下面給出一些關(guān)于MobileAgent例子的有趣的代碼段:3.2.4帶參數(shù)的agent和啟動(dòng)代理參數(shù)列表可以傳給agent,也可以通過調(diào)用方法Object getArguments()進(jìn)展檢索。注意:參數(shù)是瞬時(shí)的,不能與agent一起遷移,也不能隨agent克隆。有三種方式啟動(dòng)agent:使用管理者指南中描述的語(yǔ)法,在命令行輸入一張agent列表,括號(hào)中的參數(shù)可以傳給每個(gè)agent。這是最普通的選擇,這個(gè)選擇也是與agent自治的理論要求最匹配的。如管理員指南中描述的,用戶可以通過使用RMARemote Monitoring AgentGUI啟動(dòng)agent。括號(hào)中

47、的參數(shù)可以傳給每一個(gè)agent。最后,任何外部Java程序可以用3.8節(jié)中描述的InProcess接口啟動(dòng)agent。3.3 agent通信語(yǔ)言ACL類ACLMessage代表可以在agents間交換的ACL消息。它包含一系列FIPA標(biāo)準(zhǔn)定義的屬性。希望發(fā)送消息的agent應(yīng)該創(chuàng)立一個(gè)新的ACLMessage對(duì)象,然后用恰當(dāng)?shù)闹堤畛鋵傩?,最后調(diào)用方法Agent.send()。同樣地,希望接收消息的agent應(yīng)該調(diào)用receive()或blockingReceive()方法,Agent類使用的兩種方法在3.2.2節(jié)中都介紹了。通過在agent任務(wù)隊(duì)列參加ReceiverBehaviour和Sen

48、derBehaviour行為,發(fā)送或接收消息也可以作為獨(dú)立的agent活動(dòng)。所有ACLMessage對(duì)象的屬性都可以通過set/get()訪問方法進(jìn)展訪問。所有屬性按FIPA標(biāo)準(zhǔn)定義的參數(shù)名字命名。那些參數(shù)類型是一個(gè)值的集合如receiver的參數(shù)可以通過方法add/getAll()訪問,第一個(gè)方法添加值到結(jié)合中,第二個(gè)方法根據(jù)集合內(nèi)所有的值返回Iterator。注意:當(dāng)沒有設(shè)置屬性的時(shí)候,所有的get()方法返回null。此外,這個(gè)類也定義了一個(gè)常量集合,用于說明FIPA原語(yǔ),如REQUEST, INFORM,等。當(dāng)創(chuàng)立一個(gè)新的ACLMessage對(duì)象的時(shí)候,這些常量中的一個(gè)必須傳遞給ACL

49、Message類構(gòu)造器,以選擇消息原語(yǔ)。reset()方法重置所有消息字段的值。toString()方法返回代表消息的字符串。這個(gè)方法應(yīng)該只用作調(diào)試目的。3.3.1支持消息回復(fù)根據(jù)FIAP標(biāo)準(zhǔn),必須按照一系列成熟的規(guī)那么進(jìn)展消息回復(fù)。如,為in-reply-to屬性設(shè)置恰當(dāng)?shù)闹?,使用同樣的conversation-id,等。在這項(xiàng)任務(wù)中,JADE ACLMessage類的createReply()方法幫助程序員。這個(gè)方法返回一個(gè)新的ACLMessage對(duì)象,該對(duì)象是對(duì)當(dāng)前消息的有效回復(fù)。程序員只需要設(shè)置程序指定通信動(dòng)作和消息內(nèi)容。3.3.2支持JAVA傳送字節(jié)有些程序可能從傳送ACLMessa

50、ge消息之外的字節(jié)序列獲益。典型的用法就是通過使用Java序列化在兩個(gè)agents之間傳送Java對(duì)象。在這個(gè)任務(wù)中,ACLMessage類通過setContentObject()和getContentObject()方法支持程序員,這兩個(gè)方法自動(dòng)激活Base64編碼用法。參考JADE API的HEML文檔,在examples/Base64目錄下找到關(guān)于這一用法的例子。從JADE2.5開場(chǎng),增加了兩個(gè)方法允許到/從ACLMessage的內(nèi)容設(shè)置/獲取字節(jié)序列:get/setByteSequenceContent()。在某些情況下尤其是當(dāng)ACLMessage編碼成字符串格式,字節(jié)序列可能創(chuàng)立不兼

51、容的和不可回復(fù)的消息內(nèi)容,使用這兩個(gè)方法的時(shí)候一定要格外小心。3.3.3ACL編碼解碼器在一般情況下,agent從來不需要顯式調(diào)用ACL消息的編碼解碼器,因?yàn)樗善脚_(tái)自動(dòng)調(diào)用。然而,對(duì)一些特殊情況,需要顯式調(diào)用的時(shí)候,程序員應(yīng)該用StringACLCodec類提供的方法以字符創(chuàng)格式對(duì)ACL消息進(jìn)展解析和編碼。3.3.4MessageTemplate類JADE行為模型允許agent執(zhí)行假設(shè)干并行任務(wù)。然而也應(yīng)該提供任何agent執(zhí)行多個(gè)并發(fā)會(huì)話的能力。因?yàn)樗幸氲南㈥?duì)列由所有的agent行為共享,所以必須使用基于模式匹配的訪問模式訪問該隊(duì)列見。MessageTemplate類允

52、許建設(shè)模式以匹配ACL消息。用這個(gè)類的方法,程序員可以為每個(gè)ACLMessage屬性創(chuàng)立模式。 基本模式可以用AND, OR和NOT進(jìn)展合并操作,以建設(shè)更復(fù)雜的匹配規(guī)那么。以這樣的方式,引入ACL消息隊(duì)列可以通過模式匹配而不是FIFO訪問。用戶可以定義程序特定的模式,擴(kuò)展MatchExpression接口以提供新的match()方法用于模式匹配階段。在examples包的MessageTemplate目錄下的WaitAgent例子,說明了創(chuàng)立程序特定MessageTemplate的創(chuàng)立方法:3.3.5基于主題的通信從JADE3.5版也支持基于主題的通信,除了給一個(gè)或多個(gè)接收者addressed

53、 by name發(fā)送消息,它還可以發(fā)送關(guān)于某一給定主體的消息。這種消息將被發(fā)給所有在該主題下注冊(cè)它們的興趣的agent。如果沒有agent在一個(gè)主題下注冊(cè)它的興趣,給該主題發(fā)送消息怎沒有任何影響例如,收不到FAILURE回復(fù)。應(yīng)該注意一點(diǎn),發(fā)送者agent不需要知道任何關(guān)于有哪個(gè)agent注冊(cè)到該主題的信息?;谥黝}的通信由jade.core.messaging.TopicManagementService實(shí)現(xiàn),因此必須激活平臺(tái)上所有的容器見JADE管理員指南上的JADE Kernel services。為了有一個(gè)完全一致的API使得既能發(fā)送消息給既定的接收者又能發(fā)送關(guān)于給定的主題消息,主題由

54、AID對(duì)象表示。TopicManagementHelper接口包含在jade.core.messaging包內(nèi),提供創(chuàng)立主題AIDs的便利方法,如果給出一個(gè)AID表示一個(gè)主題isTopic(),也負(fù)責(zé)進(jìn)展檢查。給一個(gè)既定的主題發(fā)送消息,只要把主題AID添加到消息接收者中就可以了。因此一個(gè)關(guān)于“JADE主題的消息可以通過下面這段代碼來發(fā)送:注冊(cè)關(guān)于一個(gè)既定主題的接收消息通過TopicManagementHelper接口的register()方法來實(shí)現(xiàn),例子如下:典型地,當(dāng)注冊(cè)接收關(guān)于某一主題的消息時(shí),處理這些消息的適當(dāng)?shù)男袨橐砑拥絘gent中。MatchTopic()庫(kù)方法已被添加到Messa

55、geTemplate類以便于關(guān)于某一給定主題的模板匹配消息的創(chuàng)立,例子如下:3.4 agent任務(wù),執(zhí)行agent行為一個(gè)agent必須能夠執(zhí)行假設(shè)干個(gè)并行任務(wù)以相應(yīng)不同的外部事件。為了有效管理agent,每個(gè)JADE agent由一個(gè)單獨(dú)的執(zhí)行線程組成,將所有任務(wù)建模,用Behaviour對(duì)象執(zhí)行。多線程agent也可以執(zhí)行,但JADE沒有提供特殊的支持除了同步的ACL消息隊(duì)列。希望執(zhí)行明確agent任務(wù)的開發(fā)者應(yīng)該定義一個(gè)或多個(gè)Behaviour子類,實(shí)例化它們,并將它們添加到agent任務(wù)列表。Agent類必須由agent程序員進(jìn)展擴(kuò)展,方法有兩種:addBehaviour(Behavi

56、our)和removeBehaviour(Behaviour),可以用來管理特殊的agent的準(zhǔn)備好的任務(wù)隊(duì)列。注意:行為和子行為可以在需要的時(shí)候隨時(shí)添加,而不是只在Agent.setup()方法中。添加行為應(yīng)該被視為在agent內(nèi)產(chǎn)生新的合作的執(zhí)行線程。由根基Agent類執(zhí)行的,對(duì)程序員隱藏的安排程序,在準(zhǔn)備好的隊(duì)列中有效的所有行為之間按照一個(gè)循環(huán)的沒有優(yōu)先權(quán)的排序策略執(zhí)行。執(zhí)行一個(gè)Behaviour驅(qū)動(dòng)的類直到它釋放控制權(quán)當(dāng)action()方法返回時(shí)發(fā)生。如果放棄控制權(quán)的任務(wù)仍然沒有完成,將把它安排在下一輪。一個(gè)行為也可以進(jìn)入休眠,等待一個(gè)消息的到達(dá)。詳細(xì)地說,agent調(diào)度程序執(zhí)行出現(xiàn)在

57、準(zhǔn)備好的行為隊(duì)列中的每個(gè)行為的action()方法;當(dāng)action()方法返回時(shí),調(diào)用done()方法來檢查該行為是否完成了它的任務(wù)。如果完成了,該行為對(duì)象從隊(duì)列中移除。行為就像合作的線程一樣工作,但是沒有堆棧保存。因此,整個(gè)計(jì)算狀態(tài)必須維持例如各種Behaviour和它的相關(guān)Agent。為了防止一個(gè)活動(dòng)等待消息浪費(fèi)CPU時(shí)間,允許每個(gè)單獨(dú)Behaviour休眠它自己的計(jì)算。一旦action()方法返回,block()方法就將行為放入休眠行為隊(duì)列中。注意:調(diào)用block()方法后休眠效果并不能馬上到達(dá),但是只要action()方法返回后。一旦一個(gè)新的消息到底,所有休眠的行為就要從新安排,因此,

58、程序員必須注意,如果一個(gè)行為對(duì)到達(dá)的消息沒有興趣,就要再次休眠該行為。而且,一個(gè)行為對(duì)象可以通過傳遞間隔時(shí)間值給block()方法使自己休眠有限的時(shí)間。未來JADE的釋放,可能要考慮更多喚醒事件。由于為agent行為選擇了無優(yōu)先權(quán)的多任務(wù)模型,agent程序員必須防止使用無端回線,甚至是action()方法內(nèi)執(zhí)行太長(zhǎng)的操作。記?。寒?dāng)一些行為的action()正在執(zhí)行的時(shí)候,其它行為不能繼續(xù)直到該方法完畢當(dāng)然,這只是相對(duì)于同一個(gè)agent的行為來說的:其它agents的行為在不同的Java線程中運(yùn)行,仍然可以獨(dú)立執(zhí)行。除此之外,因?yàn)闆]有堆棧競(jìng)爭(zhēng)存在,每次action()方法都從開場(chǎng)執(zhí)行:沒有方法

59、能在行為的action()方法中間打斷它,分配CUP給其它行為,從原始行為開場(chǎng)的地方啟動(dòng)它。例如,假設(shè)一個(gè)特定的操作op()一步完成太長(zhǎng),所以就分成三個(gè)子操作,命名為op1(),op2()和op3()。為了到達(dá)期望的功能,行為運(yùn)行時(shí)必須第一次調(diào)用op1(),第二次調(diào)用op2(),第三次調(diào)用op3(),然后該行為必須被標(biāo)記為完畢。代碼如下:按照這個(gè)方法,agent行為可以描述為有限狀態(tài)機(jī),維持整個(gè)狀態(tài)在不同的實(shí)例變量中。當(dāng)處理復(fù)雜的agent行為作agent交互協(xié)議時(shí),用外部狀態(tài)變量可能比較繁瑣;所以JADE也支持合成技術(shù),由各個(gè)簡(jiǎn)單的行為來建設(shè)更復(fù)雜的行為。該框架準(zhǔn)備好提供使用Behaviou

60、r子類,從而可以包含子行為并按照某些策略執(zhí)行它們。例如:提供的SequentialBehaviour類,由每個(gè)action()引導(dǎo),它一個(gè)接一個(gè)的執(zhí)行它的子行為。下面的圖用UML類圖示JADE行為:從根基類Behaviour開場(chǎng),類的層次在JADE框架的jade.core.behaviours包中定義。下面完整地介紹所有這些類。3.4.1 Behaviour類這個(gè)抽象類為模擬agent任務(wù)提供了一個(gè)抽象根基類,為行為調(diào)度創(chuàng)立了根基,因?yàn)樗试S狀態(tài)轉(zhuǎn)換如:starting, blocking,restarting a Java behaviour object。block()方法允許暫停一個(gè)行為

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論