杨 飞 朱会兵 马 和
(1.湖北省交通运输厅汉十高速公路管理处 武汉 430051;2.武汉理工大学信息工程学院 武汉 430070)
随着交通量的增长,通车时间越久,高速公路的破损情况就会越严重。早期修建的高速公路大多已接近使用年限,需要大修和改建;近年修建的高速公路也出现了不同程度的损坏。因此,及时准确地掌握高速公路的状态信息并采取相应的养护措施,对于维持高速公路良好的使用状态和保护人民群众生命财产安全都具有重大意义。对于业务逻辑的实现,多数路面管理系统采取固化在程序代码中的方式来实现,当业务逻辑很复杂并且发生变化时,系统的修改和扩展需要花费很大的代价。显然,这种高度耦合的方式给系统带来了很大风险。规则引擎可以很好地解决以上问题。本系统是以交通运输部2012年度推广应用项目——“沥青路面智能化养护关键技术”成果为基础,在构建了沥青路面养护对策库的基础上,研发了一种采用基于规则引擎的路面智能养护系统。该系统采用Drools作为系统的规则引擎,主要解决了以下问题:公路养护规则引擎的设计和规则的实现;规则的维护和管理;规则冲突的解决;系统的兼容性;整合前台显示规则与后台规则文件。
规则引擎是一种嵌入在应用程序中的组件,实现了将业务逻辑从应用程序中分离出来,并使用预定义的语义模块编写业务逻辑。规则引擎的主要工作是将输入的数据对象与加载的规则进行匹配,并由符合条件的规则生成规则执行实例。目前主流的规则引擎包括Ilog JRules,Drools,Jess,等等[1]。其中Ilog JRules和Jess都是相当成熟的商业BRMS,提供了一套完整的规则建模、规则编写、规则测试、规则部署和维护的工具,但是价格非常昂贵。Drools规则引擎是由JBoss开发的优秀的开源规则引擎[2],是开源规则引擎中使用最广的产品之一。除具有一般规则引擎的优点外,还具有高效的算法、丰富的规则语言、强大的API和工具集成等特点[3]。故选择Drools作为系统的规则引擎。
(1)基本信息模块。主要包括路线编码、区间编码、路段编码、公路等级、路面类型、车道类型、面层类型和基层类型等基本信息的管理。
(2)养护评价模块。主要功能是对路面使用性能 (PQI)、路 面 破 损 (PCI)、路 面 平 整 度(RQI)、路面车辙(RDI)、路面抗滑性能(SRI)和路面结构强度(PSSI)6个路况参数做出评价。
(3)养护决策模块。主要功能是根据路况数据得出养护方案和养护造价。
(4)规则管理模块。主要包括规则文件的编辑、冲突解决策略。
(5)系统管理模块。主要包括用户管理、权限管理和系统日志。
系统逻辑结构分为表示层、业务逻辑层和数据持久层3个层次,见图1。
图1 系统逻辑架构图
在表示层中,从JSP页面发送来的请求被转发到相应的Action控制器。Action控制器首先获取用户请求参数,然后调用业务逻辑层中相应的Service组件,Service组件再调用数据持久层中相应的Dao组件,执行相应的数据库操作,返回的处理结果将通过Action输出到JSP页面。当用户进行养护决策时,养护决策Action控制器调用业务逻辑层中的养护决策Service组件取得相应路况信息,调用规则管理Service组件从规则库中取得规则文件。使用规则引擎进行模式匹配,匹配成功的规则被送入议程等待执行,执行完毕后,输出养护方案。
依据“沥青路面智能化养护关键技术”的研究成果,本系统根据养护对策生成各项的判别规则并存储到数据库中。例如:当PCI>70,RQI>43.8,RDI>70,SRI>80.5,PSSI>80.2,并且病害类型为裂缝、局部坑槽、拥包、沉陷、松散和翻浆其中之一时,养护方案为F11。
(1)如果用户输入的路况数据只包含PCI,RQI等5个参数,不含病害数据和辅助参数,则要先按使用相同判别参数的规则进行规则的合并,生成FILE类型的规则文件。
(2)如果用户输入的路况数据包含PCI,RQI等5个参数且包含病害数据,但不包含辅助参数,则合并后生成对应于FILEX类型的规则文件。
(3)如果用户输入的路况数据包含PCI,RQI等5个参数且包含辅助参数,但不包含病害数据,则合并后生成对应于FILEY类型的规则文件。
(4)如果用户输入的路况数据包含PCI,RQI等5个参数且包含病害数据,也包含辅助参数,则上述规则对应于FILEZ类型的规则文件。
一个标准的规则文件就是一个扩展名为.drl的文本文件。根据规则文件的结构,可以将规则分为3部分:属性声明部分(attribute)、条件部分(LHS)和结果部分(RHS)。规则格式如下:
为了方便用户输入,这里采用可视化界面进行规则的生成和管理;并且设计了一个专门用于“翻译”的JavaBean,实现前台显示与后台规则文件的统一,见图2。
图2 规则文件添加界面
养护决策模块的处理流程包括数据准备、规则编译、规则执行和养护方案生成4部分。启动养护决策之后,首先判断数据库中是否存在指定的路况数据,如果存在,则读取路况数据和规则文件。然后编译规则文件,编译通过之后设置全局变量,并插入路况数据,执行规则文件,如果已经生成养护方案,则计算造价并存入数据库,见图3。
图3 养护决策流程图
一个事实对象在模式匹配的过程中,规则库中有多条规则与之匹配,从而可能产生多种结果,但不能确定具体得到哪个结果,即称产生了规则冲突[4]。规则冲突的根源来自于规则库的逻辑不完备或者不一致。因为规则库本身是一个逻辑系统,当规则库的添加或者修改导致规则库的逻辑不一致或者不完备时,就会发生规则冲突。Drools提供的冲突解决策略包括设置优先级和LIFO(后进先出)[5]。通过给规则设置优先级,可以确保不同优先级的规则不发生冲突,但是相同优先级的规则仍然可能冲突。后进先出策略只是简单地让后进入议程(Agenda)的规则先被激活,但是对可能存在的冲突没有做任何处理。
如何发现这种逻辑上的包含关系是问题的关键。一种方法是直接写if判断语句,如果用户输入的规则条件里有“不要求”语句,并且条件的其他部分与规则库里的某一条规则相同,那么就判定用户输入的规则不合法。如此需要考虑的情况将非常复杂,因为用户输入的规则里可能只有一个“不要求”语句,也可能有多个,而且具体是哪一个参数“不要求”也是不确定的,还有可能用户输入的规则里没有“不要求”语句,而规则库里的规则有“不要求”语句,这样也会形成逻辑冲突。
受集合论的启发,再考虑到Java优秀的字符串处理能力,笔者采用如下方法来检测逻辑冲突:为规则条件的每个部分加一个标记值,用于表示该项条件所代表的集合,约定“大于”记A,“小于”记B,则“不要求”记AB。例如,用户输入2条规则,记为 Rule A 和 Rule B,Rule A 的内容为:当PCI>70,RQI>43.8,RDI>70,SRI>80.5,PSSI>80.2时,养护方案为F11;Rule B的内容为:当PCI>70,RQI>43.8,RDI不要求,SRI>80.5,PSSI>80.2时,养护方案为F12。则Rule A的标记值表示为(A,A,A,A,A),Rule B的标记值可以表示为(A,A,AB,A,A)。这样要检测这种逻辑上的包含关系,只需用java.lang.String的contains()方法就可以实现。首先对用户输入规则文件的条件部分所对应的标记值进行赋值,然后将其与规则库里的规则文件逐个进行比较,这里又分2种情况,一种是用户输入规则在逻辑上被包含,另一种是用户输入规则在逻辑上包含规则库里的规则,这两种情况都属于逻辑冲突,记录下冲突规则的ID后,就可以设置警告信息。
针对现代路面信息管理系统面临的问题,本文介绍了基于Drools规则引擎的路面信息管理和决策系统的解决方案,讨论了系统的总体架构、业务规则的生成和管理、养护决策的处理流程和冲突的解决策略。文中利用Java语言的字符串处理能力,通过比较用户输入的规则与规则库原有规则,实现规则的冲突检测功能,防止规则的重复与冲突,保证了系统的稳定性。针对用户输入的路况数据可能不全面,存在参数缺失的情况,合理设计规则结构,使规则库可以处理多种类型数据,提高了系统的兼容性。设计了一个专门用于“翻译”的JavaBean,实现前台显示规则与后台规则文件的统一。
[1]张 渊,夏清国.基于Rete算法的Java规则引擎[J].科学技术与工程,2006,6(11):1548-1550.
[2]王重英.基于规则引擎的工作流系统设计[J].现代电子技术,2009(12):42-44.
[3]马秀丽,王红霞,张凌云.Drools在网络故障管理系统中的应用[J].计算机工程与设计,2009,30(8):1859-1862.
[4]ROSENBERG F,DUSTDAR S.Business rules integration in BPEL-a service-oriented approach[C]//7th International IEEE Conference on E-Commerce Technology(CEC’2005).Washington DC:IEEE Computer Society Press,2005:476-479.
[5]GRAHAM I.Business rules management and service oriented architecture[M].[S.l.]:Wiley,2007.