人工智能实验报告 产生式系统推理 动物识别
人工智能实验报告_13
人工智能实验报告题目:基于web动物识别系统院系:计算机科学与技术系专业:计算机科学与技术专业学号:*********学生姓名:***日期:2010-4-21一、实验题目:基于web的动物识别系统二、实验目的理解和掌握产生式知识表示方法及产生式系统的基本过程,能够利用Web编程技术建立一个基于产生式知识表示的简单的智能系统。
三、实验要求(1) 以本书第2章动物识别产生式系统的规则为知识库(可增加规则),采用正向推理或逆向推理方式。
(2) 以选定的数据库管理系统建立知识库,用选定的网络编程语言按B/S模式开发一个具有解释功能的智能系统。
(3) 提交完整的软件系统和相关文档,包括源程序和可执行程序。
四、实验环境(1) 硬件环境:网络环境中的微型计算机。
(2) 软件环境:WindowsXP及以上操作系统,本实验采用的框架结构,编程语言为C#,编程环境为Microsoft Visual Studio2008。
采用的数据库管理软件为Microsoft Office Access2007。
五、实验原理1产生式表示法:1.1事实1.1.1事实的定义事实是断言一个语言变量的值或断言多个语言变量之间关系的陈述句。
语言变量的值或语言变量之间的关系可以是数字、词等。
例如:“雪是白的”,其中“雪”是语言变量,“白的”是语言变量的值1.1.2事实的表示●确定性知识,事实可用如下三元组表示:(对象,属性,值)或(关系,对象1,对象2)其中,对象就是语言变量。
例如:(snow, color, white) 或(雪,颜色,白)(love, Wang Feng, country) 或(热爱,王峰,祖国)●非确定性知识,事实可用如下四元组表示:(对象,属性,值,可信度因子)其中,“可信度因子”是指该事实为真的相信程度。
可用[0,1]之间的一个实数来表示。
1.2规则的表示规则描述的是事物间的因果关系。
规则的产生式表示形式常称之为产生式规则,简称产生式或规则。
动物识别系统实验报告 人工智能原理及其应用
实验报告实验目的及要求:实验目的:1.熟悉产生式的特点,基本结构和设计思想2.掌握基于规则推理的基本过程和方法(在实验中采用正向推理过程)3.学会用高级程序设计语言开发基于规则的动物识别系统实验要求:1.根据动物识别系统的规则建立合理的数据结构或数据库来表示知识。
2.利用所选开发语言来建立推理过程。
(该程序能正向推理识别动物过程)3.利用控制台或者图形界面给出合理的交互接口,实现基本演示功能。
4.提交实验报告和源程序,总结实验结论和经验教训。
实验原理:1.基于规则产生式系统结构:基于规则的产生式系统一般由规则库(知识库)、综合数据库和推理引擎(推理机)三部分组成,规则库中它的基本组成框架如下图1所示。
知识库由谓词演算事实和有关讨论主题的规则构成,综合库又称为上下文,用来暂时存储推理过程中的结论和数据。
推理机是用规则进行推理的过程和行为,。
知识采集系统是领域专家把相关领域的知识表示成一定的形式,并输入到知识库中。
解释系统通过用户输入的条件来分析被系统执行的推理结构,并将专家知识以易理解的方式并把知识解释给用户。
图1 规则产生式系统的基本结构2. 简单动物识别产生式系统结构:⑴知识库ANIMAL的知识库非常小,仅仅包含16条规则(一般说来,一个产生式系统的知识库应包含≥几百条规则);⑵解空间很小,仅仅包含8个解,或8个最高假设(在一个特定的动物园里,共有虎、豹、长颈鹿、斑马、鸵鸟、企鹅和信天翁、八哥等8种动物);⑶初始事实集合很小,仅仅包含21个事实,如图中的F1至F21;⑷数据(即事实、证据、断言),知识(即浅层知识,规则)和推理都是精确的,即确定性的;⑸知识库。
实验步骤:本识别系统需要通过正向推理,正向推理过程的具体步骤是:(1)读入事实集到工作存储器。
(2)取出某条规则,将规则的全部前件与工作存储器中的所有事实进行比较。
如果匹配成功,则所得结果显示到屏幕上,转向(3);否则,直接转向(3)。
(3)结束。
人工智能实验报告-产生式系统推理-动物识别
人工智能第二次实验报告产生式系统推理班级:姓名:学号:一、实验目的1. 理解并掌握产生式系统的基本原理;2. 掌握产生式系统的组成部分,以及正向推理和逆向推理过程。
二、实验要求1. 结合课本内容, 以动物识别系统为例,实现小型产生式系统;2. 要求: 正向推理中能根据输入的初始事实,正确地识别所能识别的动物;逆向推理中能根据所给的动物给出动物的特征。
三、实验算法1. 如何表示事实和特征的知识;在本程序中,我将动物的特征写入data.txt,将规则记入rules.txt,将动物种类记为goal.txt。
通过函数void readFiles(){readGoal();readCod();readRule();}读入所有数据分别存放于goal[],rule[],cod[]自定义数组中。
2. 指出综合数据库和规则库分别使用哪些函数实现的?综合数据库(包括特征和目标)typedef struct{int xuh;//存放编号char valu[50];//存放具体内容}Node;Node goal[20];Node cod[50];规则库typedef struct{int rslt;int codNum;//记载前提的个数int cod[10];//记载前提的序号int used;//记载是否已匹配成功}Nrule;Nrule rule[50];void readRule(){FILE *fp;int i;int tempxuh,tempcodn;char ch;if((fp=fopen("rules.txt","r"))==NULL){printf("cannot open data\n");exit(0);}i=0;rule[i].codNum=0;while((ch=fgetc(fp))!=EOF){if(i==14)i=i;tempcodn=0;while(ch!='\n'&&ch!=EOF) //每一条规则{tempxuh=0;while(ch<='9'&&ch>='0'){tempxuh=tempxuh*10+ch-'0';ch=fgetc(fp);}rule[i].cod[tempcodn++]=tempxuh;tempxuh=0;if(ch=='-')//下一个是结论{ch=fgetc(fp);ch=fgetc(fp);while(ch<='9'&&ch>='0'){tempxuh=tempxuh*10+ch-'0';ch=fgetc(fp);}rule[i].rslt=tempxuh;}//ifelse if(ch=='*'){ch=fgetc(fp);}rule[i].codNum++;}i++;}rulenum=i;fclose(fp);}3. 规则库的匹配算法是什么?如何选用可用规则集中的规则?分别使用哪些函数实现的?程序中的正向与逆向搜索分别是在void main()中调用forwardFinger()和backFinger()来实现的。
人工智能实验报告
暨南大学人工智能实验报告题目:动物识别系统院系:信科院计算机系专业:计算机软件与理论学号:学生姓名:张韶远成绩:日期:2009年11月10日一、目的与要求1.掌握人工智能的知识表示技术,能用产生式表示法表示知识,并实现一个用于识别的专家系统。
2.推理策略采用正向推理和反向推理两种。
二、主要内容1.学习人工智能的知识表示技术,关键掌握产生式知识表示的具体应用方法。
2.实现的动物识别系统的主要功能如下:2.1系统能通过正向、反向推理得到正确的动物识别结果。
2.2系统能动态地添加规则、能显示推理过程。
三.实验原理产生式表示:产生式表示是知识表示的一种。
这种方法是建立在因果关系的基础上的,可很容易的描述事实、规则及其不确定性度量。
1.事实的表示:事实可看成是断言一个语言变量的值或是多个语言变量间的关系的陈述句,语言变量的值或语言变量间的关系可以是一个词。
不一定是数字。
一般使用三元组(对象,属性,值)或(关系,对象1,对象2)来表示事实,其中对象就是语言变量,若考虑不确定性就成了四元组表示(增加可信度)。
这种表示的机器内部实现就是一个表。
如事实“老李年龄是35岁”,便写成(Lee,age,35)事实“老李、老张是朋友”,可写成(friend,Lee,Zhang)2.规则的表示:规则用于表示事物间的因果关系,以if condition then action 的单一形式来描述,将规则作为知识的单位。
其中的condition 部分称为条件式前件或模式,而action部分称作动作、后件或结论。
产生式一般形式为:前件后件。
前件和后件也可以是有“与”、“或”、“非”等逻辑运算符的组合的表达式。
条件部分常是一些事实的合取或析取,而结论常是某一事实B。
如果不考虑不确定性,需另附可信度度量值。
产生式过则的含义是:如果前件满足,则可得到后件的结论或者执行后件的相应动作,即后件由前件来触发。
一个产生式生成的结论可以作为另一个产生式的前提或语言变量使用,进一步可构成产生式系统。
AI实验报告
目录人工智能及其应用........................................................................................... 错误!未定义书签。
实验报告................................................................................................... 错误!未定义书签。
实验一产生式系统实验群. (2)一、实验目的: (2)二、实验原理: (2)三、实验条件: (3)四、实验内容: (3)五、实验步骤: (3)实验二搜索策略实验群搜索策略: (6)一、实验目的: (6)二、实验原理: (6)三、实验条件: (6)四、实验内容: (6)五、实验步骤: (7)六:实验过程: (7)七、A*算法流程图: (18)八、实验结论: (19)实验三神经网络实验群 (20)一、实验目的: (20)二、实验原理: (20)三、实验条件: (20)四、实验内容: (20)五、实验步骤: (21)六、实验结论: (21)实验四自动规划实验群 (25)一、实验目的: (25)二、实验原理: (25)三、实验条件: (25)四、实验内容: (26)五、实验步骤: (26)实验一产生式系统实验群产生式系统: 是由一组规则组成的、能够协同作用的推理系统。
其模型是设计各种智能专家系统的基础 .产生式系统主要由规则库、综合数据库和推理机三大部分组成。
本实验环境主要提供一个能够实现模拟产生式专家系统的验证、设计和开发的可视化操作平台。
学生既能用本系统提供的范例进行演示或验证性实验,也能够用它来设计并调试自己的实验模型。
一、实验目的:熟悉和掌握产生式系统的运行机制,掌握基于规则推理的基本方法。
二、实验原理:生式系统用来描述若干个不同的以一个基本概念为基础的系统,这个基本概念就是产生式规则或产生式条件和操作对。
人工智能产生式系统实验报告
实验报告【实验名称】______________产生式系统_______________________ 【实验目的】1. 理解产生式系统的结构原理与实际应用。
2. 掌握产生式规则表示及规则库组建的实现方法。
3. 熟悉和掌握产生式系统的运行机制,掌握基于规则推理的基本方法。
【实验原理】产生式系统用来描述若干个不同的以一个基本概念为基础的系统,这个基本概念就是产生式规则或产生式条件和操作对。
在产生式系统中,论域的知识分为两部分:用事实表示静态知识;用产生式规则表示推理过程和行为。
【实验内容】1.自己建造产生式系统(包括规则库和事实库),然后进行推理,即可以自己输入任何的事实,并基于原有的规则和输入的事实进行推理。
2.建造动物识别系统,能根据输入的动物特征判断是那种动物或给出相应的回答。
3.算法设计①首先建立事实库事实库是在程序的开始直接输入的,用户根据需要选择,即要求用户先输入特征个数,然后输入动物的特征,进行识别。
如果未识别出来,则可以重新选择,或者退出。
动物的特征如下:1有奶2有毛发3有羽毛4会飞5生蛋6有爪7有犬齿8目盯前方9吃肉10有蹄11反刍食物12黄褐色13黑色条纹14黑色斑点15长腿16长脖子17暗斑点18白色19不会飞20黑白色21会游泳22善飞23不怕风浪24哺乳动物25鸟26食肉动物27有蹄动物28偶蹄动物29海燕30老虎31金钱豹32长颈鹿33斑马34鸵鸟35企鹅②建立静态规则库即建立产生式规则,本算法采用了产生中间事实的方法,便于建立和使用规则。
为了便于设计,我们把要识别的动物限于7种,这样所需要的产生式规则就比较少。
本算法共有15种规则,如下:R1: 如果动物有奶,则它是哺乳动物R2: 如果动物有毛发,则它是哺乳动物R3: 如果动物有羽毛,则它是鸟R4: 如果动物会飞且生蛋,则它是鸟R5: 吃肉的哺乳动物是食肉动物R6: 有爪有犬齿木钉前方的哺乳动物是食肉动物R7: 有蹄的哺乳动物是有蹄动物R8: 反刍食物的有蹄动物是偶蹄动物R9: 黄褐色有黑条纹的食肉动物是老虎R10:黄褐色有黑色斑点的食肉动物是金钱豹R11:长腿长脖子有黄褐色暗斑点的有蹄动物是长颈鹿R12:有黑白条纹的有蹄动物是斑马R13:不会飞长腿长脖的鸟是鸵鸟R14:不会飞会游泳黑白色的鸟是企鹅R15:善飞不怕风浪的鸟是海燕具体表示如下:R1: 1->24R2: 2->24R3: 3->25R4: 4*5->25R5: 6*7*8*24->26R6: 9*24->26R7: 10*24->27R8: 11*27->28R9: 12*13*24->30R10: 12*14*24->31R11: 12*15*16*17*27->32R12: 13*18*27->33R13: 15*16*19*25->34R14: 19*20*21*25->35R15: 22*23*25->29③正向推理过程从已知事实出发,通过规则库求得结论,或称数据驱动方式。
人工智能动物识别实验报告
一.实验目的:1.熟悉并掌握如何使用SQL SERVER 20002.熟悉JAVA语言编程3.熟悉讲JAVA与数据库结合进行数据库编程4.理解产生式表示法5.熟悉产生式系统的基本过程二.实验环境及工具SQL SERVER 2000,ECLIPSE 7.0,PC机一台,Tomcat 6.0三.实验步骤及方法1.产生式规则分析通过分析书上的15条规则,我们可以得到该图为动物识别系统的部分推理网络在该图中,最上层的节点称为“结论”,中间节点称为“中间假设”,终结点称为“事实”。
其中,每个“结论”都是问题的一个目标,所有的“结论”就构成了本问题的一个目标集合。
经过分析可以本问题的事实有:有毛发,有奶等20个事实;中间假设有:该动物是哺乳动物,鸟,肉食动物和有蹄类动物;目标集合是:金钱豹,虎,长颈鹿,斑马,鸵鸟,企鹅和信天翁。
2.数据库设计根据第一步的分析,我们可以建立一个animal数据库,其中存放两张表,一张称为facts的事实表。
另一种称为factRules的规则表3.程序设计数据库及表已经建立好之后,我们就可以设计本系统的程序了,经过分析,我们得到如下的流程图4.使用Eclipse编程实现AnimalAction的主要源代码为:import com.myhomework.animal.OpenDb;public class AnimalAction extends Action { static OpenDb db = null;public static OpenDb getDB() {if (db == null) {db = new OpenDb();}return db;}public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception {do {do {i++;String sql4 = "select * from factRules where rulesNo=" + "'i'";ResultSet rs = getDB().executeQuery(sql4);String sql8 = "select count(*) total from newFacts";ResultSet rsr = getDB().executeQuery(sql8);if (total < count) {return mapping.findForward("err2");}isNew = IsInNewFcats(obj1);} while (!isNew);String sql6 = "select * from factRules where rulesNo=" + "'i'";String cName = "att5";ResultSet rss = getDB().executeQuery(sql6);int m=0;try{isIn = (m > 24 && m < 32);if (isIn) {String sql9 = "select factName from facts where factNo="+ "'m'";ResultSet rss2 = getDB().executeQuery(sql9);request.setAttribute("reslut", factName);return mapping.findForward("succ");}String sql7 = "insert into newFacts values(" + "'m'" + ")";getDB().executeUpdate(sql7);} while (!isIn && i<16);return mapping.findForward("err1");}}Struts-config.xml的主要配置为:<form-beans><form-bean name="animalactionform"type="com.myhomework.animal.AnimalActionForm"> </form-bean></form-beans><action-mappings><action path="/animal"type="com.myhomework.animal.AnimalAction"scope="request"name="animalactionform"><forward name="succ"path="/success.jsp"/><forward name="err1"path="/error1.jsp"/><forward name="err2"path="/error2.jsp"/></action>四.实验结果1.在浏览器上输入http://localhost:8080/anistruts,显示该系统的首页为:2.单击“产生式规则”,即跳转到产生式规则表页面为:交”按钮,则系统成功识别的结果4.如果只选中“有毛发”,然后点击“提交”,条件不足,无法识别的结果5.条件错误,无法识别的结果五.实验总结通过本实验,我基本熟悉了SQL Server2000的基本使用,并理解了产生式表示法和产生式系统的基本过程;也可以熟练的使用Eclipse进行数据库编程。
动物识别系统实验报告
stringFindMaxNumber ="select max(动物序号) from动物库";
SqlCommandcmd2 =newSqlCommand( FindMaxNumber ,con);
1.1功能需求
1.1.1动物识别正向推理
正向推理是从已知事实出发,通过规则库求的结论,也称为自底向上,或称为数据驱动方式。
正向推理过程的具体步骤是:
(1)读入事实集到工作存储器。
(2)取出某条规则,将规则的全部前件与工作存储器中的所有事实进行比较。如果匹配成功,则所得结果显示到屏幕上,转向(3);否则,直接转向(3)。
动物识别系统设计主体框架:本系统只用了一个页面实现,界面使用上下结构的框架设计,当用户进入系统的时候,打开Default.aspx,该页面分为上下两个部分,上面的部分是用于根据问题输入动物特征,下面的部分是新规则的加入功能部分,也是用户进行添加新规则的页面,这好似一个导航页面,用户可以更具自己的选择进行的操作,由上至下进入不同的功能部分。各个功能模块的设计:
staticint[] a =newint[7];
SqlConnectioncon =newSqlConnection("Server = PC-11; user id = sa;password = ;Database = animal;");
protectedvoidPage_Load(objectsender,EventArgse)
YesOption.Checked =false;
}
protectedvoidNoOption_CheckedChanged(objectsender,EventArgse)
{
a[Convert.ToInt32(Questionselected.SelectedValue)] = 0;
人工智能导论实验报告 题目 基于产生式的动物识别专家系统 java
JOptionPane.showMessageDialog(null, sbuff + "\n=>" + ESARuleList.get(i).conclusion, "中间推断", JOptionPane.PLAIN_MESSAGE);
System.out.println(ESARuleList.get(i).conclusion); if( ("金钱豹".equals(ESARuleList.get(i).conclusion))||(ESARuleList.get(i).conclusion=="老虎")||(ESA
四、实验过程 1.实验环境: Java; 2.算法原理: 基于产生式知识表示,采用前向推理的方式; 3.系统设计: (1)人机接口
初始状态显示已知事实,用户可以勾选知识,进行推理,推理过程一步 一步显示出来; (2)知识获取机构
直接从写好的文本里获取; (3)知识库及其管理系统
知识库存放产生式规则,推理时用到的一般知识和领域知识,比如动物 的特征、动物的分类标准等,再具体地添加得到的具体动物;管理系统负责 将上次推理裁剪出去的规则重新加回来; (4)推理机
"金钱豹","老虎","长颈鹿","斑马","鸵鸟","企鹅","信天翁"}; public static String tuili(ArrayList<String> database) { int databaseSize; databaseSize = database.size(); for(int z=0;z<2;z++) for (int i = 0; i < ESARuleList.size(); i++) { if (ESARuleList.get(i).isMatch(database)) { StringBuffer sbuff = new StringBuffer(); ArrayList<String> database1=(ArrayList<String>) database.clone(); addData(database, ESARuleList.get(i).conclusion); for(int k=0;k<ESARuleList.get(i).conditions.length;k++) sbuff.append(ESARuleList.get(i).conditions[k]+' ');
报告_基于产生式系统的动物识别系统
实验基于产生式系统的动物识别系统知识表示与推理专题魏江200620108203 计算机系统结构专业(1班)正向推理是产生式系统的一种推理方法,它是从一组表示事实的谓词或命题出发,使用一组产生式规则,用以证明该谓词公式或命题是否成立.本实验用两种方法实现了一个简单的动物识别系统.一、实验目的1.熟悉和掌握产生式系统的运行机制,2.掌握基于产生式系统的正向推理的基本方法。
3.简要比较两种实现方式的异同二、实验内容1. 能根据输入的动物特征判断是那种动物或给出相应的回答. (第一种方法)2. 如果根据初始输入的动物特征不能判断,则可以动态增加新事实(即动物特征)来判断属于那种动物. (第一种方法)3. 可根据提示选择所要识别的动物是否具有该特征.(第二种方法)三、算法设计编程语言与编程环境: C++,VC6.0下面用第一种方法简要说明算法的设计过程.首先建立了一个animal_identifier的类.该类包含的属性有:f和r. f指针指向事实集,r指向规则集.包括的关键成员函数有:Creat_Rules(),Creat_Fact(), reason().1 建立静态规则库.即建立产生式规则.本算法采用了产生中间事实的方法,这样做的优点是涉及到的规则少,容易理解,便于建立和使用规则.为了便于设计,我们把要识别的动物限于7种,这样所需要的产生式规则就比较少.本算法总共有16种规则,部分规则如下:R1:如果某动物有毛发则该动物是哺乳动物R2:如果某动物有奶则该动物是哺乳动物R3:如果某动物有羽毛则该动物是鸟R4:如果某动物会飞,且下蛋则该动物是鸟R5:如果某动物吃肉则该动物是食肉动物R6:如果某动物有锋利的牙齿,且有爪,且眼睛盯着前方则该动物是食肉动物R7:如果某动物是哺乳动物,且有蹄则该动物是有蹄类哺乳动物……………..R16: 如果反刍则哺乳动物上述规则库由类animal_identifierd的方法Creat_rules()静态实现.2 建立事实库建立事实库是由方法Creat_Fact()实现的.该方法要求用户动态输入事实,即要求用户先输入特征个数,然后输入动物的特征,如果未识别出来,用户可以增加输入,或者退出.3 正向推理过程.正向推理是从已知事实出发,通过规则库求得结论,或称数据驱动方式。
动物识别专家系统实验报告
题目:动物识别专家系统一.实验目的理解和掌握产生式只是表示方法,能够用选定的编程语言实现产生式系统的规则库。
二.实验内容(1)以动物识别系统的产生式规则为例。
(2)用选定的编程语言建造规则库和综合数据库,并能对它们进行增加、删除和修改操作。
三.实验原理动物识别专家系统是流行的专家系统实验模型,它用产生式r来表示知识,共15条r、可以识别七种动物,这些r既少又简单,可以改造他们,也可以加进新的r,还可以用来识别其他东西的新r来取代这些r。
动物识别15条r:r1:IF 动物有毛发THEN 该动物是哺乳动物r2: IF 动物能产奶THEN该单位是哺乳动物r3: IF 该动物有羽毛THEN该动物是鸟r4: IF动物会飞AND会下蛋THEN该动物是鸟r5: IF动物吃肉THEN该动物是肉食动物r6: IF动物有犬齿AND有爪AND眼盯前方THEN该动物是食肉动物r7: IF动物是哺乳动物AND有蹄THEN该动物是有蹄动物r8: IF动物是哺乳动物AND是反刍动物THEN该动物是有蹄动物r9: IF动物是哺乳动物AND是食肉动物AND是黄褐色的AND有暗斑点THEN该动物是豹r10:IF动物是黄褐色的AND 是哺乳动物AND 是食肉AND 有黑条纹THEN该动物是虎r11:IF动物有暗斑点AND 有长腿AND 有长脖子AND 是有蹄类THEN该动物是长颈鹿r12:IF动物有黑条纹AND 是有蹄类动物THEN该动物是斑马r13:IF动物有长腿AND 有长脖子AND 是黑色的AND 是鸟AND 不会飞THEN该动物是鸵鸟r14:IF动物是鸟AND 不会飞AND 会游泳AND 是黑色的THEN该动物是企鹅r15:IF动物是鸟AND 善飞THEN该动物是信天翁四.推理树部分推理树如下:五.代码程序是用java编写的规则对象代码:public class Rule {private ArrayList<Integer> premise = new ArrayList<Integer>();private int result;public void addPremise(int item) { premise.add(item);}public int size() {return premise.size();}public int getPremiseAt(int index) {return premise.get(index);}public void setResult(int result) {this.result = result;}public int getResult() {return result;}}规则库代码如下:public class RuleBase {private ArrayList<Rule> rules= new ArrayList<Rule>();public int size() {return rules.size();}public RuleBase() {init();}public void addRule(Rule rule) {rules.add(rule);}public Rule getRuleAt(int index) {return rules.get(index);}public void init() {Rule rule1 = new Rule();rule1.addPremise(0); rule1.setResult(20);rules.add(rule1);Rule rule2 = new Rule();rule2.addPremise(1); rule2.setResult(20);rules.add(rule2);Rule rule3 = new Rule();rule3.addPremise(2); rule3.setResult(21);rules.add(rule3);Rule rule4 = new Rule();rule4.addPremise(3); rule4.addPremise(13); rule4.setResult(21);rules.add(rule4);Rule rule5 = new Rule();rule5.addPremise(19); rule5.setResult(22);rules.add(rule5);Rule rule6 = new Rule();rule6.addPremise(4); rule6.addPremise(15); rule6.addPremise(12); rule6.setResult(22);rules.add(rule6);Rule rule7 = new Rule();rule7.addPremise(20); rule7.addPremise(9); rule7.setResult(23);rules.add(rule7);Rule rule8 = new Rule();rule8.addPremise(20); rule8.addPremise(18); rule8.setResult(23);rules.add(rule8);Rule rule9 = new Rule();rule9.addPremise(20); rule9.addPremise(22); rule9.addPremise(14); rule9.addPremise(11);rule9.setResult(24);rules.add(rule9);Rule rule10 = new Rule();rule10.addPremise(20); rule10.addPremise(22); rule10.addPremise(11); rule10.addPremise(5);rule10.setResult(25);rules.add(rule10);Rule rule11 = new Rule();rule11.addPremise(23); rule11.addPremise(6); rule11.addPremise(7); rule11.addPremise(14);rule11.setResult(30);Rule rule12 = new Rule();rule12.addPremise(23); rule12.addPremise(5); rule12.setResult(26);rules.add(rule12);Rule rule13 = new Rule();rule13.addPremise(21); rule13.addPremise(6); rule13.addPremise(17); rule13.addPremise(7);rule13.setResult(27);rules.add(rule13);Rule rule14 = new Rule();rule14.addPremise(21); rule14.addPremise(10); rule14.addPremise(17); rule14.addPremise(8);rule14.setResult(28);rules.add(rule14);Rule rule15 = new Rule();rule15.addPremise(21); rule15.addPremise(16); rule15.setResult(29);}}综合数据库代码如下:public class Database {ArrayList<Integer> db = new ArrayList<Integer>();public void addFact(int item) {db.add(item);}public boolean contains(int item) {return db.contains(item);}}控制系统代码如下:public class Machine {public static String inference(Database db) { RuleBase ruleBase = new RuleBase();int result = 0;for (int i = 0; i < ruleBase.size(); i++) { int size = ruleBase.getRuleAt(i).size();boolean flag = true;for (int j = 0; j < size; j++) {if(!db.contains(ruleBase.getRuleAt(i).getPremiseAt(j))) { flag = false;break;}}if (flag) {int fact = ruleBase.getRuleAt(i).getResult();db.addFact(fact);if (fact >= 24) {result = fact;break;}}}switch (result) {case 24:return"金钱豹";case 25:return"老虎";case 26:return"斑马";case 27:return"鸵鸟";case 28:return"企鹅";case 29:return"信天翁";case 30:return"长颈鹿";default:return"不存在";}}}六.截图七.感想通过这次课程设计我对专业课的学习有了更加深刻的认识,让我知道了学无止境的道理。
AI实验-七种动物识别系统
AI实验-七种动物识别系统AI-动物识别⼀、实验⽬的1. 理解产⽣式系统的结构原理与实际应⽤。
2. 掌握产⽣式规则表⽰及规则库组建的实现⽅法。
3. 熟悉和掌握产⽣式系统的运⾏机制,掌握基于规则推理的基本⽅法。
⼆、实验原理产⽣式系统⽤来描述若⼲个不同的以⼀个基本概念为基础的系统,这个基本概念就是产⽣式规则或产⽣式条件和操作对。
在产⽣式系统中,论域的知识分为两部分:⽤事实表⽰静态知识;⽤产⽣式规则表⽰推理过程和⾏为1.实验要求运⽤所学知识,设计并编程⼀个⼩型的动物识别系统,识别对象:虎、⾦钱豹、斑马、长颈⿅、鸵鸟、企鹅、信天翁七种动物2.识别规则库R1: 有⽑(1) --> 哺乳动物(12)R2: 有奶(2) --> 哺乳动物(12)R3: 有⽻⽑(3) --> 鸟类(13)R4: 会飞(4) & 会下蛋 --> 鸟类(13)R5: 吃⾁(6) --> ⾷⾁动物(14)R6: ⽝齿(7) & 有⽖(8) & 盯前⽅(9) --> ⾷⾁动物(14)R7: 哺乳动物(12) & 有蹄(10) --> 有蹄类动物(15)R8: 哺乳动物(12) & 反刍(11) --> 有蹄类动物(15)R9: 哺乳动物(12) & ⾷⾁动物(14) & 黄褐⾊(16) & 暗斑点(17) --> ⾦钱豹(a)R10: 哺乳动物(12) & ⾷⾁动物(14) & 黄褐⾊(16) & ⿊⾊条纹(18) --> 虎(b)R11: 有蹄类动物(15) & 长脖(19) & 长腿(20) & 暗斑⾊(17) --> 长颈⿅(c)R12: 有蹄类动物(15) & ⿊⾊条纹(18) & --> 斑马(d)R13: 鸟类(13) & 长脖(19) & 长腿(20) & 不会飞(21) & ⿊⽩两⾊(22) --> 鸵鸟(e)R14: 鸟类(13) & 会游泳(23) & 不会飞(21) & ⿊⽩⼆⾊(22) --> 企鹅(f)R15: 鸟类(13) & 善飞(24) --> 信天翁(g)以上为:动物识别规则的15条规则,已编码3.思路分析1. 第⼀次编写时:采⽤的是,条件对应原则,每个条件对应的动物做⼀个集合,多个条件集合取交集,得到对应动物。
《人工智能》实验报告之产生式系统
《人工智能》实验报告
实验序号:09260021-01 实验项目名称:产生式系统的设计与实现
说明:实验检查方式(7-8周)
1.系统演示
a) 界面显示要求
(1)有若干选择初始事实的选择列表;
(2)显示规则的调用次序及综合数据库的变化过程;(正向推理中显示每使用一次规则后,产生的新事实。
反向推理中显示新的目标事实有哪些需要证明及哪些已经得到证实);
(3)显示最后的推理结果。
b) 代码基本功能的实现要求
初始事实的输入;规则的存储与载入;规则匹配、冲突消解、规则执行;结果输出。
2.提交实验报告。
人工智能动物产生式报告
人工智能第三次实验报告1.实验名称:动物识别产生式系统2.实验目的:通过本实验让学生理解并体会知识的产生式表示以及推理策略,为以后设计并实现复杂的专家系统奠定基础。
3.实验内容:知识表示为产生式知识表示方法,设计并实现具有15条规则能自动识别7种动物的产生式系统。
规则1:如果:动物有毛发则:该动物是哺乳动物规则2:如果:动物有奶则:该动物是哺乳动物规则3:如果:该动物有羽毛则:该动物是鸟规则4:如果:动物会飞,且会下蛋则:该动物是鸟规则5:如果:动物吃肉则:该动物是肉食动物规则6:如果:动物有犬齿,且有爪,且眼盯前方则:该动物是食肉动物规则7:如果:动物是哺乳动物,且有蹄则:该动物是有蹄动物规则8:如果:动物是哺乳动物,且是反刍动物则:该动物是有蹄动物规则9:如果:动物是哺乳动物,且是食肉动物,且是黄褐色的,且有暗斑点则:该动物是豹规则10:如果:动物是黄褐色的,且是哺乳动物,且是食肉,且有黑条纹则:该动物是虎规则11:如果:动物有暗斑点,且有长腿,且有长脖子,且是有蹄类则:该动物是长颈鹿规则12:如果:动物有黑条纹,且是有蹄类动物则:该动物是斑马规则13:如果:动物有长腿,且有长脖子,且是黑色的,且是鸟,且不会飞则:该动物是鸵鸟规则14:如果:动物是鸟,且不会飞,且会游泳,且是黑色的则:该动物是企鹅规则15:如果:动物是鸟,且善飞则:该动物是信天翁例如:该系统输入:有奶吃肉黑色条纹黄褐色系统输出:是虎4.实验代码#include <string.h>#include <math.h>#include <stdio.h>#include <iostream.h>char *FacAndRes[]={"反刍","蹄类","哺乳类","眼向前方", "有爪","犬齿","吃肉","会下蛋","会飞","有羽毛","有蹄","食肉动物","鸟类","能产奶","有毛发","善飞","黑白色条纹","会游泳","长腿","长脖子","黑条纹","黑斑点","黄褐色","信天翁","企鹅","驼鸟","斑马","长颈鹿","虎","豹",0};int rulePilcine[][6]={{22,23,12,3,0,0},{21,23,12,3,0,0},{22,19,20,11,0,0}, {21,11,0,0,0,0},{17,19,20,13,-9,0},{17,18,13,-9,0,0},{16,13,0,0,0,0}, {15,0,0,0,0,0},{14,0,0,0,0,0},{10,0,0,0,0,0},{8,7,0,0,0,0},{7,0,0,0,0,0},{4,5,6,0,0,0},{2,3,0,0,0,0},{1,3,0,0,0,0}};int rc[]={30,29,28,27,26,25,24,3,3,13,13,12,12,11,11,0};//断言编号数组class fact{private:int number;char name[21];int act;int suc;public:fact *next;fact(int num,char *L){strcpy(name,L);number=num;act=0;suc=-1;next=NULL;}char *getName(){char *L;L=new char[21];strcpy(L,name);return L;}int getNumber(){return number;}int getAct(){return act;}int getSuc(){return suc;}void putAct(const int tempAct,int tempSuc) {act=tempAct;suc=tempSuc;}};fact *f;class List{private:int number;public:List *next;List(int num){number=num;next=NULL;}int getNumber(){return number;}class rule{char *name;List *Pre;int con;public:rule *next;rule(char *N,int P[],int C);~rule();int query();void getName(){cout<<name;}};rule::~rule(){List *L;while(Pre){L=Pre->next;delete Pre;Pre=L;}delete name;}rule::rule(char *N,int P[],int C) {int i;List *L;Pre=NULL;next=NULL;name=new char[strlen(N)+1]; strcpy(name,N);i=0;while(P[i]!=0){L=new List(P[i++]);L->next=Pre;Pre=L;}con=C;int rule::query(){char c;int Tag=0;List *L;fact *F;F=f;L=Pre;if(L==NULL)cout<<"\nError";while(L!=NULL){F=f;for(;;){if(abs(L->getNumber())==F->getNumber()) break;F=F->next;}if(L->getNumber()>0){if((F->getSuc())==true) {L=L->next;continue;} if((F->getSuc())==false) return false;}else{if((F->getSuc())==1)return 0;if((F->getSuc())==0){L=L->next;continue;}}cout<<F->getName()<<"(Y/N)"<<endl;c=getchar();flushall();if((c=='Y')||(c=='y')){if(L->getNumber()>0)F->putAct(1,1);if(L->getNumber()<0){F->putAct(1,1);Tag=-1;return 0;}}else{if(L->getNumber()<0)F->putAct(-1,0);else{F->putAct(-1,0);Tag=-1;return 0;}}L=L->next;}F=f;for(;;){if(con==F->getNumber()) break;F=F->next;}if(con<24){F->putAct(1,1);return 0;}if(Tag!=-1){F=f;for(;;){if(con==F->getNumber()) break;F=F->next;}if(con<24){F->putAct(1,1);return 0;}cout<<"\n这个动物是"<<F->getName()<<endl; return 1;}return 0;}int main(){fact *F,*T;rule *r1,*r2;char ch[8];int i=1;f=NULL;while(FacAndRes[i-1]){F=new fact(i,FacAndRes[i-1]);F->next=f;f=F;i++;}F=f;f=NULL;while(F){T=F;F=F->next;T->next=f;f=T;}i=0;r1=NULL;for(i=0;i<15;i++){r2=new rule(ch,rulePilcine[i],rc[i]);r2->next=r1;r1=r2;ch[5]++;}r2=r1;for(;;){i=r2->query();if((i==1)||(i==-1))break;r2=r2->next;if(!r2)break;}if(!r2)cout<<"没有这种动物."<<endl;getchar();return 1;}5.实验结果:6实验心得:通过本次实验深刻体会到产生式推理的魅力,推理的过程已经基本了解和掌握,对代码的控制输出表达能力也有了很大的提高,流程的控制加深了我对逻辑控制的体会和强化。
人工智能动物识别系统 实验报告
人工智能导论实验报告题目动物识别专家系统学院信息科学与工程学院专业计算机科学与技术姓名侯立军学号 *********** 班级计信1301二O一五年十一月二十六日1 设计内容题目:动物识别专家系统内容:动物识别专家系统是流行的专家系统实验模型,他用产生是规则来表示知识可以识别不同的动物。
这些规则既少又简单,可以改造他们,也可以加入新的规则,还可以用来识别其他新规则来取代这些规则。
2 基本原理2.1 产生式系统的问题求解基本过程:(1) 初始化综合数据库,即把欲解决问题的已知事实送入综合数据库中;(2) 检查规则库中是否有未使用过的规则,若无转 (7);(3) 检查规则库的未使用规则中是否有其前提可与综合数据库中已知事实相匹配的规则,若有,形成当前可用规则集;否则转(6);(4) 按照冲突消解策略,从当前可用规则集中选择一个规则执行,并对该规则作上标记。
把执行该规则后所得到的结论作为新的事实放入综合数据库;如果该规则的结论是一些操作,则执行这些操作;(5) 检查综合数据库中是否包含了该问题的解,若已包含,说明解已求出,问题求解过程结束;否则,转(2);(6) 当规则库中还有未使用规则,但均不能与综合数据库中的已有事实相匹配时,要求用户进一步提供关于该问题的已知事实,若能提供,则转(2);否则,执行下一步;(7) 若知识库中不再有未使用规则,也说明该问题无解,终止问题求解过程。
2.2 正向推理正向推理是以已知事实作为出发点的一种推理,又称数据驱动推理、前向链推理及前件推理等。
2.2.1 正向推理的基本思想:从用户提供的初始已知事实出发,在知识库KB中找出当前可适用的知识,构成可适用知识集KS,然后按某种冲突消解策略从KS中选出一条知识进行推理,并将推出的新事实加入到数据库中作为下一步推理的已知事实,在此之后再在知识库中选取可适用的知识进行推理,如此重复,直到求得了所要求的解,或者知识库中再无可适用的知识为止。
实验一:产生式系统-动物识别系统
《人工智能导论》实验报告实验一:产生式系统——动物识别系统一、实验目的1、掌握知识的产生式表示法2、掌握用程序设计语言编制智能程序的方法二、实验内容1、所选编程语言:C语言;2.拟订的规则:(1)若某动物有奶,则它是哺乳动物。
(2)若某动物有毛发,则它是哺乳动物。
(3)若某动物有羽毛,则它是鸟。
(4)若某动物会飞且生蛋,则它是鸟。
(5)若某动物是哺乳动物且有爪且有犬齿且目盯前方,则它是食肉动物。
(6)若某动物是哺乳动物且吃肉,则它是食肉动物。
(7)若某动物是哺乳动物且有蹄,则它是有蹄动物。
(8)若某动物是哺乳动物且反刍食物,则它是有蹄动物。
(9)若某动物是食肉动物且黄褐色且有黑色条纹,则它是老虎。
(10)若某动物是食肉动物且黄褐色且有黑色斑点,则它是金钱豹。
(11)若某动物是有蹄动物且长腿且长脖子且黄褐色且有暗斑点,则它是长颈鹿。
(12)若某动物是有蹄动物且白色且有黑色条纹,则它是斑马。
(13)若某动物是鸟且不会飞且长腿且长脖子且黑白色,则它是驼鸟。
(14)若某动物是鸟且不会飞且会游泳且黑白色,则它是企鹅。
(15)若某动物是鸟且善飞,则它是海燕。
2、设计思路:用户界面:采用问答形式;知识库(规则库):存放产生式规则,推理时用到的一般知识和领域知识,比如动物的特征,动物的分类标准,从哺乳动物、食肉动物来分,再具体地添加一些附加特征得到具体动物;建立知识库的同时也建立了事实库。
事实库是一个动态链表,一个事实是链表的一个结点。
知识库通过事实号与事实库发生联系。
数据库:用来存放用户回答的问题,存放初始状态,中间推理结果,最终结果;推理机:采用正向推理,推理机是动物识别的逻辑控制器,它控制、协调系统的推理,并利用知识库中的规则对综合数据库中的数据进行逻辑操作。
推理机担负两项基本任务:一是检查已有的事实和规则,并在可能的情况下增加新的事实;二是决定推理的方式和推理顺序。
将推理机制同规则对象封装在一起,事实对象记录了当前的状态,规则对象首先拿出前提条件的断言(只有这些前提都有符合时才会做这条规则的结论),询问事实对象集,如事实对象集不知道,则询问用户,如所有前提条件都被证实为真则结论为真,否则系统不知道结论真假。
动物识别系统_人工智能课程实验
2 规则库
规则库RB(rule base)是一个用来存放与求 解问题有关的所有规则的集合,也称为知识库K B(knowledge base)。它包含了将问题从初始 状态转换成目标状态所需的所有变换规则。规则 库是产生式系统进行问题求解的基础。
3 控制系统(1)
控制系统(control system)也称为推理机, 其主要工作如下: 按一定的策略从规则库中选择规则与综合数据 库中的已知事实进行匹配。 当匹配成功的规则多于一条时,按照某种策略 选择一条执行。 对于要执行的规则,如果该规则的结论不是问 题的目标,将其加入综合数据库中。
动物识别系统
目录
You can briefly add outline of this slide page in this text box.
一、产生式系统的基本结构 二、产生式系统的类型
三、动物识别系统的相关策略
四、实验结果
一、产生式系统的基本结构
1 2 3
综合数据库
规则库 控制系统
1 综合数据库
综合数据库DB(data base)也称为事实库, 是一个用来存放与求解问题有关的各种当前信息 的数据结构。当某条规则的前提与综合数据库中 的已知事实相匹配时,该规则将被激活,并把其 结论放入综合数据库成为后面推理的已知事实。
四、实验结果(1实验结果(3)
四、实验结果(4)
二、产生式系统的类型(2)
3.2逆向推理产生式系统 也称目标驱动方式,它是从目标(作为假设) 状态出发,朝着初始状态前进,反向使用规则的 一种推理方法。所谓逆向使用规则,是指以问题 的目标状态作为初始综合数据库,仅当综合数据 库中的事实满足某条规则的后件时,该规则才被 使用。 优点:不使用与问题无关的规则。因此,对 那些目标明确的问题,使用反向推理方式是一种 最佳选择。
人工智能实验报告
暨南大学人工智能实验报告题目:动物识别系统院系:信科院计算机系专业:计算机软件与理论学号: 0934061004学生姓名:张韶远成绩:日期: 2009年11月10日一、目的与要求1.掌握人工智能的知识表示技术,能用产生式表示法表示知识,并实现一个用于识别的专家系统。
2.推理策略采用正向推理和反向推理两种。
二、主要内容1.学习人工智能的知识表示技术,关键掌握产生式知识表示的具体应用方法。
2.实现的动物识别系统的主要功能如下:2.1系统能通过正向、反向推理得到正确的动物识别结果。
2.2系统能动态地添加规则、能显示推理过程。
三.实验原理产生式表示:产生式表示是知识表示的一种。
这种方法是建立在因果关系的基础上的,可很容易的描述事实、规则及其不确定性度量。
1.事实的表示:事实可看成是断言一个语言变量的值或是多个语言变量间的关系的陈述句,语言变量的值或语言变量间的关系可以是一个词。
不一定是数字。
一般使用三元组(对象,属性,值)或(关系,对象1,对象2)来表示事实,其中对象就是语言变量,若考虑不确定性就成了四元组表示(增加可信度)。
这种表示的机器内部实现就是一个表。
如事实“老李年龄是35岁”,便写成(Lee,age,35)事实“老李、老张是朋友”,可写成(friend,Lee,Zhang)2.规则的表示:规则用于表示事物间的因果关系,以if condition then action 的单一形式来描述,将规则作为知识的单位。
其中的condition 部分称为条件式前件或模式,而action部分称作动作、后件或结论。
后件。
前件和后件也可以是有“与”、“或”、“非”等逻辑运算符的组合的表达式。
条件部分常是一些事实的合取或析取,而结论常是某一事实B。
如果不考虑不确定性,需另附可信度度量值。
产生式过则的含义是:如果前件满足,则可得到后件的结论或者执行后件的相应动作,即后件由前件来触发。
一个产生式生成的结论可以作为另一个产生式的前提或语言变量使用,进一步可构成产生式系统。
产生式系统实验报告
学生实验报告实验课名称:人工智能实验项目名称:产生式系统实验专业名称:计算机科学与技术班级:2013240202学号:********************教师姓名:陈亮亮2015 年10 月25 日实验日期:2015 年10 月23 日实验室名称:明远2203一.实验名称:产生式系统实验二.实验目的与要求:1、确定推理方法(正向还是反向),并根据问题设计并实现一个简单的推理机(要求涉及:匹配、冲突消解)2、规则库要求至少包含15条规则(知识规则如何存储?)3、推理机和知识库必须分离4、初始事实可以任意给定,输入初始事实后能够得到推理结果5、设计合理的人机界面,解释模块提供查询规则的功能6、可以不考虑知识库管理模块7、提交实验报告8、报告中要有推理树三.实验内容:本实验我设计了一个动物识别的小型专家系统,主要是根据一些观察到的事实,依据系统给出的一系列规则来进行正向推理,将逐渐的推导出结果。
本次实验设计了一个简单的推理机,推理机给出的推理结果有“它是__动物”、“条件不足,不能推出它是什么动物”、“条件有冲突,没有这样的动物”或“条件不完全,但它有__的部分特征”。
部分推理树如下:四、算法描述:1.表示事实和特征的知识。
在本程序中,我将动物的特征写入data.txt,将规则记入rules.txt,将动物种类记为goal.txt。
步骤4 若冲突集为空,则运行失败,退出。
步骤5 对冲突集做处理,对选择执行的各规则,将其结论加入动态数据库,或执行其动作,转步骤2。
推理的流程图五.源程序:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream.h>#include<math.h>#define MAXNUM 50typedef structprintf("按任意键继续,按'n'或'N'退出:");ch=getchar();ch=getchar();}while(ch!='n'&&ch!='N');}六.运行结果与分析:。
产生式系统实验报告
3、建立事实库(总数据库):建立过程同步骤2。重复操作,可输入多条事实。
4、然后按“确定”按钮即可。
此外,利用实例演示,可以运行系统默认的产生式系统,并且可以进行正反向推理。
((CButton*)GetDlgItem(IDC_CHECK9))->SetCheck(BST_UNCHECKED);
((CButton*)GetDlgItem(IDC_CHECK10))->SetCheck(BST_UNCHECKED);
((CButton*)GetDlgItem(IDC_CHECK11))->SetCheck(BST_UNCHECKED);
((CButton*)GetDlgItem(IDC_CHECK19))->SetCheck(BST_UNCHECKED);
((CButton*)GetDlgItem(IDC_CHECK20))->SetCheck(BST_UNCHECKED);
((CButton*)GetDlgItem(IDC_CHECK21))->SetCheck(BST_UNCHECKED);
((CButton*)GetDlgItem(IDC_CHECK15))->SetCheck(BST_UNCHECKED);
((CButton*)GetDlgItem(IDC_CHECK16))->SetCheck(BST_UNCHECKED);
((CButton*)GetDlgItem(IDC_CHECK17))->SetCheck(BST_UNCHECKED);
((CButton*)GetDlgItem(IDC_CHECK3))->SetCheck(BST_UNCHECKED);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ch=fgetc(fp); } rule[i].cod[tempcodn++]=tempxuh; tempxuh=0; if(ch=='-')//下一个是结论 { ch=fgetc(fp); ch=fgetc(fp); while(ch<='9'&&ch>='0') { tempxuh=tempxuh*10+ch-'0'; ch=fgetc(fp); } rule[i].rslt=tempxuh; }//if else if(ch=='*') { ch=fgetc(fp); } rule[i].codNum++; }
功。推某一个事实时,仍然是从该事实的前提出发,逐个匹配,若所有的前提满足,则该事 实满足。代码如下: void backFinger() { int i; bQueueNode markdCod[MAXNUM];//stat 字段用来存它的结论的序号 int flagFitAll; int markdCodNum; double fitDegree; int flagExistAns; flagFitAll=0; flagExistAns=0; for(i=0;i<goalnum&&flagFitAll==0;i++)//一种动物 { initBack(&fitDegree,&markdCodNum,i); while(bqueue.head!=bqueue.tail) { if(bqueue.head==9&&bqueue.tail==11) { bqueue.head=bqueue.head; } findCod(); recMarkdCod(markdCod,&markdCodNum); if(bqueue.bNode[bqueue.head].stat==0) { addNodeToQueue(); takeToClose(bqueue.bNode[bqueue.head].codXuh,bqueue.tail-1); } bqueue.head++; if(bqueue.head==bqueue.tail) { if(close.head!=close.tail) { takeTobqueue(close.head); } } } fitDegree=workFitDegree(markdCod,markdCodNum); if(fitDegree>1e-5) { if(StillCodNoUseAndContradict(i+codnum)) { printf("它不是%s。\n",goal[i].valu); }
四、实验结果
1. 要求有实验运行结果截图,以及必要的说明; (1)有若干选择动物特征的选择列表;
(2)输入特征后,询问使用索成功找到目标后,程序显示该动物名称,否则“显示条件不足无法判 断” 。
(4)逆向搜索结果:
2. 对所实现的产生式系统进行性能分析。 在数据量小的情况下识别速度较快。但是我觉得这种识别用处不够广泛。所有的规 则必须人工输入不够灵活,不能适应突发状况(如白虎) 。
int fitPart;//1:有部分符合条件 int i,j,k; flag=0; flagCNew=1; while(!flag&&flagCNew==1) { flagCNew=0; for(j=0;j<rulenum&&rule[j].used!=1&&flag==0;j++)//一条规则 { if(rule[j].codNum<=inpCod.curnum)//事实数不小于当前规则所要求的 条件数 { flagFit=1; for(i=0;i<rule[j].codNum&&flagFit==1;i++) { fitPart=0; for(k=0;k<inpCod.curnum;k++) { if(rule[j].cod[i]==inpCod.cod[k].xuh) { fitPart=1; } } flagFit=fitPart; } if(flagFit==1) { flagCNew=1; fitOneRule(j,&flag);//有事实匹配时, 就处理把结论加入事实 库等事情 flagFit=0; } } }// }//while if(flagCNew==0) { printf("条件不足,不能推出它是什么动物"); } } 逆向搜索 反向推理比正向推理要复杂一些。采用的算法是从事实库的动物开始从前往后进行匹 配,看是否能成功推出,如果都推不出能识别失败,若能推出其中一个则中止搜索,识别成
人工智能第二次实验报告
产生式系统推理
班级: 一、实验目的
1. 理解并掌握产生式系统的基本原理; 2. 掌握产生式系统的组成部分,以及正向推理和逆向推理过程。
姓名:
学号:
二、实验要求
1. 结合课本内容, 以动物识别系统为例,实现小型产生式系统; 2. 要求: 正向推理中能根据输入的初始事实, 正确地识别所能识别的动物; 逆向推理中 能根据所给的动物给出动物的特征。
else { bDisplayResult(fitDegree,i,&flagFitAll); } } else { printf("它不是%s。\n",goal[i].valu); } if(flagFitAll==1) { flagExistAns=1; } }//for if(flagExistAns==0) { printf("综上所述:没有完全符合这些特征的动物。\n"); } }//backFinger()
三、实验算法
1. 如何表示事实和特征的知识; 在本程序中,我将动物的特征写入 data.txt,将规则记入 rules.txt,将动物 种类记为 goal.txt。
通过函数 void readFiles() { readGoal(); readCod(); readRule(); }读入所有数据分别存放于 goal[],rule[],cod[]自定义数组中。 2. 指出综合数据库和规则库分别使用哪些函数实现的? 综合数据库(包括特征和目标) typedef struct { int xuh;//存放编号 char valu[50];//存放具体内容 }Node; Node goal[20]; Node cod[50];
i++; } rulenum=i; fclose(fp); } 3. 规则库的匹配算法是什么?如何选用可用规则集中的规则?分别使用哪些函数实现 的? 程序中的正向与逆向搜索分别是在 void main() 中调用 forwardFinger() 和 backFinger() 来 实现的。 正向搜索 从下向上的推理。由于建立规则库时的内在要求,即子规则必在父规则前,故进行正向 推理的时候只要将规则库从前到后扫一遍看是否能由规则推出相应结果即可。 如果能匹配推 出结果则看该结果是否为动物,如果已经推出动物则推理成功。否则更新事实库,匹配下一 个规则。代码如下: void forwardFinger() { int flag;//1:工作已完成 0:还未完成 int flagFit; int flagCNew;//记录本次循环有没有推出新事实
规则库 typedef struct { int rslt; int codNum;//记载前提的个数 int cod[10];//记载前提的序号 int used;//记载是否已匹配成功 }Nrule; Nrule rule[50]; void readRule() { FILE *fp; int i; int tempxuh,tempcodn; char ch; if((fp=fopen("rules.txt","r"))==NULL) { printf("cannot open data\n"); exit(0); } i=0; rule[i].codNum=0; while((ch=fgetc(fp))!=EOF) { if(i==14) i=i; tempcodn=0; while(ch!='\n'&&ch!=EOF) //每一条规则 { tempxuh=0; while(ch<='9'&&ch>='0') { tempxuh=tempxuh*10+ch-'0';
五、实验总结及体会
虽然还没有具体学习过产生式算法, 但是通过本次实践, 对正向推理反向推理的过程可 以说已经有了大概的了解喝一些自己的看法, 对代码的控制能力也有了一定的提高, 递归函 数的设计,流程的控制都得到了一定的强化。我觉得本次实验的算法还是比较简单的,关键 是数据结构的设计, 我运用了很多自定义的结构体想使程序显得简单一些, 但是效果并不好, 别人很难分清那些结构体,太多了。 。 。 。 。