APP下载

铁路计算机联锁软件制作专家系统的研究

2019-10-31

铁道标准设计 2019年11期
关键词:二叉树站场对象

张 杰

(中国铁道科学研究院集团有限公司通信信号研究所,北京 100081)

目前,国内大部分计算机联锁软件应用层的设计,采用程序和数据分离的思想[1]。其中,程序实现了模块化、定型化,而数据根据不同的站场进行配置,这种方法实际上继承了传统6502电气集中的设计思想[2]。

为了实现程序代码的批量生产,各研制单位分别开发了计算机辅助设计软件(CAD),它依据平面图,选取信号机、道岔、轨道区段等对象模块,画出站场图形,根据站场图形对象的上、下、左、右几何关系,初步生成对象的链接数据,软件人员根据联锁表、驱动采集表、蓝图等设计文件,结合整体、局部的站场特征,设置各对象的属性,填写特殊的联锁条件,补充零散的代码,最后,再由CAD软件整合这些数据,生成待编译的联锁软件。在此过程中,软件关键的数据[3],如超限、信号显示关系、带动防护、场联、站联等接口,以及特殊电路要求的特殊代码,都必须由软件人员通过缜密的思考,然后逐条、逐项地输入。此过程容易出现笔误,遗漏,甚至逻辑错误;况且,软件人员技术水平参差不齐,可能会造成软件质量不高[4],实现方式不统一的情况。而经验丰富的专家,已积累了大量、可靠、经过实践检验的知识,并能遵循 “故障导向安全”原则进行设计[5],因此,整合联锁软件专家的经验,设计专家系统[6],使联锁数据实现自动生成,进一步提高生产的智能化,便成为计算机联锁软件编制的实际需求。

1 输入信息的标准化

联锁数据的编制,初始阶段有两步,一是读图,编写需求,然后才是软件人员编写代码。在前一个阶段,结合设计人员,根据设计院提供的设计蓝图,把本车站的需求,以文件形式列出,软件人员拿到需求,和设计蓝图进行核对,一方面为了核实用户需求,另一方面,为了获取软件需要的详细信息。

开发一个实现联锁数据编制的专家系统,首先要解决的就是设计蓝图信息的输入问题。

考虑到Excel简单、实用,并且功能十分强大[7],结合设计人员完全可以将“用户需求”改为Excel格式,和专家系统用同一个文件,这样,“用户需求”从开始制作,到专家系统的读取,试验阶段的核对,都采用同一份Excel文件,可以保证需求文件的一致性,因此,本文优先推荐采用Excel格式文件。

联锁是严密的逻辑关系,在蓝图上往往以拓扑图(如信号显示关系、信号点灯电路)或表格形式(如联锁表)来表示[8],要将它们表示在Excel上,可利用Excel的表单控件,如表1所示。

表1 信号关系标准化示例

表1中,本架信号机与后架信号机之间的显示关系用对应的单元格数值关系来表示。其中,用了大量的表单控件,只用打钩即可。类似的一些特殊电路,如点灯电路、自闭电路、场联电路、半自动电路、各种报警信息、防护及带动、推峰溜放、接近锁闭、机务段联系等[9],都可以建立相应Excel表。结合设计人员及联锁软件人员打勾或按格式填写,形成统一、标准格式的数据。

2 联锁软件制作专家系统的总体结构

专家系统属于人工智能的课题,其内部含有大量的某领域专业知识和经验[10],它能根据这些知识和经验,进行推理和判断,模拟人类专家,进行决策,解决复杂的问题。

一般专家系统由5个部分组成。

(1)知识库[11]。

(2)综合数据库。

(3)推理机。

(4)解释器。

(5)接口。

结合计算机联锁软件的制作,其辅助设计专家系统的结构如图1所示。

图1 联锁软件制作专家系统总体框图

用户界面模块实现软件人员向推理机输入各种操作命令,同时,也把流程控制及推理的解释信息反馈给用户。数据处理模块实现推理机和外部数据、用户信息及推理输出数据的转换。推理用的事实、实例,需要从Excel格式的需求文件、Txt格式的IO表、电子版的联锁表及CAD生成的初始对象数据中提取,推理输出的各种联锁对象数据也往往是字符串形式,需要转换后写入对应的联锁对象。因此,数据处理模块完成数据中转、变换功能。推理机可以选用由美国航空航天局开发的CLIPS[12],并采用Mark Tomlinson编制的动态库CLIPS.DLL,以及为该动态库编制的CLIPSWrap 包装类。知识库由经验丰富的联锁软件制作人员和专家系统开发者共同建立,知识库是推理的重要基础[13]。

