规则引擎在列控产品配置数据验证中的应用
2020-07-30崔岩
崔 岩
(1.北京全路通信信号研究设计院集团有限公司,北京 100070;2.北京市高速铁路运行控制系统工程技术研究中心,北京 100070)
1 概述
列车运行控制系统是保证高速铁路动车组安全、高效运行的核心技术装备,包括列控中心(TCC)、临时限速服务器(TSRS)、无线闭塞中心(RBC)等。各个设备依据技术规范和线路设计各司其职、协同工作。列控数据作为列控系统可靠运行的重要基础,主要包括列控工程数据表和接口数据表[1-2]。列控工程数据表描述线路的静态信息,包括信号数据表、线路速度表、线路坡度表等;接口数据表描述设备间的关联信息,包括设备归属关系表、地面设备信息表、TCC—联锁接口表、TCC—TSRS 接口表等。列控数据种类多,信息量大,通常需要花费大量的动态交付测试进行验证,尤其是在最初的几轮测试中,会出现较多易识别的同类错误。为提高测试效率,针对各产品开发了专用的数据验证工具。但实际使用中,又出现因列控工程数据表、接口数据表的格式变更以及产品数据结构变更导致的工具不适用。开发人员日常消耗大量时间分析工具的不适用原因,并进行适配开发。
针对列控数据验证过程中的多变性问题,本文将规则引擎应用到列控数据验证中,将验证的处理方法转化为测试人员可读易懂的处理规则,实现验证逻辑与代码分离,为验证开发提供一种快速且高效的方法。
2 规则引擎定义
规则引擎又叫做基于规则的专家系统,属于人工智能的一类。规则引擎[3]将规则与特定的应用解耦,通过一种抽象描述将业务规则作为一种配置项进行存储,然后由外部的输入进行驱动计算,进而得出结论[4]。
典型的规则引擎通常由3 部分组成:规则库、外部输入和执行引擎。规则库[5-7]用于存放基于经验或者业务逻辑而事先实现的业务规则配置项,即本文中的数据验证规则;外部输入为待解决的问题集合,即本文中的列控产品配置数据和列控数据表;执行引擎决定要将哪些规则应用于这些待解决的问题中,并计算规则执行的顺序。规则引擎的一般执行流程为接收外部输入,计算待执行的规则列表,执行规则,最终得出结论。规则引擎的基本结构如图1 所示。
3 列控数据验证规则应用分析
3.1 列控数据验证规则分析
TCC、TSRS、RBC 等产品的列控数据以C 语言的结构体数组或序列化数据进行存储,作为标准的列控工程数据表和接口数据表以excel 文件进行存储。验证过程首先对待验证的结构体数组和作为标准的数据表进行解析;通常结构体数据间具有较强的关联性,需要进行加工融合后获得完整信息;融合过程中同时进行结构体数据间的合理性检查;最后进行结构体数据和数据表的一致性比较。验证过程如图2 所示。
图1 规则引擎的基本结构Fig.1 Basic structure of rule engine
通过对验证规则的需求分析,可将验证规则归纳为两类模型:第一类是运算类,对TCC、TSRS、RBC 等产品的列控数据,按一定的方法对待验证原始参数进行解析、计算和初验,得出新的中间变量;第二类是比较类,将运算类得出的中间变量或解析结果与列控工程数据表和接口数据表进行比较,给出判断结论。
3.2 规则文件定义
目前普遍使用的开源规则引擎Drools 通过XML、DRL 语言设置规则逻辑,检查包括大于、等于、小于,包含、不包含,相交、重叠、相离等类似的关系检查,这些关系检查已在大量编程语言中实现,重新定义一套新的语法和关键字,并没有比直接采用一门编程语言难度低。因此,本文采用python 语言作为规则的描述语言,具体内容如下所示。
规定一个规则文件包含如下信息:
1)#Name 行,规则名称,名称能够直观描述规则的基本功能;
2)#Description 行,规则描述,具体描述规则的内容,包括输入、输出、匹配条件、业务规则等;
3)#Author 行,规则的创建者;
4)#Version 行,规则版本,例如V1.0.0;
5)#Date 行,规则创建日期;
6)rule_run 方法,规则的执行入口,入参为_params_in 数组,可输入多组输入数据,单组输入数据建议采用Json 格式编写,出参为_params_out 数组,同样建议采用Json 格式编写。
4 规则引擎设计与应用
4.1 执行引擎算法
规则引擎的核心处理过程主要包括待执行规则队列生成和规则执行两部分[8]。
规则队列生成算法负责根据外部输入,确定第一级待执行的规则,然后根据规则间的依赖关系进行推导,生成一个有向无环的规则图的过程。有向无环的规则图如图3 所示。
图3 规则链的有向无环图Fig.3 Directed acyclic graph of regular chains
生成有向无环的规则图时,需要对是否存在循环依赖关系进行检查。若存在,则说明规则编写有误。该过程涉及到两个核心数据结构,规则节点和规则集。规则节点包含规则名称、所属规则集、规则依赖深度、前置节点列表属性。规则集采用以规则名称为键值的规则节点哈希表。
规则执行部分,采用若干消息队列(包括待执行队列、已执行队列、忽略队列、错误队列等)来存储执行过程中的规则。每周期轮询待执行队列中规则,若规则满足执行条件,即该规则的所有前置规则均已正常执行完毕,则触发该规则的执行;若一个规则执行失败,则将其压入错误队列;若一个规则执行成功,则将其压入已执行队列。当一个规则所有前置规则均处于错误队列中时,则将该规则压入忽略队列,不再执行。当待执行队列为空时,全部规则执行结束,可以得到最终结果。
上述算法的实现过程如下所示。
Step1:初始化规则集合R={r1,r2, …,r3},外部输入I={i1,i2,…,in},中间数据集合D={},待执行规则集合ToRun={},已执行规则集合Finished={},错误规则集合Failed={},忽略规则集合Ignore={};
Step2:使用R中各个规则的入参与I和D中元素进行匹配,匹配成功的加入ToRun,同时将该规则的输出加入到D中;
Step3:每当D有新数据加入时,重新执行Step2,直到D不再有新的数据,此时完成全部待执行规则的查找;
Step4:根据ToRun 中规则的依赖关系,基于图论理论,生成有向无环图,对规则链进行检查;
Step5:遍历ToRun 中的规则。当规则入参与I匹配时,执行该规则。执行成功,将该规则移入Finished。执行失败,将该规则移入Failed。若该规则有前置规则在Failed 或Ignore 中,则将该规则移入Ignore 中,将规则的执行输出存入D中;
Step6:重复Step5,直到ToRun 为空,结束此次规则执行。
4.2 规则引擎实现
采用python 构建规则引擎,并编写规则代码,实现基于规则引擎的列控产品配置数据验证过程。整个系统实现的架构如图4 所示。
图4 列控产品配置数据验证系统架构Fig.4 Architecture of the verification system of train control product configuration data
TSRS 产品的数据验证需求包括“地面设备信息验证”、“信号机和应答器配置验证”、“TCC 临时限速管辖范围验证”、“RBC 临时限速管辖范围验证”、“侧线区配置验证”、“短链配置验证”等若干项,本文以验证地面设备信息数据为例说明验证系统的执行流程,如图5 所示。
图5 TSRS验证系统规则链示意Fig.5 Diagram of rule chain for TSRS verification system
1) 用户使用文本编辑器编制规则,然后通过用户界面将其导入数据库中。
2) 规则引擎从数据库中读取规则,生成规则的有向无环图。
3) 规则引擎将待检查数据文件载入数据内存;TSRS 配置数据示例如图6 所示,车站设备信息表内容示例如表1 所示。
4) 触发基本规则进行检查,本示例中的根节点有规则1,为适用于TSRS 变量的计算规则节点,如表2 所示;规则2 为适用于地面设备信息表的计算规则节点,如表3 所示。
图6 TSRS配置数据示例Fig.6 Example of TSRS configuration data
表1 车站设备信息表内容示例Tab. 1 Example of the contents of station equipment information table
表2 TSRS变量的计算规则Tab. 2 Rules for the calculation of TSRS variables
规则3 的前置节点为规则1 和规则2,两个规则全部匹配后,触发规则3 执行。规则3 为比较类节点,输出验证结果,如表4 所示。
5)生成检查结果返回界面,检查结束。
表3 地面设备信息表的计算规则Tab. 3 Rules for the calculation of ground equipment information table
表4 地面设备信息比较规则Tab.4 Rules for comparison of ground equipment information
最终通过Web Server 实现的基于规则引擎的列控产品配置数据验证系统界面示意,如图7 所示。
图7 列控产品配置数据验证系统界面Fig.7 Interface of the verification system of train control product configuration data
5 结束语
基于规则引擎的列控产品配置数据验证方法,能够适应列控数据表和被验证文件不断变化的需求,能够适应验证方法不断更新变化的需求,通过将验证方法与程序代码解耦,解决软件变更困难和变更周期长的问题。本文定义了基于规则的实现方法,便于规则的增加与修改,可以适用于频繁的变化要求,优化列控配置数据验证效率。该方法已应用到TSRS 数据验证系统,系统具有良好的重用性,应用程序生命周期长。后续将继续致力于规则的完善、简化和开放,以更快速和便捷的方式,满足日益增长的变化需求。