郑文恩 陆铭华 肖明彦
(海军潜艇学院软件中心 青岛 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/.