3 联锁软件制作专家系统知识库的建立

专家系统的知识库用于存储领域的专门知识,包括事实、操作规则等[14]。为了建立知识库,首先要解决知识表示问题。

3.1 知识表示

按照联锁软件制作的一般流程,先形成需求文件、I/O接口码位表,软件人员读这些文件及蓝图资料,利用CAD工具,输入带有逻辑判断的代码及数据。专家系统要模拟人的工作,也需要输入,这里的“输入”就是知识的表示,联锁软件制作专家系统中,采用事实和面向对象的表示方法。例如,数据处理模块利用文本格式的I/O表文件,建立模板:

(deftemplate ioinfo "I/O table "

(slot ioname (type STRING)(default "null"));I/O名

(slot io-lsname (type SYMBOL)(default null));联锁软件中的名字

(slot belong-obj (default null));隶属哪个对象

(slot in_out (type STRING)(allowed-strings "INPUT" "OUTPUT"));类型是输入还是输出

(slot chassis (type INTEGER)(range 1 8));机笼号

(slot slotname (type INTEGER));槽号

(slot seq-number (type INTEGER);板号

(range 1 48))

(slot stano (type INTEGER);站场号

(range 0 2)(default 0)))

基于此模板,把IO表转化为CLIPS事实文件。专家系统利用平面图、CAD形成的各对象的初步数据,转化为面向对象的实例表示,如进站信号类,表示为:

(defclass HOME-SIG;

(is-a ILOCK-SIGNAL)

(role concrete) (pattern-match reactive)

(slot no-drive-zxj;不驱ZXJ

(type SYMBOL)

(create-accessor read-write);

(allowed-symbols true false)(default false))

(slot no-drive-txj;不驱TXJ

(type SYMBOL)

(create-accessor read-write);

(allowed-symbols true false)(default false))

(slot no-drive-luxj;不驱LUXJ

(type SYMBOL)

(create-accessor read-write);

(allowed-symbols true false)(default false)) (slot have-mwhite;有引导显示

(type SYMBOL) (create-accessor read-write)

(allowed-symbols true false null)

(default null))

(slot have-Yellow2;有双黄显示

(type SYMBOL) (create-accessor read-write)

(allowed-symbols true false null)

(default null)))

各对象的特殊属性,即事实及实例的slot值,来源为设计文件及Excel格式的需求文件,利用Excel强大的VBA编程,再由数据处理模块读入,修改实例的slot值。

3.2 推理判定树的建立

CLIPS采用正向推理机制[15],支持产生式规则。产生式规则可用P→Q表示,P表示一组模式(或叫前提条件),Q是要执行的若干动作和结论。联锁关系涉及大量的规则,软件数据的制作就是利用各种规则进行分类判断,如果分类的判定树建立得不好[16],一方面会影响程序执行的效率,另一方面,可能会造成CLIPS产生大量部分匹配,鉴于此,笔者尝试采用ID3( Iterative Dichotomiser)算法[17]。ID3算法由Ross Quinlan提出,它是在判定树每个节点处选取能获得最高信息增益的分支属性进行分裂。

熵在信息论中被用来度量信息量,熵越大,所含的有用信息越多,其不确定性就越大,在决策树中,用熵来表示样本集的不纯度,熵越大,越不确定,表示样本集中的分类越多样。

设S为数量为n的样本集,其分类属性有n个不同取值,用来定义m个不同分类Ci(i=1,2,…,m),则其熵的计算公式为

(1)

设属性A有v个可能取值,即通过将属性A设置为分支属性,能够将样本集S划分为v个子样本集(S1,S2,….Sv),以A为分支属性的信息增益为

(2)

下面举例说明。以特殊的场联口信号机处理为例,其站场特征为进路内方只有一个区段,并且为场联轨。搜集典型的10个车站场联口信号作为样本,如表2所示。

表2 特殊场联样本集

表2中共有10个样本,其中有襄阳北V场D5105、乔司上到发XL21、侨城东车辆段D12B 、坡底下XZ 采用信号链左右换位的作法(其余采用虚按钮作法)。由以上分析可得,最初判定前的熵为

0.970 951

“有并置”分类属性的熵

Entropy(有并置)=

同理,无并置属性的熵为:0.918 296。

因此,设“有并置”的属性为Y,其作为分支属性分裂后的信息增益为

