码迷,mamicode.com
首页 > 编程语言 > 详细

基于Java的Jess功能函数扩展方法

时间:2016-04-18 13:14:15      阅读:632      评论:0      收藏:0      [点我收藏+]

标签:

  Jess是Java expert system shell的缩写,是Java平台上的规则引擎,它是CLIPS程序设计语言的超集,是完全使用Java语言编写一种用于开发专家系统的语言。对于基于规则的推理,特别是针对逻辑条件的推理,Jess是已知规则引擎中最快的。它以增强型Rete算法为基础,支持前向推理,也支持后向推理,具有直接对Java对象进行推理,支持对工作存储区的查询访问等特点[1-2]。

  Jess语言本身提供了很多功能强大的函数供专家系统开发者调用,但这些函数不可能囊括一切功能和运算,若仅凭Jess语言自身的这些功能函数去构建规模和复杂度日益扩大和提升的专家系统,已绝非易事[2]。另外,软件开发语言的可扩展性也是优秀编程语言的重要特点之一,编程者利用软件语言本身,或借助其他语言,编写自定义功能函数,以求达到扩展和增强软件功能的目的,在此方面Jess也不例外。该文从Jess语言对外提供的用户自定义功能函数接口Userfunction入手[3-4],分析实现Useffunction接口的具体细节,分析Jess函数调用语句与Useffunction接口方法call参数之间的内在联系,抽取转换Jess函数的参数到Java环境中并进行相应的功能要求处理,最终将处理结果转换并返回到Jess中。此过程实现了利用Java语言扩展Jess语言功能函数的目的。此方法被应用到基于RCM的压缩机检修策略的研究开发中,实现分级维修策略的决策。

  1 Userfunction接口及其实现

  Userfunction是Jess提供的一个接口,Jess所有的内建函数就是通过实现这个接口来创建的。若用户或者编程者想扩展Jess的功能函数,也可以通过实现这个接口来创建自定义的功能函数,不同的实现对应不同的功能函数。Jess是使用Java语言编写的,所以用Java类去实现这个接口是自然而然的选择,不同实现类对应功能不同的函数,这些类一旦被装载进Jess中,Jess就如同调用自己的内建函数一样去调用这些自定义的扩展函数了。

  从数据处理的角度分析,使用Java类实现Userfunction接口,是一个数据类型转换、处理和再次转换的过程:首先Java将Jess类型数据抽取并转换成Java能够操作的数据类型,然后Java对这些数据依照功能要求进行一定的运算处理,得到Java类型数据的处理结果,最后再将Java类型的处理结果转换成Jess类型数据并返回给Jess。以上过程如图1所示。

  

技术分享

 

  1.1 Userfunction接口原型

  Userfunetion接口仅包含两个抽象的Java方法:getName和call。接口原型是:

  public interface Userfunction{String getName();Value call(ValueVector vv,Context context)throws JessException;}

  Userfunction接口的实现就是实现这两个方法。

  1.2 getName方法的实现

  getName方法的实现比较简单,以字符串的形式将函数名直接返回即可。其固定的实现形式是:

  String getName(){return“函数名”;}

  其中,return语句中函数名就是在Jess中准备调用的函数的函数名,这个函数名与实现这个接口的类的类名没有关系。Jess对其函数使用哈希表进行管理,函数名跟哈希表中的键值是一一对应关系,因此该函数名不能是字符串变量,只能是字符串常量。对于函数名的命名,只要合乎函数名命名规范要求就可以了。

  1.3 call方法的实现

  抽象方法call的实现是接口Userfunction实现的关键。此方法的实现可分为3个步骤:①Java对Jess函数参数的抽取和数据类型的转换;②Java依照功能要求对数据的处理;3③Java对结果数据类型的转换及将转换结果返回给Jess。

  1)Java对Jess函数参数的抽取和数据类型的转换

  在Jess中,函数调用的一般格式是:(函数名参数1参数2……),其中,函数名、各个参数之间均用空格分隔开。函数名和各个参数被看做是一个整体,在Jess中被视为是一个有序序列(序列是Jess的一种数据类型),该序列的所有信息都被传递到方法call的参数ValueVector和Context中,因此,在Java中,可以从方法call的参数ValueVector和Context中抽取Jess函数的各个参数。

  ValueVector就是Jess内部用于表示序列的类,当一个函数被调用时,包括函数名和各个参数在内的这个有序序列其实就是ValueVector类的一个对象。ValueVector类与Java中的容器类非常相似,可以使用get()方法获取集合(序列)的每个元素,例如get(0)就是Jess函数的函数名get(1)就是Jess函数的参数1。

  然而,get()方法的返回值是Value对象。Value是Jess中的包装类集合,其中包含有11个包装类,每个包装类的类名、含义及获取对应对象值的方法如表1所示。要想从Value对象中获取对象值,并将数据类型转换为Java能够识别操作的数据类型,就需要Jess包装类获取对应对象值的方法,另外,还需要方法call的参数Context。方法call的参数Context是Jess中某函数执行时的上下文信息类,它的实例对象包含了该函数被调用时的上下文信息,其中也包含了指向Rete对象的指针。在具体获取某一类Value类对象的对象值时,为了避免错误的解析和抽取,Context类对象一般作为Value类对象获取对应对象值方法的参数。

  

