您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 结合CLIPS和VC++实现规则推理的方法
结合CLIPS和VC++实现规则推理的方法1.引言专家系统的开发一直是人工智能领域的一个重要研究方向。目前比较流行的专家系统开发语言主要有以下几种工具:⑴程序设计语言。包括通用程序设计语言(如C\C++,PASCAL)和人工智能语言(Prolog和Lisp)两种。⑵专家系统外壳。它是由一些已经成熟的具体专家系统通过抽取其中的具体知识,而保留它的体系结构和功能演变过来的。利用它可以快速产生—个专家系统。其主要缺点在于灵活性和通用性比较差,只局限于某些特定的域。⑶专家系统开发工具。它介于两者之间,为知识的表示提供了固定的模式,使专家系统的构造更加方便。这三种方式各有优缺点,其中专家系统工具以其高效、简便成为最常用的工具;另一方面,VC++等面向对象的可视化编程工具早已成为科研人员熟悉的开发工具。选择两者结合的方法来开发专家系统,可以充分利用两者的特点实现优势互补。2.CLPS简介CLIPS基本结构是产生式系统,采用正向推理机制,CLIPS与一般的产生式系统的不同在于其推理过程中独特的rete模式匹配算法,极大地提高了系统的反应速度。CLIPS专家系统主要有三大部分组成:⑴知识库:包括初始事实和初始对象实例以及规则库。⑵推理机构:控制整个规则的执行,决定规则是否应该执行和什么时候被执行。⑶黑板:由事实列表和对象实例列表组成,用于存储推理结果数据(黑板数据)。黑板数据包括开始推理以来得到的事实集对象实例集。3.CLIPS和VC++结合的优势利用VC++实现专家系统的主要缺点是C++在逻辑推理方面并不擅长,因此采用C++编写的推理机的开发程序量相对较大。CLIPS的优点包括:⑴逻辑推理方面的强大功能。使用CLIPS开发专家系统,推理机的设计可以大大简化。只需要将相关领域的知识按照给定的知识表示模型表示并按一定结构顺序组织起来即可。⑵有利于和其他语言联合使用。CLIPS很容易实现和其他语言的接口,而且CLIPS写成的专家系统可以和VC++共同编译,极大地提高了系统运行速度和可移植性。从以上分析可以看出,VC++和CLIPS在开发专家系统方面都有各自突出的优势,也有其缺陷。两者具有很强的互补性:CLIPS在逻辑推理方面的强大功能使它适合编写专家系统的知识库和推理机部分;VC++用于开发人机界面、处理与数据库和外设的数据交换。CLIPS在推理过程中遇到的复杂数值运算则通过调用VC++编写的外部函数来完成。这样结合VC++和CLIPS编程可以实现功能强大、界面友好的专家系统。4.CLIP嵌入VC++的一般过程⑴首先将CLIPS的源代码拷贝到VC++工程文件目录下。⑵在VC++中选取菜单:工程→添加工程→Files,将所有文件(*.C)都选上添加到工程中。⑶加入相应头文件声明为使在VC++中能识别CLIPS源程序,并可以在用户自定义函数中使用CLIPS中的方法函数,必须加入clips.h的头文件声明,声明代码为:extern“C”{#include“CLIPSSrc\clips.H”}声明可在stdAfx.h头文件末尾加入,但在菜单工程→设置→C/C++标签下,将/yustdAfx去掉或者在分类中将precompiledheader选取为不预处理头文件。⑷在UserFunctions函数中声明用户自定义函数用户自定义函数必须对CLIPS声明,以使它们能被CLIPS正常访问。用户自定义函数可以通过修改函数UserFunctions来向CLIPS声明。在UserFuncitons中,需为每个用户自定义函数调用函数DefineFuntion,这样用户的源代码才能被CLIPS编译和链接。例如:extern“C”voidUserFunctions();voidUserFunctions(){externvoidTextOut(charstrl,charstr2);externintYesOrNo(char*strl,ehar*str2,ehar*str3);externvoidExplainOut(charstrl,charstr2);DefineFunction(“TextOut”,’v’,PTIFTextOut,”TextOut”);DefineFunction(“YesOrNo”,’b’,PTIFYesOrNo,”YesOrNo”);DefineFunetion(“ExplainOut”,’v’,PTIFExplainOut,”ExplainOut”);}DefineFunction的第1个参数是函数的名字,是一个字符串;第2个参数是返回CLIPS的值的类型。返回类型如表1所示:表1返回类型返回代码bcfio返回类型布尔型字符串型单精度浮点数整型实例名返回代码lvdaw返回类型长整型无返回值双精度浮点数外部地址符号第3个参数是指向实际函数的指针,它与第一个参数不一定相同,第4个参数是第3个参数的字符串表现形式,它必须与第3个参数相同,但得加上引号。⑸编写用户自定义函数⑹启动CLIPS在VC++中启动CLIPS,需要在窗口中激发一按钮,在初始化CLIPS环境后,将规则库与事实库载入,再运行CLIPS,进行推理,其流程见具体实现代码如下:voidOnRepair(){char*RuleName,*pFileName;RuleName=”E://MTCZNSJPT//MCDES//reason//rule1.clp”;/*规则库*/pFileName=”E://MTCZNSJPT//MCDES//reason//facts.txt”;/*事实库*/InitializeCLIPS();/*初始化CLIPS环境*/Load(RuleName);/*载入规则库*/Reset();/*使CLIPS复位*/LoadFacts(pFileName);/*载入事实库*/Run(-1L);/*启动CLIPS*/}5.建立专家系统以摩托车设计专家系统(即知识库管理系统)为例说明如何使用CLIPS嵌入VC++的方法实现规则推理。摩托车设计专家系统主要用于解决摩托车总体方案设计的选型与布置方面的问题。其基本框架如图1所示。它包含了知识获取、知识维护、知识查询和总体设计推理系统模块,其中总体设计推理模块的结构如下,如图2所示。总体设计推理则采用了实例推理与规则推理的集成推理模式。根据设计需求主要特征提取相似实例并排序,选择一个实例,从而得到初始设计方案,按照方案评估确定是否满足要求,如果部分属性不满足,则对部分属性进行规则推理修改,再评价,得到满意结果后输出最终设计方案。由此可知规则推理是在实例推理得到初步设计方案之后,其关键需要解决规则编写、事实获取、解释实现和人机交互的实现等。5.1规则编写规则编写按照CLIPS中的规范,根据领域知识的特点进行编写。规则库存放于名为rule.clp的文件中,在启动CLIPS时将其载入CLIPS。如要与VC++进行数据交流。则在规则中需使用用户自定义函数。如下一条规则:(defrulecoling-selectl“选择发动机的冷却方式”(repairengine)?d-(design-requirement(exhaust-capacity?exhaust-capacity))(test(=?exhaust-capacity125))=(ExplainOut”cooling-selectl”“风冷构造简单,不存在泄漏、积垢、沸腾、结冰等问题,冷却系工作可靠,使用维修方便,特别是自然风冷不需要维修。但随着发动机功率不断升高,风冷常显得冷却不足,风冷发动机温度变化大,热负荷高,影响了可靠性和耐久性,运转噪声也较大。125mL以下的发动机大都采用风冷”)(if(YesOrNo”选择发动机冷却方式”“风冷”“水冷”)then(TextOutcoling“风冷”)else(TextOutcoling“水冷”)))这是一个选择发动机冷却方式的规则,当发动机排量不大于125时,可选用风冷或水冷。上面用到了3个用户自定义函数:ExplainOut用于规则解释及与用户交互时给用户提示,YesOrNo用于与用户交互,TextOut将推理结果传送给VC++。5.2事实获取从VC应用程序界面录入数据,然后按照规则库里的模板结构,将数据按照一定格式存放到事实文件fact.txt里。5.3实现解释解释通过记录推理的路径实现。首先用自定义函数ExplainOut将每条规则的规则号与解释文字传送给VC++,然后定义两个全局数组来分别记录推理中所用到的规则号与解释。5.4实现人机交互良好的人机交互是系统性能优越的体现。在推理过程中,通过人的参与,可以进一步明确问题的性质,解决规则之间的冲突。有些规则可以有多个结果,系统给出结果的评价和建议,由用户根据实际情况去选择。6.总结采用专家系统工具CLIPS嵌入VC++实现规则推理的方法,不仅可以有效利用知识库中的规则知识,实现基于规则的推理,还可以构建出友好的人机交互界面,节约大量开发推理机程序的时间。实践证明,该方法可节约大量的时间和人力,提高开发效率。信息来源:《计算机工程与应用》第46卷第3期2010年3月
本文标题:结合CLIPS和VC++实现规则推理的方法
链接地址:https://www.777doc.com/doc-2137387 .html