谭冠华,徐田华,王海峰,张 路,吕继东
(1. 北京交通大学轨道交通控制与安全国家重点实验室,北京 100044;2. 北京交通大学轨道交通运行控制系统国家工程研究中心,北京 100044)
列控工程数据[1](以下简称列控数据)是列车移动授权、轨道电路编码化、应答器报文编制等功能的基础数据,是列车运行控制系统各功能实现的底层数据,保证其正确性是列车运行控制系统安全运行的根本保障。为保证列车运行控制系统安全运行,需要对列控数据进行正确性验证。
传统数据验证方式是人工校验。人工校验存在如下缺点:一是数据类型多、数量大,任务周期短,校验工作难度大;二是环境优化、勘测误差修正、线路修改等都需要对数据进行修改,整个线路生产周期存在频繁变更,人工校验任务繁重;三是人工审核存在人为因素带来的审核失误、遗漏问题。可见,探索一种高可靠、高准确性的验证方法,对于列车运行控制系统具有重要的现实意义。
列控数据验证存在3个方面的问题:一是列控数据的处理方法,根据铁总运〔2014〕246号文件[2]规定,包含数据表格16个,数据属性繁多,单表数据之间以及多表数据之间存在关联关系,期望建立数据的标准化格式,合理处理数据关系。二是列控数据的规则提取,铁路技术标准、规范是以文本语言进行描述,在文义理解上易存在差异,也没有明确指出数据间的关联关系,仅能检查工程数据的格式、类型等错误,对虚假数据巧合、数据间逻辑关联关系方面,存在安全隐患,数据验证的充分性和完备性不足。如何发现数据之间的隐含关系,提取出充分、完备的验证规则,是数据验证的难点之一。三是对于数据规则进行验证模型构建,实现快速、高效、正确的自动化验证。
对于轨道交通领域,已有部分学者探索了一些数据验证方法。文献[3]把需要验证的铁路系统数据利用B-language 把数据需求进行形式化建模,并利用OVADO 对模型进行测试;文献[4]利用Atelier B 对铁路数据进行验证;文献[5]通过对联锁数据建立各类形式化模型进行数据验证。上述验证方法的核心是B-Method,其理论基础是数据集合和数据映射,在数据表示和数据处理上能力较弱,因此对于大数据集,其验证过程中易存在状态爆炸问题。文献[6]提出了基于XML的XSLT,对列车运行控制系统数据进行验证,其验证方法是建立标准、规范化的数据约束,验证数据是否满足这些约束条件。文献[7]提出了基于规则的数据验证方法,但其验证规则主要是数值验证规则,对于大量的文本数据无法进行验证。
针对列控数据存储结构,本文提出基于XML的数据标准化格式。该存储结构,可蕴含数据之间的关联关系,易于数据交互。多表文件到单一文件的统一,易于实现数据修改,解决列控数据频繁变更问题。针对列控数据验证,本文提出一种基于Prolog的列控数据验证方法。Prolog是一种主要运用于自然语言、人工智能等领域[8]的逻辑编程语言,建立在逻辑学基础上,具有高效的自然语言描述方式,可以简洁方便地描述验证规则。其强大的递归能力和关系数据库原理上的推理机制,提高了数据验证的效率。同时,Prolog也是一种形式化表达,具有严谨的表示方式,可确保数据验证的准确性。本文综合考虑数据验证各类问题,对武广线的工程数据进行验证结果分析。
列控工程数据是列车运行控制系统各设备的参数化实现的数据依据,主要包括:车站信息表、线路坡度表、线路里程断链明细表、道岔信息表等。图1是列控工程数据表结构。
图1 列控工程数据表结构
列控数据以表格形式存储,各表定义了不同的数据属性。例如:线路坡度表包含线别、坡度、长度、终点里程;正线信号数据表包含列车正向运行和反向运行的区间,站内正线部分的信号点与轨道区段信息。图2给出正线信号数据表表格样式。
图2 正线信号数据表
XML[9]是一种可扩展标记语言,其设计宗旨是用于存储与传输数据,可以根据自身需求定义各种数据类型,表示各类源数据。
XML与SQLServer、DB2等数据库在应用和功能上不同,数据库是一种数据存储和管理的工具,通过sql语句实现数据库的增删改查等功能,而XML主要用于存储自定义的数据,易于被各种编程语言开发的应用程序快速读写,通常作为应用程序的配置文件。XML与其他数据表现形式相比,具有以下优势:
(1)自定义标记,具有极大的可扩展性;
(2)定义数据结构层次;
(3)筛选希望获取的那部分数据;
(4)国际化语言,实现真正的数据交互。
除上述优势外,XML相对于其他存储格式,还有与之相关的两种约束技术——DTD和Schema,它们可以预先定义XML文档的数据结构和属性约束,保证XML文件填写的正确性。
工程数据表是以表格形式对数据进行存储,表与表之间不是独立存在的,而是整体表述一段完整的线路信息。该储存方式存在缺点如下:
(1)表格多,不同应用所需数据不同,数据交互后,可能丢失数据;
(2)数据之间存在属性关联,数据变更影响多个数据,不利于数据修改;
(3)表格单独表示,不能体现表间关系和属性关系。
对于列控系统数据,统一标准的数据描述方式是许多学者的研究重点。当建立统一标准的数据描述方式后,列控系统各设备之间不再需要转换接口函数,可以提高工程效率。对于不同铁路部门和设备生产产家,可以实现数据共享,软件互通,扩大数据交流。Railml[10]就是一种欧洲提出的统一的铁路应用系统数据存储格式,随着铁路系统各大公司和研究机构的不断加入,Railml讨论会议的不断召开,Railml也开始得到了完善和使用。
针对列控工程数据表,本文提出基于XML的数据存储标准化格式。通过XML数据存储结构,可以把所有工程数据表统一在一个文件进行表述,可以避免数据的重复表示,消除数据冗余,也可防止表格丢失,保障数据完备性,同时XML文件是可自定义的结构化文件,表示表格之间、数据之间以及表格与数据间的包含关系和关联关系。
通过对Railml和文献[11]的研究,结合列控工程数据表的数据结构分析,列控数据的XML结构如图3所示。图3表示的是数据层次结构,每个结构还包含内部细致结构和具体属性表示,本文不做具体说明,图4是轨道分段拓扑结构XML数据示例。
图3 列控数据结构
图4 轨道分段拓扑结构XML
图5为列控数据验证流程,首先实现列控工程数据表到XML列控标准数据的转换;根据原始数据与XML数据定义,结合数据规范、领域知识以及数据挖掘技术提取验证规则;利用Prolog语言将数据描述为事实,规则描述为知识,建立验证模型,最后利用XSB工具对事实进行验证,根据数据错误文档修正数据。
图5 列控数据验证流程
列控数据验证的基础是数据的内容和特点,其目的是提高数据的正确性,其验证目标就是数据包含的各类规则。规则来源分为三类:一是铁总运下达的各类文件,例如《列控数据管理暂行办法》[2]、《CTCS-2级列控系统应答器应用原则》[12]等;二是领域专业知识,铁路信号基础、车站信号控制等;三是通过数据挖掘方式,发现数据隐含规则。
根据图3可知,列控数据包含各类数据对象,不同数据对象还包含大量数据属性。每个数据对象在真实世界有其物理意义,各项数据属性也必须满足其值域规则,即格式需求与取值需求。
(1)数据类型
不同数据属性,代表实际含义不同,数据类型也存在差异性,列控数据主要包含的数据类型有:整型、浮点型、字符串、布尔类型、枚举类型。
(2)格式需求
列控数据是列控基础数据,应用于各类设备配置数据、软件开发等。为满足数据通用性,其数据格式具有严格的要求。例如:各项设备名称基本都有其命名规范;公里标格式‘K×××+×××’;数值根据方向分奇数与偶数。
(3)值精度
值精度狭义上是考虑浮点型数据的小数位数,但其广义上还包括数据单位,数据值必须与其单位匹配。例如坡度单位‰;公里标单位m;速度单位km/h。
(4)值范围
值范围即数据的取值范围,由数据类型与数据的物理意义确定。例如速度非负,并有其最大值;布尔取值只能0和1;对于连续性数据,根据箱型图分析方法确定上界与下界。
表1从总体上简单概括值域规则具体内容。
表1 值域规则
值域规则是对数据自身要求,满足的是格式与值域。逻辑规则是表述各表各属性间的逻辑关系。下文对部分数据进行定义形式并表述蕴含逻辑规则。
定义1轨道分段数据定义为
定义2线路断链数据定义为
规则1断链长度由断链起点里程和终点里程确定。即
Dlength= |Dend-Dbegin|
(1)
规则2轨道分段长度由其起点、终点里程以及是否包含断链决定。
当∀Dk∈D,Dk∉Ti
Tlength,i= |Tend,i-Tbegin,i|
(2)
当∀Dk∈D,Dk∈Ti
Tlength,i= |Tend,i-Tbegin,i|±Dlength,k
(3)
式中:D为断链集合;Dk为D的一个元素。
定义3坡度数据定义为
图6 坡度映射图
规则3坡度长度与坡度点公里标一一对应,断链表示未给出,即
Slength,1=Slocation,1-Tbegin,id
(4)
Slength,i=Slocation,i-Slocation,i-1i≥2
(5)
规则4线路的坡度分段描述了各个轨道分段的坡度信息,所属轨道分段相同的坡度的长度之和等于轨道区段长度。即
(6)
定义4信号机数据定义
规则5信号机位置必然有绝缘节,则信号机位置也是轨道分段分界点,即
SIlocation=Tbegin,id∨SIlocation=Tend,id
(7)
定义5应答器信息分组存储,数据定义为
规则6应答器组内间距标准为5 m,即
Blocation,i-Blocation,i-1=5
(8)
规则7根据应答器布置规范,不同类型的应答器,与信号机之间的安装距离为固定集合,用集合M表示,即
|Blocation,i-Slocation,i|∈M
(9)
定义6轨道分段连接关系定义为
规则8存在连接关系,则轨道分段不是同一段,且连接点公里标相同,即
当∃
id1≠id2∧Tbegin,id1=Tend,id2
(10)
定义7轨道区段定义
规则9轨道区段因可能包含道岔,所以其可能包含多个轨道分段,各个分段之间必然存在连接关系,即
∃LTi,LTi+1∈LTid⟹∃
(11)
在列控数据规则提取过程中,值域规则和逻辑规则都是侧重数据属性的约束关系,这些约束关系的来源是数据规范和领域专家知识。本文期望扩展规则来源,能在铁路线路大量的数据中,发现数据与数据之间的隐含关系。针对上述问题,本文选取数据挖掘的方式提取数据中隐含的关联规则。
数据挖掘[13]是以大量数据为基础,通过各种数据处理办法发现可用规律的技术。根据列控数据的实际情况分析,本文的数据挖掘方式采用的是关联分析。关联分析是数据挖掘的主要研究方法之一,期望从列控数据中发现它们之间的相关性,而这些相关性并没有在列控数据中直接体现。
常用的关联规则算法有Apriori算法、FP-Growth算法、灰色关联分析法。由于列控数据与大数据相比较,其数据量相对较少,因此本文采用的是Apriori算法。Apriori算法的核心思想是通过逐层的迭代,找到数据中最大的频繁项集,再根据最小支持度与最小置信度,从频繁项集中找到满足要求的强关联规则。下文对Apriori算法进行基本简介。
项集是事务中项的集合,如果项集中存在I个项,则成为I项集,如果I项集的支持度大于或等于设定的最小支持度,则称I项集为I频繁项集。其中最小支持度是用于表示事务频繁出现的一个阈值,大于该阈值的项集才具有统计意义。强关联规则是从频繁项集中找到的大于或等于最小置信度的关联规则,其中最小置信度是强关联规则发生的最低可靠性。
支持度:项集X、Y在所有事务中同时发生的概率。
支持度(X⟹Y)=P(XY)
置信度:项集X发生后,项集Y也发生的概率。
置信度(X⟹Y)=P(Y|X)
Apriori算法的实现分为两个步骤。
步骤1先找到所有的1-频繁项集,再通过逐层迭代,依次找到所有的2-频繁项集、3-频繁项集,直至找到最大的I-频繁项集为止。
步骤2由频繁项集生成关联规则。关联规则表述为X⟹Y,X称为前件,Y称为后件。该过程依次生成所有1-后件(后件只有一项)强关联规则,然后生成2-后件关联规则,以此类推生成所有强关联规则。
本文以武广线正线信号数据表的上行正向数据为例,描述关联规则挖掘过程。第一步是确认数据对象并获取数据,表2为部分正线信号数据样例。
表2 武广线正线信号数据
数据获取是数据挖掘第一步,第二步是数据预处理,该步骤需要完成数据清理、属性规约和属性变换。数据清理的作用是清除数据中的无效数据和错误数据。本文的数据来源是广铁集团,表格数据基本正确,清理过程通过值域规则进行审查。通过对表2进行属性规约,删除不相关属性:序号、车站名、信号点里程。表3为属性规约数据。
由表3数据可知,属性中的信号点名称和轨道区段名称为文本数据,命名上差异较大,而长度为数值数据,离散度较大,都需要通过属性变换,构造相关属性。信号点名称用信号机类型与方向集成为新属性A,其中A1表示上行进站信号机、A2表示上行出站信号机、A3表示上行通过信号机、A4表示上行进路信号机、A5~A8为上述对应的下行信号机、A9表示空、A10表示分割点。轨道区段名称根据其属于区间还是站内划分,分别用D1、D2表示。长度属性为离散化数值,采用分段的划分方式,例如F1取值[0,199]、F2取值[200,399]。其他属性为枚举类型,不需要特殊区分,表4为属性变换后的数据。
表3 属性规约数据
表4 属性变换数据
通过数据获取、数据预处理,将最小支持度设为8%,最小置信度设为95%,通过Apriori算法处理所有武广线上行正向数据后,挖掘出438条强关联规则。因强关联规则仅表示满足支持度和置信度要求,还需要分析规则有效性以及审核是否符合实际意义,同时需要通过多条线路关联规则对比后提取有效规则。表5是部分关联规则示例。
表5 关联规则
为了实现自动检查列控数据的正确性,需要对数据进行规则的一致性表示。本文使用Prolog逻辑语言建立逻辑编程框架,即验证模型。验证模型的目的就是搜索违反规则一致性的数据反例。Prolog建立的验证模型是基于一阶谓词的形式化表述,本文主要包含以下三类谓词:
(1)表述输入数据文件事实的谓词,即将列控数据转换为Prolog可识别的逻辑定义;
(2)表述数据规则的谓词,即值域规则、逻辑规则、关联规则;
(3)表述搜索数据反例的谓词,即搜索错误数据。
Prolog语言程序结构有三类,分别是事实、规则和询问[14]。
事实是对事务定义的客观存在,具有恒为真的含义。事实中的关系称为谓词。例如Line(1-5DG,900),该事实描述轨道区段名称为1-5DG,长度为900,谓词是Line。
规则是事实自身或事实与事实之间可满足的基本关系,是逻辑判断的主要依据。规则由规则头和规则体组成,其中用符号“:—”连接,用”.”结束。规则的一般描述形式如下:
p:—p1,p2,p3,…,pn.
p1,…,pn均为命题,符号”,”表示合取(∧并且)的意思。规则的语义是:如果“p1∧p2∧…∧pn”为真,则p为真。
Prolog系统是一种数据库或知识库系统,事实和规则就是库里面的知识,通过询问的方式,向系统询问一些问题,就是系统求解的目标。对于本文而言,事实表示存在哪些列控数据,规则表示数据应符合的验证规则,询问就是遍历数据是否满足所有规则,并寻找反例。
给定一个完整的XML格式的列控数据文件,需要根据其中的XML元素定义成可识别的数据事实,下文对部分列控数据进行事实表示。
轨道分段及其连接、坡度、信号机、应答器、桥梁等事实表示如下:
t_section(Tid,Tbegin,Tend,Tlength,Tdir).
connection(Tid1,type1,Tid2,type2).
slope(Tid,Slength,Slocation,Svalue).
signal(SIid,SIname,SItype,SIlocation,sIpointType,SIJYJType).
balise(Bid,Bname,Blocation,Bfunction,Bstation).
baliseGroup(ArrayBid).
bridge(BRname,BRdir,BRloc_start,BRloc_end,BRlength).
line(Lid,Lname,Lfrequent,LTid).
belong(Tid,SIid|Bid)。
上述谓词包含数据主要参数,部分参数未给出。其中谓词baliseGroup描述应答器组关系;ArrayBid是应答器编号数组;belong谓词用于描述两个对象间从属关系,其中参数是对象编号,不仅可表示轨道分段与信号机从属关系,整个XML文件层次结构从属关系,都可用该谓词表示,其余谓词可参见本文3.2节。
值域规则中,部分数据的值范围具有明确规则,该部分数据值域可用枚举的形式来表示所有取值范围。例如线路方向只有上行、下行,绝缘节只分为电气绝缘节、机械绝缘节,相关事实表示如下:
dir([up,down]).
frequent([2 600-1,2 600-2,2 000-1,2 000-2]).
jyj_type([electrical, mechanical]).
balise_type([active,passive]).
数据事实是根据列控数据的实际情况,定义了相应的格式后,将列控数据转化为对应的事实表示。通过将上述的各类规则转换为Prolog的逻辑规则,构建数据验证的规则模型,规则模型搭建的越完整,验证准确性越高。规则模型主要分为以下4个子模型。
4.3.1 值域规则子模型
值域规则子模型是对列控数据各对象值域规则的集成,是对数据格式和取值的约束。
对于数据类型,Prolog有内部定义的类型谓词,例如integer(A),string(A),real(A)。其余严格的数据格式约束,需要自定义相关规则谓词。
信号机事实中包含信号机类型,也包含其位置绝缘节类型,验证这些类型是否在值域范围的规则表示如下:
rule_1(A):—signal(A,B,C,D,E,F)∧
signal_type(type1)∧insulation_joint(type2)∧
member(C,type1)∧member(C,type2).
根据信号机事实表示可知,C、F分别是编号为A的信号机的类型和位置绝缘节类型;member(C,type)是确认C是否是集合type的一个元素。
应答器名称在应答器相关规范中有严格要求,其名称的首字母必须为“B”,规则表示如下:
rule_2(A):—balise(A,B,C,D,E)∧name(B,X)∧X=[X1|_]∧X1=66.
根据应答器事实表示可知,B表示应答器名称,name(B,X)是内部谓词,实现字符串转换对应ASCⅡ码数组,66是字符‘B’的ASCⅡ码。
4.3.2 逻辑规则子模型
根据规则1可知,断链的长度由起点里程和终点里程决定,即长度等于起点里程与终点里程之差,验证规则表示如下:
rule_3(A):—chain(A,B,C,D,E,F)∧D=|B-C|.
根据规则2可知轨道分段的长度不仅与起点里程、终点里程相关,还需要检测是否存在断链。该规则需要定义以下多条规则构建其完整性。
rule_containChain(A,Length,type):—t_section(A,B,C,D,E)∧chain(X,Y,Z,Length,type,U)∧E=U∧((B rule_t_sectionLength(A):—t_section(A,B,C,D,E)∧rule_containChain(A,L,T)∧((D=|C-B|-L∧T=‘S’)∨(D=|C-B|+L∧T=‘L’)). rule_ t_sectionLength (A):— t_section(A,B,C,D,E)∧D=|B-C|. 其中谓词rule_containChain表示编号为A的轨道分段是否包含断链,并取得断链长度和类型。rule_ T_sectionLength有两条,分别存在断链和不存在断链,谓词名称相同,两条规则是或逻辑关系。 根据规则6可知,应答器组内应答器布置位置相差5 m,其验证规则表示如下: rule_distanceBalise(A):—baliseGroup(A)∧length(A)>1∧∃Ai,Ai+1∈A∧balise(Ai,B1,C1,D1,E1)∧balise(Ai+1,B1,C1,D1,E1)∧|C1-C2|=5. 信号机和应答器与轨道分段有映射关系,即信号机的位置与轨道分段的起点或终点对应,应答器位置在所属轨道分段范围内,验证规则表示如下: rule_signal To t_section(A):—signal(A,B,C,D,E,F)∧t_section(a,b,c,d,e)∧belong(a,A)∧(D=b∨D=c). between(D,X,Y):—D≤max(X,Y)∧D≥min(X,Y). rule_balise To t_section(A):—balise(A,B,C,D,E)∧t_section(a,X,Y,d,e)∧belong(a,A)∧between(D,X,Y). 4.3.3 关联规则子模型 根据数据挖掘关联规则的方法,提取出了大量关联规则,根据关联规则建立关联规则子模型。 对于关联规则“C1—>D1”,其实际意义是对于每条线路数据,信号点绝缘节类型是电气绝缘节,所属轨道区段分类是区间,表示如下: rule_C1—>D1(A):—signal(A,B,C,D,E,F)∧belong(a,A)∧t_section(a,b,c,d,e)∧(F=‘ electrical’—>isRegion(a)). 其中electrical表示电气绝缘节,谓词isRegion判断T_section(A)是否是区间轨道。 对于关联规则“D1、B7->A10”,其实际意义表示区间轨道对应信号点类型没有信号机,则信号点名称属于合成新属性A6,表示如下: rule_D1B7->A10:—(isRegion(a)∧belong(a,A)∧signal(A,B,C,D,E,F))->(newAttribute(A,New),New=‘A6’). 其中谓词newAttribute为确定信号点名称新属性类型。 4.3.4 错误输出子模型 上述3个子模型的目的是验证数据事实是否满足数据规则,其回答是yes或no,不能提示数据错误位置。错误输出子模型就是对违反规则输出错误信息,主要分为错误信息存入Prolog知识库,以及输出错误到错误信息TXT文件。 断链信息中长度与起点里程和终点里程不匹配,则存储对应错误信息,表示如下: error_Meg1(A):—not rule_3(A) ->assert(error(message)). 其中,assert谓词是内部谓词,逻辑判断过程中添加新的事实,assert(error(message))就是将验证过程中出现的错误信息以事实的方式进行存储。 在验证过程完成后,为便于直观地查看验证不通过的信息,方便修改错误数据,可将上述的error事实输出,错误信息输出模块表示如下: save(FileName):—telling(Old), tell(FileName), listing(error), told, tell(Old). 为了验证本文提出列控数据验证方法的高效性和准确性,利用武广客专正线列控数据进行实验分析。线路跨度里程达1 000 km,数据记录条数近9 000条。本文从中选取三段线路长度不同的数据作为验证样本,分别为武汉—咸宁、赤壁—长沙、株洲—广州。表6~表8是根据上述建立验证模型得到的验证结果。 表6 值域子模型验证结果 表7 逻辑子模型验证结果 表8 关联子模型验证结果 根据表6~表8可以看出,随着数据事实数量的增加,运行时间也在增加,但3个子模型运行总时间不超过20 s,三段铁路线跨度已达950 km,相比较人工验证按天数来计算验证时间,该方法对于列控数据验证具有明显的高效性。 验证方法最重要的评价指标是验证率,即能验证出错误数据的比例。针对本文验证方法,数据错误添加的方式是:先确保已有列控数据的正确性,再由非验证模型设计人员修改数据,并记录修改内容,以便于核实验证效果。根据验证结果可知,3个子模型单独验证列控数据的验证率都不高,但是,针对3个模型验证结果进行统计,三段线路的整体模型验证率可达92%、94%、92.6%,均超过了90%,可见该验证方法对于列控数据验证具有较高的准确性。 表9给出了本文方法与文献[2-5]中的数据验证方法性能,列控数据验证方法不同,在规则单元以及数据单元定义会有差异,例如DTVT的数据单元是单元格,Prolog是数据分类的一行,所以数量级上不好比较,但可以发现本文方法在运行时间上有明显优势,验证率上稍有缺陷。 表9 列控数据验证方法性能 通过对遗漏的数据错误进行分析,发现未检测的原因主要在于以下三点:(1)数据属于孤立信息或者约束较少,例如RBC的号码92570107被修改成91111111;(2)名称信息完全属于自然语言,只有基本规范,没有明确限制,例如D1改成D111;(3)连续性数据只能约束异常数据,如坡度取值1.5‰被修改为1.4‰无法验证。通过原因分析发现,不能检测错误数据的原因不在于方法;导致以上类型数据无法进行验证的根本原因在于列控数据定义的自身缺陷,缺少相关数据约束,所以本文提出的数据验证方法具有可行性。 本文针对列控数据校核任务困难的问题,提出了基于Prolog的列控数据验证方法。针对列控数据表格的多样性、独立性,期望建立基于XML的新型数据存储格式。通过铁路总公司数据规范、领域专家知识和数据挖掘三种方式,提取出数据验证规则,用于验证模型搭建,保障了验证模型的完整性,提高了验证模型的验证准确性。以武汉—广州线的列控工程数据为数据样本,通过验证测试与分析,说明了本文提出的列控数据验证方法具有高效性和准确性。5 实验分析
6 结束语