论文部分内容阅读
摘要:介绍了专家系统开发平台Jess,并把Jess运用到民航机务维修差错预警专家系统中进行研究。该系统中维修差错以规则形式表示,推理机使用基于规则的不确定性推理方法进行推理,使系统达到有效预测和控制可能发生的维修差错,从而保证飞行安全。
关键词:专家系统;Jess;规则;可信度;不确定性推理
中图分类号:TP18 文献标识码:A文章编号:1009-3044(2007)16-31102-02
Reasoning Research Based on Jess in Expert System
YANG A-qin,GAO Shu
(College of Computer Science & Technology,Wuhan University of Technology,Wuhan 430063,China)
Abstract:The paper introduces development platform for expert system -Jess,and applies Jess to early warning expert system for maintenance errors in civil aviation.Maintenance errors in the system are represented in the form of rule, and the reasoner adopts the method of Rule-Based uncertainty reasoning to forecast and control possible occurrences of maintenance errors effectively, and thus guarantees the safety of the fligt.
Key words:expert system;Jess;rule;uncertianty reasoning
1 引言
随着计算机技术和人工智能技术的飞速发展,专家系统也有了新的重大发展,出现了一种新技术――基于Java的规则引擎技术,如:JBoss Rules、JLisa等开源项目和JRules、Jess等商业产品都是基于Java的规则引擎技术产品。Jess是1995年由美国Sandia国家实验室分布式系统计算组成员Ernest J. Friedman-Hill用JAVA语言开发的专家系统内核。Jess非常小巧、灵活,并且是已知规则引擎中最快的。本文针对Jess在民航机务维修差错预警专家系统中的应用进行研究。
2 Jess的概述
Jess(Java Expert System Shell)是一个扩展CLIPS的基于Java平台的规则引擎。它以CLIPS的设计原理为基础进行编写,除继承了CLIPS的优点外,还具有许多自己独特的特征,如支持正向和逆向推理,可以在系统运行环境下直接调用Java的类库等。
尽管Jess可以作为一个独立程序运行,但是常常把Jess库嵌入到Java代码中,通过使用Jess的API或Java规则引擎API(由javax.rules包定义)来实现Jess相应的功能。
Jess提供了一个交互式的、命令行的开发环境,也可以使用文本编辑代码成为脚本,以批处理方式装入Jess引擎。开发Jess脚本文件的工具很多,可以采用任一款文本编辑器,或以插件的形式附加到Eclipse平台来构建Jess的集成开发环境[1]。
2.1 Jess的基本组成与知识表示
Jess的核心也是由事实库(也称为工作内存)、规则库、推理机三大部分组成,并采用产生式规则作为基本的知识表达模式。
(1)事实:在Jess中,事实分为三类:有序事实(Ordered facts)、无序事实(Unordered facts)、对象事实(Object facts)。每个事实都有一个模板(template),而每个模板有一个模板名和一系列槽(slots)组成。事实根据模板获取它的事实名称和一系列槽列表。创建模板可以使用deftemplate结构或defclass函数。其中有序事实类似于仅有一个多槽(multislot)的有无序事实。对象事实可通过defclass函数和definstance函数定义,对象事实相应类的定义由Java语言书编写,编译通过后即可动态地加入系统中。对象事实相似与Java Beans。对象事实的槽对应Java Beans中的属性,因而具有Java Beans的一些特性。
(2)规则:在Jess中,规则的表达形式沿用了CLIPS的语法结构,Jess也支持面向过程的编程方式,它提供了一些语句来控制规则后件的操作流程,如使用if…then…else和while…do…语句[2]。Jess定义规则使用了defrule函数,规则的前件由与事实匹配的模式组成,不能包含函数调用,规则后件由函数调用组成。
3 Jess的推理引擎
Jess支持前向和逆向推理两种方式,Jess的规则引擎利用著名算法Rete的改进形式根据知识库进行规则匹配来提高规则条件匹配效率。Rete算法其核心思想是将分离的匹配项根据内容动态构造匹配树,以达到显著降低计算量的效果[3]。
4 基于Jess的民航机务维修差错预警推理的研究
4.1 不确定性推理
对待一般规则e-> h,使用确定性因子描述规则强度,定义为CF(h,e) 。原始证据的确定性因子由用户在系统运行时提供,非原始证据的确定因子由不确定性推理算法得出,在实际应用中,规则强度的值由领域专家主观给出。通常使用如下算法:
(1)若已知规则强度CF(h,e)和前提可信度CF(e),则结论h的可信度为:
CF(h)=CF(h,e)×CF(e)
(2)若前提条件e是子条件ei的逻辑组合,则:
CF(e)=CF(e1 AND e2 AND … AND en)=min{CF(e1),CF(e2),…,CF(en)}
CF(e)=CF(e1 OR e2 OR … OR en)=max{CF(e1),CF(e2),…,CF(en)}
(3)若系统中有两个规则得到同样的结论,每个结论都会有一个可信度,则该结论的可信度是:(设CF1(h),CF2(h)表示从不同的规则得出的某个结论的两个可信度)
①当CF1(h)和CF2(h)≥0时:
CF(h)=CF1(h)+CF2(h)-CF1(h)×CF2(h)
②当CF1(h)和CF2(h)≤0时:
CF(h)=CF1(h)+CF2(h)+CF1(h)×CF2(h)
③否则:CF(h)=CF1(h)+CF2(h)
若有多个规则得到同样的结论,则可反复使用如上公式[4]。
4.2 Jess在机务维修差错预警系统中的进行不确定性推理的实现
由机务维修差错引起的航空灾害经常发生,且航空维护、修理是确保航空公司安全、准点运营的重要因素,同时,机务维修差错的发生很多是由人为因素引起的,人为因素引起的差错是不可以预料的、模糊的、层次不穷的、不确定的,因此利用Jess进行基于规则的不确定性推理方式,根据专家的经验知识进行快速而准确地推理,分析和识别出引发差错或不安全事件的诱因,并给出相关的对策,以避免同类差错或隐患的再次发生,消除机务维修系统的隐形失效,切断不安全事件发生链,从而提高维修质量,保障飞行安全。
4.2.1 Jess推理部分的组织结构
机务维修差错预警专家系统中有关Jess推理部分的组织结构如图1所示。
图1 Jess推理部分的组织结构
4.2.2 知识库的组织
知识库由事实库和规则库组成。在航空维修差错研究中,针对差错,分析差错的诱因,提供差错预控对策,把这些差错信息整理成规则形式来描述和表示,且这些规则应具有典型性和概括性,利用Jess实现不确定性推理。系统采用JavaBean的形式将事实和结论封装成类,对类的成员的操作不以成员方法的形式完成,而是以规则后件的形式完成,例如对于可信度的计算以规则后件的形式完成。定义的JavaBean类中CausationBean存储各种诱因,ConclusionBean存储可能导致的差错和相应对策,其中 CausationBean定义如下:
import java.io.Serializable;
public class CausationBean implements Serializable
{private String m_name = "";//诱因名
private float m_cf=0.00f;//诱因事实的可信度
public float getCf() { return m_cf; }
public void setCf(float f) { m_cf = f; }
public String getName() { return m_name; }
public void setName(String s) { m_name = s; }}
ConclusionBean定义如下:
import java.io.Serializable;
public class ConclusionBean implements Serializable
{private String m_error = "";//差错
private String m_measure = "";//预控对策
private float m_cf=0.00f;//结论的可信度
public float getCf() { return m_cf ;}
public void setCf(float f) { m_cf = f; }
public String getError() { return m_error; }
public void setError(String s) { m_error = s; }
public String getMeasure() { return m_measure; }
public void setMeasure(String s) { m_measure = s; }}
4.2.3事实模板的定义与事实
在使用Java Beans之前,首先要定义相关联的模板。而注册Java Beans是为了生成相应的模板(deftemplate),Beans的属性对应与模板的槽。利用defclass函数可以通知Jess自动生成一个特定的模板来表示特定类型的Java Beans,如。
(defclass causation examples.rules.CausationBean)
(defclass conclusion examples.rules.ConclusionBean)
在Jess中等价的模板为:
(deftemplate causation (slot cf) (slot class) (slot name) (slot OBJECT))
(deftemplate conclusion (slot cf) (slot class) (slot error) (slot measure) (slot OBJECT))
因为每个对象类都继承java.lang.Object,getClass()是java.lang.Object的方法,所以以上模板有槽“class”。槽“OBJECT”是由Jess添加的,它是与模板关联的Bean的引用。
definstance函数功能是向事实库中加入Java Beans对象事实。由于Java Beans有支持java.beans.PropertyChangeListeners特性,如果只要Bean属性发生改变,都需通知Jess,则需在definstance函数中,指定为dynamic,否则指定为static。若definstance指定为static,Java Beans对象的属性发生改变,Jess不会被通知,若需Java Bean对象属性随之发生改变,Jess中对应的对象事实的槽值也需要更新,可以使用update函数。update函数就是通知Jess更新相关联的对象事实更新槽值。
4.2.4 应用实例
在Jess中,使用defrule构造型来定义规则。根据本系统的实际情况,一条规则主要由规则前件,规则后件,规则前件的可信度,规则强度(前件对后件的支持度),结论的可信度和判断是否结论成立的阈值组成。
例如,规则库有如下规则,其规则前件由两个存在“与”关系的子条件组成,它们分别为 (causation(name "时间和人力不足") (cf?c0))和 (causation(name "工作交接不清") (cf?c1)),这两个子条件的可信度分别是变量?c0和?c1,根据3.1节第二种情况可知,规则前件的可信度为?c0和?c1中最小值;此规则的规则强度为0.8,则规则后件(结论)的可信度为0.8乘以规则前件的可信度;结论成立的阈值为0.5,如果结论的可信度大于阈值,结论成立,否则结论不成立;实现上述规则的Jess代码如下:
(defrulepppp001
?fact1 <- (causation(name "时间和人力不足") (cf?c0))
?fact2 <- (causation(name "工作交接不清") (cf?c1))
=>
(bind ?c2(* 0.8(min?c0?c1))
(if(> ?c20.5)
then
(bind ?sb2 (new examples.rules.ConclusionBean))
(definstance conclusion ?sb2 static )
(call ?sb2 setError"未安装所需的设备/零件" )
(call ?sb2 setCf?c2 )
(call ?sb2 setMeasure "1.增加维修人员,减少时间上的压力.2. 严格执行工作交接班制度,工作交接要有文字记录.")
(update ?sb2)
(printout t "事实: " (fact-slot-value ?fact1 name) "、" (fact-slot-value ?fact2 name) crlf)
(printout t "应用了规则pppp001 (规则强度为0.8):" crlf)
(printout t "条件1:" (fact-slot-value ?fact1 name) crlf)
(printout t "条件2:" (fact-slot-value ?fact2 name) ";" crlf)
(printout t "推出结论:" (call ?sb2 getError))
(format t ",可信度为:%.2f%n" ?c2 crlf)
(printout t "相应措施:" (call ?sb2 getMeasure) crlf crlf)))
本系统还利用了Java Swing 组件和jess的API函数来编写Jess推理过程中涉及到的用户界面,其中涉及到的jess API主要类有:jess.Rete、 jess.swing.JTextAreaWriter 、 jess.awt.TextReader。jess.Rete表示规则引擎,jess.swing.JTextAreaWriter 和jess.awt.TextReader作为Jess推理过程所需的输入输出流。通过界面输入事实到事实库中,如:工作交接不清,可信度为0.89和时间和人力不足,可信度为0.85。Jess推理的实现效果如图2所示。
5 结束语
Jess引擎是根据事实和规则来推理,且推理速度是已知规则引擎中最快的。把Jess应用到机务维修差错预警专家系统中进行不确定性推理,能有效地控制同类差错或隐患的再次发生。结合其它推理技术,如基于案例推理、基于模型推理等技术来研究航空机务维修差错预警专家系统也是目前研究的方向。
参考文献:
[1]http://www.jessrules.com/jess/docs/index.shtml.
[2]基于Java规则引擎的汽车发动机故障诊断专家系统研究与开发[J]. 交通与计算机.2005(23),5.
[3]张渊,夏清国.基于Rete算法的JAVA 规则引擎[J]. 科学技术与工程. 2006(11),6.
[4]高曙,王群,罗帆.民航机务维修差错及其预警专家系统构建[J].武汉理工大学学报(交通科学与工程版).2007(31),2.
注:“本文中所涉及到的图表、公式注解等形式请以PDF格式阅读原文。”
关键词:专家系统;Jess;规则;可信度;不确定性推理
中图分类号:TP18 文献标识码:A文章编号:1009-3044(2007)16-31102-02
Reasoning Research Based on Jess in Expert System
YANG A-qin,GAO Shu
(College of Computer Science & Technology,Wuhan University of Technology,Wuhan 430063,China)
Abstract:The paper introduces development platform for expert system -Jess,and applies Jess to early warning expert system for maintenance errors in civil aviation.Maintenance errors in the system are represented in the form of rule, and the reasoner adopts the method of Rule-Based uncertainty reasoning to forecast and control possible occurrences of maintenance errors effectively, and thus guarantees the safety of the fligt.
Key words:expert system;Jess;rule;uncertianty reasoning
1 引言
随着计算机技术和人工智能技术的飞速发展,专家系统也有了新的重大发展,出现了一种新技术――基于Java的规则引擎技术,如:JBoss Rules、JLisa等开源项目和JRules、Jess等商业产品都是基于Java的规则引擎技术产品。Jess是1995年由美国Sandia国家实验室分布式系统计算组成员Ernest J. Friedman-Hill用JAVA语言开发的专家系统内核。Jess非常小巧、灵活,并且是已知规则引擎中最快的。本文针对Jess在民航机务维修差错预警专家系统中的应用进行研究。
2 Jess的概述
Jess(Java Expert System Shell)是一个扩展CLIPS的基于Java平台的规则引擎。它以CLIPS的设计原理为基础进行编写,除继承了CLIPS的优点外,还具有许多自己独特的特征,如支持正向和逆向推理,可以在系统运行环境下直接调用Java的类库等。
尽管Jess可以作为一个独立程序运行,但是常常把Jess库嵌入到Java代码中,通过使用Jess的API或Java规则引擎API(由javax.rules包定义)来实现Jess相应的功能。
Jess提供了一个交互式的、命令行的开发环境,也可以使用文本编辑代码成为脚本,以批处理方式装入Jess引擎。开发Jess脚本文件的工具很多,可以采用任一款文本编辑器,或以插件的形式附加到Eclipse平台来构建Jess的集成开发环境[1]。
2.1 Jess的基本组成与知识表示
Jess的核心也是由事实库(也称为工作内存)、规则库、推理机三大部分组成,并采用产生式规则作为基本的知识表达模式。
(1)事实:在Jess中,事实分为三类:有序事实(Ordered facts)、无序事实(Unordered facts)、对象事实(Object facts)。每个事实都有一个模板(template),而每个模板有一个模板名和一系列槽(slots)组成。事实根据模板获取它的事实名称和一系列槽列表。创建模板可以使用deftemplate结构或defclass函数。其中有序事实类似于仅有一个多槽(multislot)的有无序事实。对象事实可通过defclass函数和definstance函数定义,对象事实相应类的定义由Java语言书编写,编译通过后即可动态地加入系统中。对象事实相似与Java Beans。对象事实的槽对应Java Beans中的属性,因而具有Java Beans的一些特性。
(2)规则:在Jess中,规则的表达形式沿用了CLIPS的语法结构,Jess也支持面向过程的编程方式,它提供了一些语句来控制规则后件的操作流程,如使用if…then…else和while…do…语句[2]。Jess定义规则使用了defrule函数,规则的前件由与事实匹配的模式组成,不能包含函数调用,规则后件由函数调用组成。
3 Jess的推理引擎
Jess支持前向和逆向推理两种方式,Jess的规则引擎利用著名算法Rete的改进形式根据知识库进行规则匹配来提高规则条件匹配效率。Rete算法其核心思想是将分离的匹配项根据内容动态构造匹配树,以达到显著降低计算量的效果[3]。
4 基于Jess的民航机务维修差错预警推理的研究
4.1 不确定性推理
对待一般规则e-> h,使用确定性因子描述规则强度,定义为CF(h,e) 。原始证据的确定性因子由用户在系统运行时提供,非原始证据的确定因子由不确定性推理算法得出,在实际应用中,规则强度的值由领域专家主观给出。通常使用如下算法:
(1)若已知规则强度CF(h,e)和前提可信度CF(e),则结论h的可信度为:
CF(h)=CF(h,e)×CF(e)
(2)若前提条件e是子条件ei的逻辑组合,则:
CF(e)=CF(e1 AND e2 AND … AND en)=min{CF(e1),CF(e2),…,CF(en)}
CF(e)=CF(e1 OR e2 OR … OR en)=max{CF(e1),CF(e2),…,CF(en)}
(3)若系统中有两个规则得到同样的结论,每个结论都会有一个可信度,则该结论的可信度是:(设CF1(h),CF2(h)表示从不同的规则得出的某个结论的两个可信度)
①当CF1(h)和CF2(h)≥0时:
CF(h)=CF1(h)+CF2(h)-CF1(h)×CF2(h)
②当CF1(h)和CF2(h)≤0时:
CF(h)=CF1(h)+CF2(h)+CF1(h)×CF2(h)
③否则:CF(h)=CF1(h)+CF2(h)
若有多个规则得到同样的结论,则可反复使用如上公式[4]。
4.2 Jess在机务维修差错预警系统中的进行不确定性推理的实现
由机务维修差错引起的航空灾害经常发生,且航空维护、修理是确保航空公司安全、准点运营的重要因素,同时,机务维修差错的发生很多是由人为因素引起的,人为因素引起的差错是不可以预料的、模糊的、层次不穷的、不确定的,因此利用Jess进行基于规则的不确定性推理方式,根据专家的经验知识进行快速而准确地推理,分析和识别出引发差错或不安全事件的诱因,并给出相关的对策,以避免同类差错或隐患的再次发生,消除机务维修系统的隐形失效,切断不安全事件发生链,从而提高维修质量,保障飞行安全。
4.2.1 Jess推理部分的组织结构
机务维修差错预警专家系统中有关Jess推理部分的组织结构如图1所示。
图1 Jess推理部分的组织结构
4.2.2 知识库的组织
知识库由事实库和规则库组成。在航空维修差错研究中,针对差错,分析差错的诱因,提供差错预控对策,把这些差错信息整理成规则形式来描述和表示,且这些规则应具有典型性和概括性,利用Jess实现不确定性推理。系统采用JavaBean的形式将事实和结论封装成类,对类的成员的操作不以成员方法的形式完成,而是以规则后件的形式完成,例如对于可信度的计算以规则后件的形式完成。定义的JavaBean类中CausationBean存储各种诱因,ConclusionBean存储可能导致的差错和相应对策,其中 CausationBean定义如下:
import java.io.Serializable;
public class CausationBean implements Serializable
{private String m_name = "";//诱因名
private float m_cf=0.00f;//诱因事实的可信度
public float getCf() { return m_cf; }
public void setCf(float f) { m_cf = f; }
public String getName() { return m_name; }
public void setName(String s) { m_name = s; }}
ConclusionBean定义如下:
import java.io.Serializable;
public class ConclusionBean implements Serializable
{private String m_error = "";//差错
private String m_measure = "";//预控对策
private float m_cf=0.00f;//结论的可信度
public float getCf() { return m_cf ;}
public void setCf(float f) { m_cf = f; }
public String getError() { return m_error; }
public void setError(String s) { m_error = s; }
public String getMeasure() { return m_measure; }
public void setMeasure(String s) { m_measure = s; }}
4.2.3事实模板的定义与事实
在使用Java Beans之前,首先要定义相关联的模板。而注册Java Beans是为了生成相应的模板(deftemplate),Beans的属性对应与模板的槽。利用defclass函数可以通知Jess自动生成一个特定的模板来表示特定类型的Java Beans,如。
(defclass causation examples.rules.CausationBean)
(defclass conclusion examples.rules.ConclusionBean)
在Jess中等价的模板为:
(deftemplate causation (slot cf) (slot class) (slot name) (slot OBJECT))
(deftemplate conclusion (slot cf) (slot class) (slot error) (slot measure) (slot OBJECT))
因为每个对象类都继承java.lang.Object,getClass()是java.lang.Object的方法,所以以上模板有槽“class”。槽“OBJECT”是由Jess添加的,它是与模板关联的Bean的引用。
definstance函数功能是向事实库中加入Java Beans对象事实。由于Java Beans有支持java.beans.PropertyChangeListeners特性,如果只要Bean属性发生改变,都需通知Jess,则需在definstance函数中,指定为dynamic,否则指定为static。若definstance指定为static,Java Beans对象的属性发生改变,Jess不会被通知,若需Java Bean对象属性随之发生改变,Jess中对应的对象事实的槽值也需要更新,可以使用update函数。update函数就是通知Jess更新相关联的对象事实更新槽值。
4.2.4 应用实例
在Jess中,使用defrule构造型来定义规则。根据本系统的实际情况,一条规则主要由规则前件,规则后件,规则前件的可信度,规则强度(前件对后件的支持度),结论的可信度和判断是否结论成立的阈值组成。
例如,规则库有如下规则,其规则前件由两个存在“与”关系的子条件组成,它们分别为 (causation(name "时间和人力不足") (cf?c0))和 (causation(name "工作交接不清") (cf?c1)),这两个子条件的可信度分别是变量?c0和?c1,根据3.1节第二种情况可知,规则前件的可信度为?c0和?c1中最小值;此规则的规则强度为0.8,则规则后件(结论)的可信度为0.8乘以规则前件的可信度;结论成立的阈值为0.5,如果结论的可信度大于阈值,结论成立,否则结论不成立;实现上述规则的Jess代码如下:
(defrulepppp001
?fact1 <- (causation(name "时间和人力不足") (cf?c0))
?fact2 <- (causation(name "工作交接不清") (cf?c1))
=>
(bind ?c2(* 0.8(min?c0?c1))
(if(> ?c20.5)
then
(bind ?sb2 (new examples.rules.ConclusionBean))
(definstance conclusion ?sb2 static )
(call ?sb2 setError"未安装所需的设备/零件" )
(call ?sb2 setCf?c2 )
(call ?sb2 setMeasure "1.增加维修人员,减少时间上的压力.2. 严格执行工作交接班制度,工作交接要有文字记录.")
(update ?sb2)
(printout t "事实: " (fact-slot-value ?fact1 name) "、" (fact-slot-value ?fact2 name) crlf)
(printout t "应用了规则pppp001 (规则强度为0.8):" crlf)
(printout t "条件1:" (fact-slot-value ?fact1 name) crlf)
(printout t "条件2:" (fact-slot-value ?fact2 name) ";" crlf)
(printout t "推出结论:" (call ?sb2 getError))
(format t ",可信度为:%.2f%n" ?c2 crlf)
(printout t "相应措施:" (call ?sb2 getMeasure) crlf crlf)))
本系统还利用了Java Swing 组件和jess的API函数来编写Jess推理过程中涉及到的用户界面,其中涉及到的jess API主要类有:jess.Rete、 jess.swing.JTextAreaWriter 、 jess.awt.TextReader。jess.Rete表示规则引擎,jess.swing.JTextAreaWriter 和jess.awt.TextReader作为Jess推理过程所需的输入输出流。通过界面输入事实到事实库中,如:工作交接不清,可信度为0.89和时间和人力不足,可信度为0.85。Jess推理的实现效果如图2所示。
5 结束语
Jess引擎是根据事实和规则来推理,且推理速度是已知规则引擎中最快的。把Jess应用到机务维修差错预警专家系统中进行不确定性推理,能有效地控制同类差错或隐患的再次发生。结合其它推理技术,如基于案例推理、基于模型推理等技术来研究航空机务维修差错预警专家系统也是目前研究的方向。
参考文献:
[1]http://www.jessrules.com/jess/docs/index.shtml.
[2]基于Java规则引擎的汽车发动机故障诊断专家系统研究与开发[J]. 交通与计算机.2005(23),5.
[3]张渊,夏清国.基于Rete算法的JAVA 规则引擎[J]. 科学技术与工程. 2006(11),6.
[4]高曙,王群,罗帆.民航机务维修差错及其预警专家系统构建[J].武汉理工大学学报(交通科学与工程版).2007(31),2.
注:“本文中所涉及到的图表、公式注解等形式请以PDF格式阅读原文。”