技术分享

 

  例如,Jess中函数调用(uadd 3“chx”),若vv是ValueVector类的一个对象,context是Context类的一个对象,则可以使用vv.get(1).intValue(context)方法获得Jess函数的整数参数值3,vv.get(2).stringValue(context)方法获得Jess函数的字符串参数值“chx”。

  2)Java依照功能要求对数据的处理

  当已经抽取并将Jess函数的各个参数转换为Java类型的数据之后,接下来就是依照函数功能的要求,运用Java的数据运算处理功能,对这些数据进行相应的处理,得到运算处理的结果。

  3)Java对结果数据类型的转换及将转换结果返回给Jess

  Java对数据运算处理结果仍是Java类型的数据,而方法call的返回值类型是Jess的Value类类型(参见表1),因此需要将Java类型的数据再次转换为Jess类型,并将转换后的Jess类型数据返回给Jess。具体做法就是返回创建的Value实例对象,其一般格式是:return new Value(返回对象名,RU.XXXX),其中的XXXX是Jess的Value类名。例如retum new Value(str,RU.STRING),即以字符串类型将对象str返回给Jess。

  由于实现Userfunction接口的过程中使用到Jess类的诸多对象和方法,所以,在实现Userfunction接口的类文件中要导入jess包,并在编译该Java类之前,要添加外部jar包jess.jar和jsr94.jar到编译库文件中。至此,Userfunction接口实现类文件完成。

  2 装载实现Userfunction接口的函数到Jess中

  在加载了Jess Tab模块的Eclipse环境下,对实现接口Userfunction的类源文件进行编译,生成.class文件,将该.class文件复制到安装Jess软件的bin目录下,然后在Jess提示符下,运行load-function函数,并将实现接口Useffunction的类文件名作为load-function函数的参数,执行该命令后,若Jess显示TRUE,则说明装载成功。

  在Eclipse环境下的.clp文件中,若希望调用扩展的自定义功能函数,则先将类源文件编译生成的.class文件所在路径添加到编译库文件中,再执行load-function函数语句,最后就可直接调用该扩展的自定义功能函数了。

  3 Jess对RCM分级状态检修策略的决策

  3.1 RCM检修策略[5]

  RCM(Reliability Centered Maintenance)即以可靠性为中心的维修,是建立在设备的设计特点、运行功能、失效模型和后果分析基础上,以最大限度提高设备的使用可靠性为目的维修[5-6]。RCM检修策略可以综合设备状态和设备在系统中的重要性,均衡考虑设备的状态和设备的可靠性,合理安排设备的检修等级和检修策略。

  RCM分级状态检修策略的决策是设备的综合性能评价指标P依照表2进行决策,其中,P由设备健康状态综合指标日(简称健康状态)和设备重要性综合指标尺(简称重要性),以及此二者对检修策略影响的权重分配因子q共同决定。如式(1)所示:

  

技术分享

 

  

