您的当前位置:首页正文

重庆大学人工智能作业(动物识别系统)

2021-09-13 来源:好走旅游网
人工智能及其应用作业 姓名: 学号:

一、作业题目:设计一个动物识别系统,运用产生式系统的思想,设在综合数据库中存

放下列已知事实:该动物身上有暗斑点,长脖子,长腿,奶,蹄,这些事实与规则库中的知识从第一条开始匹配,最终得出该动物是长颈鹿。

二、程序设计分析:根据产生式系统的原理,该系统一般由规则库、综合数据库、控制

系统三部分构成。先定义规则库结构体,里面包括Condition[6][20],result[20]和规则数Cnum,再定义综合数据库即事实库,里面包括item[20][20],和事实数Fnum,主要用到的参数就是这些。然后初始化规则库和综合数据库,编辑规则库。之后就是主程序,也就是推理机的作用:先让用户输入事实,然后与规则库中的知识从第一条开始逐条匹配,当匹配成功时,将结论插入事实库并更新事实库,再逐条匹配,依次循环..最终如果能匹配成功就显示‘该动物是..’,否则显示‘无法识别该动物’,程序结束。

三、程序流程图如下图:

开始规则库、事实库初始化输入动物特性是否与规则库知识匹配NY特性与规则不匹配更新事实库得出结论结束 图一、系统程序流程图

四、我的源程序如下:

#include \"iostream.h\" #include \"stdio.h\" #include \"conio.h\" #include \"string.h\"

typedef struct Rule//定义规则库 {

char Condition[6][20]; char Result[20]; int Cnum; bool used; }rule;

typedef struct Fact//定义综合数据库 {

char item[20][20]; int Fnum; }fact;

rule r[100]; fact f;

void Create_Rules();//初始化规则库 void Create_Facts();//初始化综合数据库 int Get_RulesNum(); void Ratiocinate(int n);