Gain(Y)=Entropy(S)-Entropy(S|Y)=

0.005 803

同理,可以计算出,以“并置敌对”、“列调场联”、“终端按钮并置”的为分支属性的信息增益分别为0.556 78,0.144 485,0.321 929,由此可知,“并置敌对”作为分支属性时,能获得最大信息增益。所以此处选“并置敌对”为根节点进行划分。

继续按照此方法,直至分类完成。

站场特征的识别,是建立规则库的重要基础,而站场特征来自车站网络结构图[18],因此,如何快速、简便地访问网络图的各对象,便成为专家系统研究的另一内容。

3.3 站场遍历的两种算法

笔者曾用VC++实现站场网络的遍历,然后将识别结果发送给CLIPS;后来尝试在CLIPS中,用面向对象的知识表示,实现站场遍历。以下就两种算法进行比较。

3.3.1 用二叉树数据结构实现遍历

树形结构是结点之间有分支[19],并具有层次关系的结构。二叉树是树形结构的一个重要类型,它是n个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的,分别称作这个根的左子树和右子树的二叉树组成,左子树及右子树的根称为根结点的左孩子和右孩子,这是个递归的定义。

图2为简单示例站场,其二叉树模型如图3所示(Ф为虚结点)。

图2 示例部分站场

图3 示例站场的二叉树模型

二叉树的遍历[20],是指沿某条路径周游二叉树,对树中每个结点访问一次且仅访问一次。这里,采用前序遍历算法,若二叉树非空,则依次进行如下操作。

(1)访问根结点。

(2)遍历左子树。

(3)遍历右子树。

算法流程见图4。

图4 示例站场二叉树遍历算法流程

3.3.2 CLIPS中用自定义函数实现遍历

如前所述,本专家系统采用面向对象的知识表示方法,允许为道岔、信号、无岔等编写自定义消息处理函数。由于自定义函数支持多字段变量作为参数,站场遍历的实现变得非常简便。

以下是道岔、信号机的消息函数:

(defmessage-handler ILOCK-SWITCH

bianli( $?r);$?r为多字段变量作参数

(bind $?rinfo (create$ ?r))

(bind ?lastobj (nth$

(length$ $?rinfo) $?rinfo))

;?lastobj变量为消息的最后一个对象

(if (or (eq ?lastobj ?self:normal-link) (eq ?lastobj ?self:reverse-link))

;如果最后的对象是本道岔的定位或反位链

then

(send symbol-to-instance-name ?self:front-link) bianli (create$ ?r ?self:myname))

; 向本道岔的前链发送遍历消息,并且多字段变量$?r增加本道岔的信息

else (if (eq ?lastobj ?self:front-link)

then

;如果是从岔前链来的消息,则给定位及反位链发送遍历消息。

(send (symbol-to-instance-name ?self:normal-link) bianli (create$ ?r ?self:myname))

(send (symbol-to-instance-name ?self:reverse-link) bianli (create$ ?r ?self:myname)))))

(defmessage-handler OTHER-SIG bianli( $?r)

(send (symbol-to-instance-name ?self:right-link) bianli (create$ ?r ?self:myname)))

其逻辑非常简单,就是以多字段变量为参数,从进路的始端开始,按照进路方向及对象的链接关系(前面数据处理模块已建立),各对象分别处理自己的消息函数,把需要的特征内容,添加到传递的多字段变量,然后,把这个消息往前发,直至进路终端,如果满足进路终端的要求,则把多字段变量存储为特征事实。

站场的遍历在特征获取、数据生成方面有着广泛的应用,如存储溜放区敌对信号的识别、全站进路信息的生成、长调车进路特征的计算等等。基于二叉树的遍历算法,在既有的计算机辅助设计软件中已有应用,但要用堆栈操作,联锁对象的逻辑判断也比较复杂,而CLIPS消息函数的方法把遍历功能分解为各个对象的消息处理,原理清晰,逻辑简单,更适合于本专家系统。

4 CLIPS和VC++交互技术

联锁软件制作专家系统和用VC++编写的辅助设计工具CAD互相配合,最终完成联锁软件的生成。因此,涉及到CLIPS和VC++的交互问题[21]。

CLIPS由C语言设计,因此,可以方便地嵌入到VC++。有两种嵌入方式,一种是直接嵌入,一种是加载动态链接库。本系统采用动态链接库,并使用包装类CCLIPSWrap,CCLIPSWrap类符合VC++面向对象的设计风格,更有条理,方便用户使用。