技术分享

 

  d可表示设备需要进行检修的紧迫程度,d越大说明设备需要检修的要求就越紧急;R值越大,表示设备的重要程度越高;H值越大表示设备健康状态越好;q=45°表示在设备检修策略决策时,对设备的重要性R和设备的健康状态日同等考虑。

  若设备H=0.2,R=0.4,则可计算得到P=0.6,检修决策为计划优先方式;若设备H=0.65,R=0.75,则可计算得到P=0.55,检修决策为计划或延期方式;若设备H=0.8,R=0.4,则可计算得到P=0.3,检修决策为延期方式。

  Jess中的数值运算函数相对较少,式(1)中P值的计算,以及依据表2和P值的分级检修策略的决策,可借助Java通过实现接口Userfunction来扩展Jess在此方面的函数功能。

  3.2 Java类ChxCalP实现接口Userfunction程序源代码[5]

  import jess.*;

  public class ChxCalP implements Userfunction{

  public String getName()

  {

  Return“chxcalp”;

  }

  public Value call(ValueVector vv,Context c)throws JessException

  {

  double h=vv.get(1).floatValue(c);

  double r=vv.get(2).floatValue(c);

  double sita=vv.get(3).floatValue(c);

  sita=sita*Math.PI/180;

  double t1=Math.sqrt((1-h)*(1-h)+r*r);

  double t2=Math.sin(Math.atan((1-h)/r)+sita);

  double d=t1*Math.abs(t2);

  float P=Double.valueOf(d/(Math.sin(sita)+Math.cos(sita))).floatValue();

  String str=“”:

  if(P>=0.0&&P<0.3)

  str=“延期维修”;

  else if(P>=0.3&&P<0.55)

  str=“计划维修”;

  else if(P>=0.55&&P<0.75)

  str=“计划优先维修”;

  else if(P>=0.75&&P<0.85)

  str=“近期检修”;

  else if(P>=0.85&&P<1)

  str=“立即检修”;

  return new Value(str,RU.STRING);

  }

  }

  3.3 Jess调用函数chxcalp实现RCM分级检修策略的决策

  实现接口Userfunction的类名是ChxCalP.class,Jess调用的函数名是chxcalp,其参数依次为:函数名,H值,R值,q值(q单位是角度)。Jess提示符下的装载和运行结果如图2所示。测试数据为:设备H=0.2,R=0.4,q=45°,分级检修策略的决策结果是计划优先维修方式。在Eclipse平台上的装载和运行结果如图3所示,测试数据为:设备H=0.8,R=0.4,q=45°,分级检修策略的决策结果是计划维修方式。

  

技术分享

 

  

技术分享

 结束语

 

  4

  通过Java语言实现Jess的Userfunction接口,可以扩展Jess语言的功能函数,这为开发者扩展Jess的功能提供了有效的途径和方法。该文基于RCM的分级检修策略的决策功能的实现,说明此方法的有效性。当然,Userfunction接口是可以多实现的,Userfunction接口也不例外,不同的实现对应不同的功能函数,这样,可以极大地扩展Jess的函数功能,这时,若要向Jess加载这些函数,则可实现Jess提供的Userpackage接口,在一个Java类文件中使用engine.addUserfunction方法,将多个扩展功能函数一次性地加载到Jess中。

按需出版 http://www.biyinjishi.com/products/a30-b3070/
广告展示 http://www.biyinjishi.com/products/a35/
户外喷绘 http://www.biyinjishi.com/products/a35-b3510/
LED显示屏 http://www.biyinjishi.com/products/a35-b3515/
门头 http://www.biyinjishi.com/products/a35-b3515/
灯箱 http://www.biyinjishi.com/products/a35-b3515/
LOGO墙 http://www.biyinjishi.com/products/a35-b3520/
广告字 http://www.biyinjishi.com/products/a35-b3520/
标牌 http://www.biyinjishi.com/products/a35-b3530/
标识 http://www.biyinjishi.com/products/a35-b3530/
会展配套 http://www.biyinjishi.com/products/a35-b3535/
会议 http://www.biyinjishi.com/products/a35-b3535/
展架租赁 http://www.biyinjishi.com/products/a35-b3550/
展具 http://www.biyinjishi.com/products/a35-b3550/
锦旗 http://www.biyinjishi.com/products/a35-b3560/
彩旗 http://www.biyinjishi.com/products/a35-b3560/
条幅 http://www.biyinjishi.com/products/a35-b3560/
墙贴 http://www.biyinjishi.com/products/a35-b3570/

基于Java的Jess功能函数扩展方法

标签:

原文地址:http://www.cnblogs.com/SA-Jim/p/5403774.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!