void main() {

int Rnum=0; Create_Rules(); Create_Facts();

Rnum=Get_RulesNum(); //cout<void Create_Rules() {

strcpy(r[0].Condition[0],\"有毛发\"); strcpy(r[0].Result,\"哺乳动物\"); r[0].Cnum=1;

r[0].used=false;

strcpy(r[1].Condition[0],\"奶\"); strcpy(r[1].Result,\"哺乳动物\"); r[1].Cnum=1; r[1].used=false;

strcpy(r[2].Condition[0],\"有羽毛\"); strcpy(r[2].Result,\"鸟\"); r[2].Cnum=1; r[2].used=false;

strcpy(r[3].Condition[0],\"会飞\"); strcpy(r[3].Condition[1],\"会下蛋\"); strcpy(r[3].Result,\"鸟\"); r[3].Cnum=2; r[3].used=false;

strcpy(r[4].Condition[0],\"吃肉\"); strcpy(r[4].Result,\"食肉动物\"); r[4].Cnum=1; r[4].used=false;

strcpy(r[5].Condition[0],\"有犬齿\"); strcpy(r[5].Condition[1],\"有爪\"); strcpy(r[5].Condition[2],\"眼盯前方\"); strcpy(r[5].Result,\"食肉动物\"); r[5].Cnum=3; r[5].used=false;

strcpy(r[6].Condition[0],\"哺乳动物\"); strcpy(r[6].Condition[1],\"蹄\"); strcpy(r[6].Result,\"有蹄动物\"); r[6].Cnum=2; r[6].used=false;

strcpy(r[7].Condition[0],\"有蹄动物\"); strcpy(r[7].Condition[1],\"嚼反刍动物\"); strcpy(r[7].Result,\"有蹄动物\"); r[7].Cnum=2; r[7].used=false;

strcpy(r[8].Condition[0],\"哺乳动物\"); strcpy(r[8].Condition[1],\"食肉动物\");

strcpy(r[8].Condition[2],\"黄褐色\");

strcpy(r[8].Condition[3],\"身上有暗斑点\"); strcpy(r[8].Result,\"金钱豹\"); r[8].Cnum=4; r[8].used=false;

strcpy(r[9].Condition[0],\"哺乳动物\"); strcpy(r[9].Condition[1],\"食肉动物\"); strcpy(r[9].Condition[2],\"黄褐色\"); strcpy(r[9].Condition[3],\"有黑色条纹\"); strcpy(r[9].Result,\"虎\"); r[9].Cnum=4; r[9].used=false;

strcpy(r[10].Condition[0],\"有蹄动物\"); strcpy(r[10].Condition[1],\"长腿\"); strcpy(r[10].Condition[2],\"长脖子\");

strcpy(r[10].Condition[3],\"身上有暗斑点\"); strcpy(r[10].Result,\"长颈鹿\"); r[10].Cnum=4; r[10].used=false;

strcpy(r[11].Condition[0],\"有蹄类动物\"); strcpy(r[11].Condition[1],\"身上有黑色条纹\"); strcpy(r[11].Result,\"斑马\"); r[11].Cnum=2; r[11].used=false;

strcpy(r[12].Condition[0],\"鸟\");

strcpy(r[12].Condition[1],\"有长脖子\"); strcpy(r[12].Condition[2],\"长腿\"); strcpy(r[12].Condition[3],\"不会飞\"); strcpy(r[12].Condition[4],\"有黑白两色\"); strcpy(r[12].Result,\"鸵鸟\"); r[12].Cnum=5; r[12].used=false;

strcpy(r[13].Condition[0],\"鸟\"); strcpy(r[13].Condition[1],\"会游泳\"); strcpy(r[13].Condition[2],\"不会飞\"); strcpy(r[13].Condition[3],\"有黑白两色\"); strcpy(r[13].Result,\"企鹅\"); r[13].Cnum=4; r[13].used=false;

strcpy(r[14].Condition[0],\"鸟\"); strcpy(r[14].Condition[1],\"善飞\"); strcpy(r[14].Result,\"海燕\"); r[14].Cnum=2; r[14].used=false; }

void Create_Facts() {

printf(\"请输入该动物特性(中间加空格,Enter键结束)\\n\");

scanf(\"%s%s%s%s%s\ f.Fnum=5; }

int Get_RulesNum() {

int num=0; int i=0; while(1) {

if(r[i].Condition[0][0]=='\\0') {

break; }

i++; num++; }

return num; }

void Ratiocinate(int n) {

bool FindFact(char * str);

void InsertIntoFact(char * str);

int i=0,j;/// i用来控制查找的是第几条规则,j用来控制查找的规则中的第几条 while(1) {

if(r[i].used==false) {

for(j=0;jif(FindFact(r[i].Condition[j]))

{

continue; } else {

cout<<\"规则\"<if(j==r[i].Cnum) ///如果所有的前件都满足 {

r[i].used=true;

cout<<\"规则\"<InsertIntoFact(r[i].Result);///插入事实

cout<<\"新增加的事实为:\"<i=0; //continue; }

else i++;//查看下条规则 if(i==n) {

cout<<\"没有你要找符合要求的动物,请增加新的规则\"<else if(strcmp(f.item[f.Fnum-1],\"老虎\")==0||strcmp(f.item[f.Fnum-1],\"金钱豹\")==0||strcmp(f.item[f.Fnum-1],\"长颈鹿\")==0||strcmp(f.item[f.Fnum-1],\"斑马\")==0||strcmp(f.item[f.Fnum-1],\"鸵鸟\")==0||strcmp(f.item[f.Fnum-1],\"企鹅\")==0||strcmp(f.item[f.Fnum-1],\"海燕\")==0) {

cout<<\"与你给的事实匹配的动物:\"<//查看综合数据库中的事实否否等于前件,或者是存在这条事实,那么新的结论就不用加到综合数据库中

bool FindFact(char * str) {

int i;

for(i=0;iif(strcmp(f.item[i],str)) continue; else return true; }

return false; }

//插入新的事实

void InsertIntoFact(char * str) {

strcpy(f.item[f.Fnum],str); f.Fnum++; }

五、程序运行结果:

因篇幅问题不能全部显示,请点此查看更多更全内容