鄭文恩 陸銘華 肖明彥
(海軍潛艇學院軟件中心 青島 266071)
艦艇指揮員為完成特定的作戰(zhàn)任務,需要根據(jù)戰(zhàn)場態(tài)勢的變化,進行攻防作戰(zhàn)決策。作戰(zhàn)決策系統(tǒng)的構(gòu)建是艦艇作戰(zhàn)仿真的核心內(nèi)容。作戰(zhàn)決策模型的基本形式為:若當前作戰(zhàn)狀態(tài)滿足狀態(tài)轉(zhuǎn)換條件,則轉(zhuǎn)入新作戰(zhàn)狀態(tài)。傳統(tǒng)作戰(zhàn)決策模型采用產(chǎn)生式規(guī)則表示法[1],即P→Q。其實現(xiàn)方法是,根據(jù)戰(zhàn)術(shù)想定,將作戰(zhàn)決策規(guī)則編寫為嵌套的ifelse程序語句,內(nèi)嵌在其它程序代碼中。該方法使維護作戰(zhàn)決策規(guī)則變得很復雜,一旦開發(fā)完成,不容易變更。然而,現(xiàn)實情況卻是,作戰(zhàn)決策規(guī)則需要根據(jù)不同戰(zhàn)術(shù)想定而變化,使用人員希望直接管理作戰(zhàn)決策規(guī)則,不必要求程序開發(fā)人員參與。但是,對于很多復雜的作戰(zhàn)決策規(guī)則,開發(fā)人員很難抽象出算法和數(shù)據(jù)模型;作戰(zhàn)決策規(guī)則嵌在程序代碼中,也不可能讓非開發(fā)人員管理。為解決這個矛盾,提高系統(tǒng)開發(fā)效率,更好地滿足艦艇作戰(zhàn)仿真系統(tǒng)經(jīng)常變化的軍事需求,需要將作戰(zhàn)決策規(guī)則和仿真程序代碼分開。本文提出應用Java開源規(guī)則引擎Drools[2]構(gòu)建艦艇作戰(zhàn)決策系統(tǒng)的方法,介紹了Drools原理,給出了基于Drools的艦艇作戰(zhàn)決策系統(tǒng)的模型框架和系統(tǒng)的編程實現(xiàn)方法,通過仿真系統(tǒng)驗證了該方法的可行性。
作戰(zhàn)決策是指根據(jù)作戰(zhàn)任務、目標綜合信息(包括目標類型、態(tài)勢、威脅等級和可攻性)和艦艇作戰(zhàn)狀態(tài)及作戰(zhàn)過程,確定艦艇應采取的攻擊或防御行動,包括作戰(zhàn)目標、使用武器類型和攻防作戰(zhàn)樣式。決策依據(jù)艦艇典型戰(zhàn)術(shù)原則和攻防作戰(zhàn)規(guī)則。
作戰(zhàn)決策系統(tǒng)是艦艇作戰(zhàn)仿真軟件的核心,它們相互之間的邏輯關(guān)系如圖1所示。
作戰(zhàn)決策系統(tǒng)的輸入數(shù)據(jù)包括目標綜合信息和艦艇當前作戰(zhàn)狀態(tài)信息。
其中,目標綜合信息包括目標類型、運動要素、威脅強度和可攻性數(shù)據(jù)。艦艇作戰(zhàn)狀態(tài)信息描述艦艇攻擊和防御的狀態(tài)及子狀態(tài)。作戰(zhàn)狀態(tài)標示一個具體的作戰(zhàn)過程,而作戰(zhàn)子狀態(tài)進一步細化描述作戰(zhàn)狀態(tài)。如“魚雷攻擊”作戰(zhàn)狀態(tài)表示艦艇處于使用魚雷攻擊目標的作戰(zhàn)過程中,“魚雷攻擊”作戰(zhàn)子狀態(tài)則將攻擊過程細化為“確定攻擊方案”、“占領發(fā)射陣位”、“發(fā)射魚雷”和“觀察攻擊效果”四個子過程。
作戰(zhàn)決策系統(tǒng)的輸出數(shù)據(jù)是艦艇攻擊或防御決策結(jié)果。攻擊決策結(jié)果有“導彈攻擊”、“魚雷攻擊”等;防御決策結(jié)果有“防御魚雷”、“防御直升機”和“防御艦艇”等。
作戰(zhàn)過程改變戰(zhàn)場態(tài)勢,即目標綜合信息和艦艇作戰(zhàn)狀態(tài)都可能發(fā)生改變,這些變化的信息持續(xù)作為系統(tǒng)的輸入進行下一步?jīng)Q策。
圖1 艦艇作戰(zhàn)決策系統(tǒng)與其它子系統(tǒng)的邏輯關(guān)系圖
規(guī)則引擎源于基于規(guī)則的專家系統(tǒng),規(guī)則引擎由規(guī)則庫(Rule Base)、工作內(nèi)存(Working Memory)和推理引擎(Inference Engine)三部分組成。其優(yōu)點如下:
1)聲明式編程
允許描述做什么而不是如何去做,從而使用規(guī)則更加容易對復雜的問題進行表述,并得到驗證。使用規(guī)則引擎能方便地構(gòu)造復雜專家系統(tǒng)。
2)邏輯與數(shù)據(jù)分離
數(shù)據(jù)保存在系統(tǒng)對象中,邏輯保存在規(guī)則中。解決了面向?qū)ο笙到y(tǒng)中數(shù)據(jù)和邏輯混編的問題,這樣系統(tǒng)當業(yè)務邏輯發(fā)生改變時更容易維護。
3)速度及可測量性
規(guī)則引擎使用的Rete算法[3]提供了對數(shù)據(jù)對象與規(guī)則的高效率匹配。
4)知識集中化
將規(guī)則建立一個可執(zhí)行的規(guī)則庫,它代表現(xiàn)實中的業(yè)務邏輯。
Drools是基于ReteOO算法的Java語言開源軟件,ReteOO表示面向?qū)ο笙到y(tǒng)(Object Oriented systems)增強并優(yōu)化的Rete算法。圖2是Drools規(guī)則引擎的邏輯圖。
圖2 Drools規(guī)則引擎的邏輯圖
Drools規(guī)則引擎運行機制是通過快速檢索工作內(nèi)存(Working Memory)中的對象與加載到其中的各項規(guī)則的前件進行匹配,激活符合條件的規(guī)則,放入沖突集中。將沖突集中的規(guī)則根據(jù)規(guī)則的優(yōu)先權(quán)排序生成議程(Agenda),從而使優(yōu)先級高的規(guī)則優(yōu)先觸發(fā)。規(guī)則執(zhí)行后,規(guī)則的后件執(zhí)行部分會改變加載到內(nèi)存中的事實對象信息,使議程中一些激活的規(guī)則的前提條件不再得到滿足,從議程中撤銷,同時,可能有新的規(guī)則被激活加入議程中。因此,Drools是基于規(guī)則的自動推理機,非常適合用來構(gòu)建作戰(zhàn)決策系統(tǒng)。
根據(jù)上文分析,給出如圖3所示的基于Drools規(guī)則引擎的艦艇作戰(zhàn)決策系統(tǒng)實現(xiàn)框架。
作戰(zhàn)決策依賴的戰(zhàn)場態(tài)勢信息作為Drools規(guī)則引擎的事實,分為目標綜合信息事實和艦艇作戰(zhàn)狀態(tài)事實,用Java類對象來實現(xiàn),類對象僅包含對象本身的屬性和屬性的get和set方法,而不包含對象之間的約束關(guān)系和邏輯。這些事實對象,通過Drools規(guī)則引擎的StatefulKnowledge-Session對象的insert方法導入到工作內(nèi)存中[5],完成與規(guī)則庫中的規(guī)則前件模式匹配過程。
目標綜合信息事實類tarMessage定義如下:
4.3.1 艦艇作戰(zhàn)決策規(guī)則
艦艇作戰(zhàn)決策規(guī)則為多條產(chǎn)生式,組成艦艇決策知識庫。例如“在跟蹤目標作戰(zhàn)狀態(tài)下”決策規(guī)則有如下四個子規(guī)則:
規(guī)則1 若目標威脅強度為0且類型為直升機,則作戰(zhàn)狀態(tài)轉(zhuǎn)為“防御直升機”;
規(guī)則2 若目標威脅強度為0且類型為艦艇,則作戰(zhàn)狀態(tài)轉(zhuǎn)為“防御艦艇”;
規(guī)則3 若目標威脅強度為大于0,導彈可攻且距離大于a鏈,則作戰(zhàn)狀態(tài)轉(zhuǎn)為“導彈攻擊”;
規(guī)則4 若目標威脅強度為大于0,魚雷可攻且距離小于或等于b鏈,則作戰(zhàn)狀態(tài)轉(zhuǎn)為“魚雷攻擊”。
可以看出,艦艇作戰(zhàn)決策的規(guī)則雖然很復雜,但可分解為相對簡單的多條規(guī)則,便于理解和使用。
4.3.2 Drools規(guī)則語法和艦艇作戰(zhàn)規(guī)則的表示
1)Drools規(guī)則的形式化描述
規(guī)則是對領域知識的編碼。一條規(guī)則有屬性(attribute),一個左部(LHS)和一個右部(RHS)。
Drools屬性用來控制規(guī)則執(zhí)行,在目前Drools5中,規(guī)則的屬性共有13個[5],這些屬性分別適用于不同的場景,如salience控制規(guī)則執(zhí)行優(yōu)先級,no-loop說明是否允許規(guī)則執(zhí)行一次。
(4.3.1)中“在跟蹤目標作戰(zhàn)狀態(tài)下”決策規(guī)則的規(guī)則1可以表示為:
類似,可以表示其它子規(guī)則。
2)艦艇作戰(zhàn)規(guī)則庫
在Drools中,一個標準的規(guī)則文件是一個以“.drl”結(jié)尾的文本文件,便于打開、查看和編輯。一個規(guī)則文件可以存放多個規(guī)則,規(guī)則文件中還可以存放用戶自定義的函數(shù)、數(shù)據(jù)對象及自定義查詢等規(guī)則可能用到的對象。
根據(jù)Drools規(guī)則庫的構(gòu)建方法,把規(guī)則放在文件“decision.drl”中,形成艦艇作戰(zhàn)規(guī)則庫,文件的內(nèi)容如下:
4.4.1 系統(tǒng)的開發(fā)環(huán)境和軟件
1)操作系統(tǒng) Windows XP,Windows 7
2)開發(fā)軟件
MyEclipse Enterprise Workbench,Version:8.5
該軟件是一個開放、可擴展的企業(yè)級J2EE集成開發(fā)環(huán)境,它是由Eclipse Foundation開發(fā)的軟件。
3)安裝配置drools eclipse插件
從http://www.jboss.org/drools/downloads.html,下載drools最新drools eclipse插件文件drools-5.0-bin.zip,安裝到Eclipse集成開發(fā)環(huán)境中,并正確配置drools的Runtime環(huán)境。該軟件包中包含Drools運行所必須的組件,它包含若干jar包,在開發(fā)Drools應用程序時,需要導入到相應的工程中。
4.4.2 軟件開發(fā)的關(guān)鍵技術(shù)
4.4.2.1 規(guī)則的編譯與運行
規(guī)則的編譯與運行通過Drools提供的各種API實現(xiàn),這些API分為三類:規(guī)則編譯、規(guī)則收集和規(guī)則的執(zhí)行。完成這些工作的API主要有
KnowledgeBuilder、KnowledgeBase、StatefulKnowledgeSession等,它們起到對規(guī)則文件進行收集、編譯、查錯、插入fact、設置global、執(zhí)行規(guī)則或規(guī)則流等作用。
1)KnowledgeBuilder類
KnowledgeBuilder的作用是完成規(guī)則文件編譯,產(chǎn)生一批編譯好的規(guī)則包(KnowledgePackage)給其它的應用程序使用。
創(chuàng)建KnowledgeBuilder對象使用的是Knowledge-BuilderFactory的newKnowledgeBuilder方法。
2)KnowledgeBase類
KnowledgeBase用來收集應用當中知識(knowledge)而定義的知識庫對象,它可以包含普通的規(guī)則(rule)、規(guī)則流(rule flow)、函數(shù)定義(function)、用 戶自定義對 象(type model)等。
創(chuàng)建一個KnowledgeBase要通過KnowledgeBaseFactory對象提供的newKnowledgeBase()方法來實現(xiàn)。
3)StatefulKnowledgeSession對象
通過StatefulKnowledgeSession與規(guī)則引擎進行交互,接收業(yè)務數(shù)據(jù)、執(zhí)行規(guī)則。
StatefulKnowledgeSession對象是Drools的工作內(nèi)存WorkingMemory,它與規(guī)則引擎建立一個持續(xù)的交互通道,在推理過程中可能會多次觸發(fā)同一數(shù)據(jù)集。
4)Fact對象
Fact是JavaBean插入到規(guī)則工作內(nèi)存中的對象,是對原來JavaBean對象的引用。規(guī)則可以對Fact對象進行任意讀寫操作。
4.4.2.2 關(guān)鍵程序代碼
代碼演示了規(guī)則引擎完整的運行處理過程。首先,使用KnowledgeBuilder將相關(guān)的規(guī)則文件進行編譯,產(chǎn)生對應的KnowledgePackage集合,再通過KnowledgeBase把產(chǎn)生的KnowledgePackage集合收集起來,然后生成Stateful-KnowledgeSession對象,將規(guī)則中使用的fact對象插入,調(diào)用fireAllRules()方法觸發(fā)所有的規(guī)則執(zhí)行。
采用本文方法開發(fā)了艦艇作戰(zhàn)仿真決策系統(tǒng),規(guī)則庫有3000多條規(guī)則。程序運行測試顯示響應時間小于0.1s,完全能夠滿足系統(tǒng)的要求,驗證了方法的可行性和有效性。
本文提出的應用規(guī)則引擎構(gòu)建艦艇作戰(zhàn)決策系統(tǒng)的方法,將作戰(zhàn)決策規(guī)則庫與艦艇作戰(zhàn)仿真軟件代碼獨立開來,并應用高效率的開源規(guī)則引擎Drools開發(fā)了應用系統(tǒng)軟件。解決了傳統(tǒng)的作戰(zhàn)決策系統(tǒng)開發(fā)中難度大、升級困難、系統(tǒng)匹配效率不高的問題。在作戰(zhàn)需求發(fā)生改變的情況下,可盡量不改動系統(tǒng)程序代碼,提高了系統(tǒng)的靈活性,降低了系統(tǒng)維護風險。應用該方法為大型作戰(zhàn)仿真軟件開發(fā)了作戰(zhàn)決策系統(tǒng),經(jīng)過實際檢驗,該方法切實可行。
[1]尹朝慶,尹皓.人工智能與專家系統(tǒng)[M].北京:中國水利水電出版社,2002.
[2]鄭浩然,肖偉.基于規(guī)則引擎的JAVA聲明式編程[J].計算機應用與軟件,2009,26(12):132-134.
[3]朱強.JAVA規(guī)則引擎在機場業(yè)務及資源管理中的應用[D].濟南:濟南大學,2008.
[4]何振榮.基于業(yè)務規(guī)則引擎的費用審核系統(tǒng)設計與實現(xiàn)[D].廈門:廈門大學,2009.
[5]高杰.Drools5規(guī)則引擎開發(fā)教程[EB/OL].http://www.docin.com/p-234488581.html.
[6]陸銘華.艦艇作戰(zhàn)模擬理論與方法[M].北京:海洋出版社,2000.
[7]王記偉.基于規(guī)則推理的應急事件自動處理技術(shù)研究[D].上海:東華大學,2009.
[8]郭芳,白建軍.基于Rete算法的規(guī)則引擎JBoss Rules[J].計算機時代,2008(1):8-10.
[9]劉亞琴,譚一兵.基于規(guī)則引擎的應用程序開發(fā)[J].邵陽學院學報(自然科學版),2006,3(2):53-56.
[9]LIU Ya-qin,TAN Yi-bing.Appliction development based on rule engine[J].Journal of Shaoyang University(Scince and Technoly),2006,3(2):53-56.
[10]唐基宏.模式數(shù)據(jù)庫在智能規(guī)劃中的應用[J].計算機與數(shù)字工程,2011,39(5).
[11]Drools 5-The Business Logic Integration Platform[EB/OL].Http://www.jboss.org/drools/.