CLIPS和VC++交互技术,实质是两者如何方便地互传数据。

4.1 从VC++到CLIPS

本系统采用4种方法。

(1) 用户定义函数。

例如向CLIPS传字符串,在VC++中,声明CString toclip;编写全局函数:

void* toclips()

{

void *returnValue;

returnValue=g_clips.CLIPSAddSymbol(toclip);

return (returnValue);

}

然后,调用CCLIPSWrap类的AddFunction,

g_clips.AddFunction("toclips",'w',PTIF toclips,"toclips","00"),即可以在CLIPS中调用toclips,方便地得到VC++传来的字符串。

(2)用CLIPSAssert在CLIPS中建立控制事实。

(3)调用函数CLIPSNextFact()或CLIPSNext FactString搜索所有事实,得到所要修改事实的指针factPtr,再用ReadFactSlot读,或用WriteFactSlot写指定的槽值。

(4)调用CCLIPSWrap类的CLIPSDirectPutSlot直接修改实例的槽值。

4.2 从CLIPS到VC++

CLIPS的推理结果或返回的控制事实、实例的槽值,可通过内存缓冲区,方便地传给VC++。

首先,指定路由,由CCLIPSWrap类的SetRoute Buffer(&arrStrFromclip,"tovc")实现,arrStrFromclip是事先的定义字符串数组,tovc叫做逻辑名[22],可以任意指定,CLIPS常常用逻辑名代表文件、输入输出设备、缓冲区等。这样,在CLIPS规则或函数中,就可以用printout函数将结果写到字符串数组中,如(printout tovc "出站信号,请核实!")。

4.3 用文本文件作中介

无论是从VC++到CLIPS,还是从CLIPS到VC++,都可以先产生文本文件,再由对方加载。

例如,本系统在生成信号机、道岔、无岔区段等类的实例时,先由VC++的WriteString函数将实例以字符串形式写入文本文件,再由CCLIPSWrap类的CLIPSLoad函数加载此文本文件,生成对象实例。

从CLIPS写文件也十分方便。比如,要往C盘“cad-data.txt”中写文件,可以由以下规则实现:

( defrule dd2

(not (star-write-cad-irregular))

;如果以只写的方式且已经打开文件

(test (open "C:\cad-data.txt" cad_data1 "w"))

=>

(close cad_data1);关闭该文件

(assert (star-write-cad-irregular))

(open "C:\cad-data.txt" cad_data1 "a")

);以添加方式打开文件

( defrule announce-irregular-info

(ioinfo (ioname ?io-name) (belong-obj irregular))

?n <-(star-write-cad-irregular)

=>

(printout cad_data1 "INPUT:" ?io-name crlf))

Open函数中的 cad_data1是逻辑名,"w"、"a"是文件的存取方式,"w"是只写,"a"是添加。以上两条规则可以实现往C盘“cad-data.txt”以追加方式写,不会覆盖以前的内容。

5 结语

本文首先介绍当前计算机联锁软件制作的过程,指出其中存在的问题,为减少人为判断的失误,提出辅助设计和专家系统相结合,重点论述了知识库的建立,采用面向对象的知识表示,选取典型的工程案例,详细说明了ID3算法在建立判定树的应用,通过ID3计算,可以对分类的判定节点进行优化,提高规则的合法化及程序执行的效率。在站场特征识别方面,重点讨论了两种站场遍历的算法,第一种算法以二叉树数据结构为基础,采用堆栈,实现站场的遍历;第二种方法直接在CLIPS中用消息传递来实现,不需要作数据转换,逻辑明确,算法简单,具有相对的优越性。在文章最后,总结了VC++和CLIPS的交互技术,这些实用的技术使VC++和CLIPS传递信息更为方便。

经实验,联锁软件制作专家系统,可以初步达到设计预期的目标,即模拟专家的经验,在软件制作过程中,有序可控,对联锁关系判断正确,数据不遗漏,减少重复性的工作。需要指出的是,对特殊的站形、特殊的数据,需要由系统开发人员和联锁专家人员共同协作,不断完善知识库,以解决专家系统的学习问题。

猜你喜欢

二叉树站场对象
神秘来电
CSP真题——二叉树
二叉树创建方法
输气站场危险性分析
攻略对象的心思好难猜
一种由层次遍历和其它遍历构造二叉树的新算法
基于熵的快速扫描法的FNEA初始对象的生成方法
区间对象族的可镇定性分析
铁路站场EBS工程量分解
特殊站场引导信号电路设计