1、一种面向对象的实时故障诊断系统的设计陈毓生,赵兴盛,姜海泉(第二炮兵雷达所,北京 102488)摘要:文章从分析传统专家系统入手,把WINDOWS下的可视化技术和面向对象技术引入到人工智能程序设计中来。讨论了故障树模型的面向对象表示方法及其推理算法。根据雷达故障诊断中的典型故障树,给出了一个基于Visual Basic语言的故障诊断专家系统设计实例。关键词:Visual Basic;故障诊断;专家系统;面向对象1 前言传统的专家系统开发一般有两种方法:一种是采用专用的人工智能设计语言,如逻辑处理语言PROLOG和列表语言LISP,可以方便地编写出人工智能的程序;另一种是人工智能的外壳程序,如著
2、名的专家系统MYCIN所开发的专家系统外壳工具DMYCIN,利用它只需要按其格式填入相应的知识库,就可以开发出具有一定水平的专家系统。但是随着计算机软件技术的日益发展,这两种工具都难以满足专家系统的需要,主要问题有:(1)实时性差,两种工具主要是完成逻辑推理过程,不具备数学处理能力,也不进行数学运算,开发的应用程序的局限性大,无法结合数据采集处理程序形成实时的诊断系统;(2)开放性差,在WINDOWS平台上,无法利用其通用性和开放性。Visual Basic(以下简称VB)语言开发人工智能程序有很大的优势。其作为一种面向对象的语言,不仅界面设计方便,可以把主要精力集中于专家系统的核心程序开发上
3、,在短期内迅速开发出具有专业水平的软件。同时VB具有高级的接口函数,适应性好,虽然其低层控制能力比较差,但是它能通过高级API函数实现各种接口功能,也能连接WINDOWS下的动态连接库(DLL),功能大大扩展。另外,VB可与多种数据库连接,它提供的开放式数据库功能,使专家系统中的知识库、事实库等许多数据库的建立与管理都变得容易。2 面向对象的故障树模型2.1 故障树模型的面向对象表示故障树分析就是当系统运行在某种不期望状态时,对系统进行分析,利用故障树提供的数据、信息,找到所有可能使不期望状态发生的途径。不期望事件或故障事件是根节点,引起这一事件的原因是子节点。在对树的每一枝节进行分析时,若某
4、个节点无法继续分析(即无子节点),该节点称为目标节点,它是引起故障的基本事件,也是诊断的目标。代号:A2内容:硬件失效类型:目标节点父节点:A1子节点:对顶重要性:0.14代号:A1内容:系统失效类型:一般节点父节点:A0子节点:A2,A3对顶重要性:0.4对每个故障树节点事件用一个对象表示(如图1)其成员数据表中包括该节点的代号、内容、类型、指向父、子节点的指针、路由选择以及所代表故障事件的细节。路由选择为在多个子节点的情况下的路径选择原则。故障事件的细节有该事件的对顶重要性及其它描述等。事件对顶重要性是指该节点事件的发生对父节点事件的发生的重要程度,它反映了该节点事件及其子树各节点事件对父
5、节点事件发生的相对责任。显然,根节点没有对顶重要性,而目标节点的子节点指针项为空指针。图1 故障树节点对象示例2.2 故障树模型的诊断算法故障树节点对象具有封装性,可以用框架结构来表示。诊断时,所有节点对象都存放于一个表中,对应事件位置在表中固定,对象指针指向对象所在的位置,这样安排可以使系统尽快根据故障信息找到故障对象,并根据指针遍历故障树。在诊断过程中,从根节点的不期望事件(即故障事件)出发,根据路由选择方案选择子节点,并由对象指针指引遍历故障树,直至找到目标节点,系统停止诊断,得出诊断结果。故障树中每一个节点对象只表示一个故障事件,从而根据事件对象的父节点指针可以找到以该事件为前因的所有
6、事件。同样,一个事件的所有前因事件都可以在该事件对象的子节点表中找到。如果诊断系统未发现任何基本故障事件,而的确有较高层故障事件发生,说明所建故障树尚不完善,需要对其进行补充:找到该较高层故障事件,在其子节点组中加入一基本故障事件。由于故障树用面向对象的表示,所要进行的操作只是加入新节点并改动与之相关的几个指针即可。3 建造实例通常,在电子装备的故障诊断过程中,专家往往是依照对电路拓扑结构的分析和信号的实际处理过程,以由前到后或由后到前的顺序来逐级压缩故障。把专家诊断的过程表达出来,就可以形成故障树。雷达诊断中的典型故障树如图2所示。3.1 知识内部表示对这种知识内部采用结构的形式来表示,可以
7、采用一个node结构:Type nodemyID As Integer 本节点标示符发射机不工作电源指示灯亮吗?吹风机FS转码?高压灯ZD1亮吗?其他情况1电源指示灯坏2保险丝坏3电源变压器坏1保险丝坏2电机线接触不良1指示灯ZD1坏2延时电路故障2电机线接触不良13YY5Y7N 2N 4N 6图2 雷达诊断中的典型故障树nextIDY As IntegernextIDN As Integerstatements As String *200 节点说明answerY As Integer Y支路节点类型questionY(2) As String*200 explainY (2) As Str
8、ing*200 answerN Ad IntegerquestionN(2) As String*200explainN(2)As String*200nodeexplain As String*200 推理解释End Type这就是故障树模型的一个面向对象表示。在这里设置了ID标示符号,也可以说是节点号。每一个节点有两条分支路,即YES和NO不同的回答。路由选择即针对不同的回答寻找不同的子节点。对于提问和解释设置不同的字段,以输入足够的信息。3.2 知识库的建立对于任意一种故障树,将其转化为标准知识库的方法和步骤是:(1)标定节点号。从1开始,如图2所示,可以不连续,但必须唯一,不能重复。(
9、2)确定目标节点和中间节点。目标节点表明诊断完毕,不用再搜索其下一节点,以1标示,如节点2、4、6;否则以0标示,继续搜索,节点1、3、5均为此种情况。(3)输入知识。在系统提供的节点知识获取环境中完成知识输入。例如,对图2中节点1,转换为内部结构为:myID=1; nextIDY=3; nextIDN=2statements=“电源灯亮吗?”answerY=0; answerN=1questionN(0)= “电源指示灯坏。”explainN(0)=“更换,修理。”questionN(1)=“保险丝坏。”explainN(1)=“更换。”questionN(2)=“变压器坏。”explain
10、N(2)=“更换。”questionY(0)=“”explainY(0)= “”Y取nodebase取第一个节点询问是目标节点吗?继续吗?取相应之节点号调指针结束YNN图3 推理算法3.3 推理策略推理过程实际上就是咨询过程,通过用户对问题的回答,进行路由选择并推理,交互完成诊断,其算法如图3。诊断时,把知识库读入动态数组,以节点号为标志,先在内存中形成所有节点的列表,再按节点号搜索节点信息,找到后显示(即询问),根据用户回答找下一节点并重新搜索列表。在程序中,myID是该记录的标志节点号,而nextIDY和nextIDN则分别是用户回答Yes或No时所对应的不同节点标志。程序中提供的核心函数
11、为show-nb(),其中关键的是指针recordnum的调整,它由用户对问题的回答来决定,根据其nextID调整,然后递归调用show-nb()函数,从而使查询进行下去,直至目标节点为止。调用方式如下:show-nb(noderecord(currentID).nextIDY)或show-nb(noderecord(currentID).nextIDN)在show-nb()函数中加入如下搜索过程For j=1 To recordnumIf noderecord(j).myID=i Thena = noderecord(j).statementsb = noderecord(j).nodeex
12、plaincurrentID=jEnd IfNext j4 结束语在故障诊断领域中,故障树分析技术应用非常普遍。把这种故障树模型采用面向对象的形式表示,并采用WINDOWS特性的Visual Basic语言来建造,把每一个节点的信息封装到对象中,既使故障知识的维护与修改变得简单方便,也将推理机和知识库分开,用户可以进行二次开发,对不同的故障树,按照本文提供的方法即可迅速建立不同类型的专家系统。专家系统作为人工智能的分支之一,对其用面向对象技术进行改造很有意义。而且,在整个人工智能设计领域,采用面向对象技术、可视化技术、多媒体技术实现人机交互,也是未来发展的趋势。参考文献1 Jaume D,Verge M, A model-based diagnosis in machine tools: application to the miling cutting process,EASAM&CANM,1990.2 查建中. 智能工程. 北京:机械工业出版社,1992.3 蔡自兴,徐光佑. 人工智能及其应用(第2版). 北京:清华大学出版社,1996.4 周民光. Visual Basic for Windows语文参考详解. 北京航空航天大学出版社,1995.