鄭文恩 陸銘華 肖明彥
(海軍潛艇學院軟件中心 青島 266071)
艦艇指揮員為完成特定的作戰任務,需要根據戰場態勢的變化,進行攻防作戰決策。作戰決策系統的構建是艦艇作戰仿真的核心內容。作戰決策模型的基本形式為:若當前作戰狀態滿足狀態轉換條件,則轉入新作戰狀態。傳統作戰決策模型采用產生式規則表示法[1],即P→Q。其實現方法是,根據戰術想定,將作戰決策規則編寫為嵌套的ifelse程序語句,內嵌在其它程序代碼中。該方法使維護作戰決策規則變得很復雜,一旦開發完成,不容易變更。然而,現實情況卻是,作戰決策規則需要根據不同戰術想定而變化,使用人員希望直接管理作戰決策規則,不必要求程序開發人員參與。但是,對于很多復雜的作戰決策規則,開發人員很難抽象出算法和數據模型;作戰決策規則嵌在程序代碼中,也不可能讓非開發人員管理。為解決這個矛盾,提高系統開發效率,更好地滿足艦艇作戰仿真系統經常變化的軍事需求,需要將作戰決策規則和仿真程序代碼分開。本文提出應用Java開源規則引擎Drools[2]構建艦艇作戰決策系統的方法,介紹了Drools原理,給出了基于Drools的艦艇作戰決策系統的模型框架和系統的編程實現方法,通過仿真系統驗證了該方法的可行性。
作戰決策是指根據作戰任務、目標綜合信息(包括目標類型、態勢、威脅等級和可攻性)和艦艇作戰狀態及作戰過程,確定艦艇應采取的攻擊或防御行動,包括作戰目標、使用武器類型和攻防作戰樣式。決策依據艦艇典型戰術原則和攻防作戰規則。
作戰決策系統是艦艇作戰仿真軟件的核心,它們相互之間的邏輯關系如圖1所示。
作戰決策系統的輸入數據包括目標綜合信息和艦艇當前作戰狀態信息。
其中,目標綜合信息包括目標類型、運動要素、威脅強度和可攻性數據。艦艇作戰狀態信息描述艦艇攻擊和防御的狀態及子狀態。作戰狀態標示一個具體的作戰過程,而作戰子狀態進一步細化描述作戰狀態。如“魚雷攻擊”作戰狀態表示艦艇處于使用魚雷攻擊目標的作戰過程中,“魚雷攻擊”作戰子狀態則將攻擊過程細化為“確定攻擊方案”、“占領發射陣位”、“發射魚雷”和“觀察攻擊效果”四個子過程。
作戰決策系統的輸出數據是艦艇攻擊或防御決策結果。攻擊決策結果有“導彈攻擊”、“魚雷攻擊”等;防御決策結果有“防御魚雷”、“防御直升機”和“防御艦艇”等。
作戰過程改變戰場態勢,即目標綜合信息和艦艇作戰狀態都可能發生改變,這些變化的信息持續作為系統的輸入進行下一步決策。

圖1 艦艇作戰決策系統與其它子系統的邏輯關系圖
規則引擎源于基于規則的專家系統,規則引擎由規則庫(Rule Base)、工作內存(Working Memory)和推理引擎(Inference Engine)三部分組成。其優點如下:
1)聲明式編程
允許描述做什么而不是如何去做,從而使用規則更加容易對復雜的問題進行表述,并得到驗證。使用規則引擎能方便地構造復雜專家系統。
2)邏輯與數據分離
數據保存在系統對象中,邏輯保存在規則中。解決了面向對象系統中數據和邏輯混編的問題,這樣系統當業務邏輯發生改變時更容易維護。
3)速度及可測量性
規則引擎使用的Rete算法[3]提供了對數據對象與規則的高效率匹配。
4)知識集中化
將規則建立一個可執行的規則庫,它代表現實中的業務邏輯。
Drools是基于ReteOO算法的Java語言開源軟件,ReteOO表示面向對象系統(Object Oriented systems)增強并優化的Rete算法。圖2是Drools規則引擎的邏輯圖。

圖2 Drools規則引擎的邏輯圖
Drools規則引擎運行機制是通過快速檢索工作內存(Working Memory)中的對象與加載到其中的各項規則的前件進行匹配,激活符合條件的規則,放入沖突集中。將沖突集中的規則根據規則的優先權排序生成議程(Agenda),從而使優先級高的規則優先觸發。規則執行后,規則的后件執行部分會改變加載到內存中的事實對象信息,使議程中一些激活的規則的前提條件不再得到滿足,從議程中撤銷,同時,可能有新的規則被激活加入議程中。因此,Drools是基于規則的自動推理機,非常適合用來構建作戰決策系統。
根據上文分析,給出如圖3所示的基于Drools規則引擎的艦艇作戰決策系統實現框架。
作戰決策依賴的戰場態勢信息作為Drools規則引擎的事實,分為目標綜合信息事實和艦艇作戰狀態事實,用Java類對象來實現,類對象僅包含對象本身的屬性和屬性的get和set方法,而不包含對象之間的約束關系和邏輯。這些事實對象,通過Drools規則引擎的StatefulKnowledge-Session對象的insert方法導入到工作內存中[5],完成與規則庫中的規則前件模式匹配過程。
目標綜合信息事實類tarMessage定義如下:
4.3.1 艦艇作戰決策規則
艦艇作戰決策規則為多條產生式,組成艦艇決策知識庫。例如“在跟蹤目標作戰狀態下”決策規則有如下四個子規則:
規則1 若目標威脅強度為0且類型為直升機,則作戰狀態轉為“防御直升機”;
規則2 若目標威脅強度為0且類型為艦艇,則作戰狀態轉為“防御艦艇”;
規則3 若目標威脅強度為大于0,導彈可攻且距離大于a鏈,則作戰狀態轉為“導彈攻擊”;
規則4 若目標威脅強度為大于0,魚雷可攻且距離小于或等于b鏈,則作戰狀態轉為“魚雷攻擊”。
可以看出,艦艇作戰決策的規則雖然很復雜,但可分解為相對簡單的多條規則,便于理解和使用。
4.3.2 Drools規則語法和艦艇作戰規則的表示
1)Drools規則的形式化描述
規則是對領域知識的編碼。一條規則有屬性(attribute),一個左部(LHS)和一個右部(RHS)。
Drools屬性用來控制規則執行,在目前Drools5中,規則的屬性共有13個[5],這些屬性分別適用于不同的場景,如salience控制規則執行優先級,no-loop說明是否允許規則執行一次。
(4.3.1)中“在跟蹤目標作戰狀態下”決策規則的規則1可以表示為:

類似,可以表示其它子規則。
2)艦艇作戰規則庫
在Drools中,一個標準的規則文件是一個以“.drl”結尾的文本文件,便于打開、查看和編輯。一個規則文件可以存放多個規則,規則文件中還可以存放用戶自定義的函數、數據對象及自定義查詢等規則可能用到的對象。
根據Drools規則庫的構建方法,把規則放在文件“decision.drl”中,形成艦艇作戰規則庫,文件的內容如下:

4.4.1 系統的開發環境和軟件
1)操作系統 Windows XP,Windows 7
2)開發軟件
MyEclipse Enterprise Workbench,Version:8.5
該軟件是一個開放、可擴展的企業級J2EE集成開發環境,它是由Eclipse Foundation開發的軟件。
3)安裝配置drools eclipse插件
從http://www.jboss.org/drools/downloads.html,下載drools最新drools eclipse插件文件drools-5.0-bin.zip,安裝到Eclipse集成開發環境中,并正確配置drools的Runtime環境。該軟件包中包含Drools運行所必須的組件,它包含若干jar包,在開發Drools應用程序時,需要導入到相應的工程中。
4.4.2 軟件開發的關鍵技術
4.4.2.1 規則的編譯與運行
規則的編譯與運行通過Drools提供的各種API實現,這些API分為三類:規則編譯、規則收集和規則的執行。完成這些工作的API主要有
KnowledgeBuilder、KnowledgeBase、StatefulKnowledgeSession等,它們起到對規則文件進行收集、編譯、查錯、插入fact、設置global、執行規則或規則流等作用。
1)KnowledgeBuilder類
KnowledgeBuilder的作用是完成規則文件編譯,產生一批編譯好的規則包(KnowledgePackage)給其它的應用程序使用。
創建KnowledgeBuilder對象使用的是Knowledge-BuilderFactory的newKnowledgeBuilder方法。
2)KnowledgeBase類
KnowledgeBase用來收集應用當中知識(knowledge)而定義的知識庫對象,它可以包含普通的規則(rule)、規則流(rule flow)、函數定義(function)、用 戶自定義對 象(type model)等。
創建一個KnowledgeBase要通過KnowledgeBaseFactory對象提供的newKnowledgeBase()方法來實現。
3)StatefulKnowledgeSession對象
通過StatefulKnowledgeSession與規則引擎進行交互,接收業務數據、執行規則。
StatefulKnowledgeSession對象是Drools的工作內存WorkingMemory,它與規則引擎建立一個持續的交互通道,在推理過程中可能會多次觸發同一數據集。
4)Fact對象
Fact是JavaBean插入到規則工作內存中的對象,是對原來JavaBean對象的引用。規則可以對Fact對象進行任意讀寫操作。
4.4.2.2 關鍵程序代碼

代碼演示了規則引擎完整的運行處理過程。首先,使用KnowledgeBuilder將相關的規則文件進行編譯,產生對應的KnowledgePackage集合,再通過KnowledgeBase把產生的KnowledgePackage集合收集起來,然后生成Stateful-KnowledgeSession對象,將規則中使用的fact對象插入,調用fireAllRules()方法觸發所有的規則執行。
采用本文方法開發了艦艇作戰仿真決策系統,規則庫有3000多條規則。程序運行測試顯示響應時間小于0.1s,完全能夠滿足系統的要求,驗證了方法的可行性和有效性。
本文提出的應用規則引擎構建艦艇作戰決策系統的方法,將作戰決策規則庫與艦艇作戰仿真軟件代碼獨立開來,并應用高效率的開源規則引擎Drools開發了應用系統軟件。解決了傳統的作戰決策系統開發中難度大、升級困難、系統匹配效率不高的問題。在作戰需求發生改變的情況下,可盡量不改動系統程序代碼,提高了系統的靈活性,降低了系統維護風險。應用該方法為大型作戰仿真軟件開發了作戰決策系統,經過實際檢驗,該方法切實可行。
[1]尹朝慶,尹皓.人工智能與專家系統[M].北京:中國水利水電出版社,2002.
[2]鄭浩然,肖偉.基于規則引擎的JAVA聲明式編程[J].計算機應用與軟件,2009,26(12):132-134.
[3]朱強.JAVA規則引擎在機場業務及資源管理中的應用[D].濟南:濟南大學,2008.
[4]何振榮.基于業務規則引擎的費用審核系統設計與實現[D].廈門:廈門大學,2009.
[5]高杰.Drools5規則引擎開發教程[EB/OL].http://www.docin.com/p-234488581.html.
[6]陸銘華.艦艇作戰模擬理論與方法[M].北京:海洋出版社,2000.
[7]王記偉.基于規則推理的應急事件自動處理技術研究[D].上海:東華大學,2009.
[8]郭芳,白建軍.基于Rete算法的規則引擎JBoss Rules[J].計算機時代,2008(1):8-10.
[9]劉亞琴,譚一兵.基于規則引擎的應用程序開發[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]唐基宏.模式數據庫在智能規劃中的應用[J].計算機與數字工程,2011,39(5).
[11]Drools 5-The Business Logic Integration Platform[EB/OL].Http://www.jboss.org/drools/.