当前位置:文档之家› 人工智能-动物识别

人工智能-动物识别

动物识别系统#include <iostream>#include <string>using namespace std;struct RULES //规则结构{int count;char pre[255];char back[255];int mark;};RULES r[16]={ {1,"有毛发","哺乳动物",0}, //所有规则静态数据库{1,"有奶","哺乳动物",0},{1,"有羽毛","鸟",0},{2,"会飞&下蛋&","鸟",0},{1,"吃肉","食肉动物",0},{3,"有犬齿&有爪&眼盯前方&","食肉动物",0},{2,"哺乳动物&有蹄&","有蹄类动物",0},{2,"哺乳动物&反刍&","有蹄类动物",0},{4,"哺乳动物&食肉动物&黄褐色&暗斑点&","金钱豹",0},{4,"哺乳动物&食肉动物&黄褐色&黑色条纹&","老虎",0},{4,"有蹄类动物&长脖子&长腿&暗斑点&","长颈鹿",0},{2,"有蹄类动物&黑条纹&","斑马",0},{5,"鸟&不会飞&长脖子&长腿&黑白色&","鸵鸟",0},{4,"鸟&不会飞&会游泳&黑白色&","企鹅",0},{2,"鸟&善飞&","信天翁",0},};int length; //输入的事实长度string f[255]; //输入的事实数组int find_rule(int s) //查找规则库中是否还有可使用的规则{for(int i=0;i<=15;i++)s=s*r[i].mark;//cout<<"find_rule结果"<<s<<endl;return s;}int compare1(RULES r) //当前提条件为1时{int j=0,i=1;string str,str2;str=r.pre;while(i<=length){if(f[i]==str){str2=r.back;f[length+1]=str2; //加入事实库length++; //事实库的长度加1r.mark=1; //标记规则已使用过break;}elsei++;}return r.mark;}int compare2(RULES r) //前提条件不为1 {string b[10];string str,str2;int i, j = 1, num = 0;int a=0;str=r.pre;for (i=0; i != 10; ++i) //转换数组{b[i] = "";}for (i = 0; i != str.length(); ++i){if (str.at(i) != '&'){b[j] += str.at(i);}else{j++;}}i=1;while(i <= r.count){for (j =1;j != length+1; j++){if(f[j]==b[i]){a+=1;}}i++;}if(a==r.count){str2=r.back;f[length+1]=str2; //加入事实库length++; //事实库的长度加1r.mark=1; //标记规则已使用过}return r.mark;}void result(){int i=1,m=0;while(i!=length+1){if(f[i]=="金钱豹"){cout<<"该动物是金钱豹"<<endl;m=1;break;}elseif(f[i]=="老虎"){cout<<"该动物是老虎"<<endl;m=1;break;}elseif(f[i]=="长颈鹿"){cout<<"该动物是长颈鹿"<<endl;m=1;break;}elseif(f[i]=="斑马"){cout<<"该动物是斑马"<<endl;m=1;break;}elseif(f[i]=="鸵鸟"){cout<<"该动物是鸵鸟"<<endl;m=1;break;}elseif(f[i]=="企鹅"){cout<<"该动物是企鹅"<<endl;m=1;break;}elseif(f[i]=="信天翁"){cout<<"该动物是信天翁"<<endl;m=1;break;}elsei++;}if(m==0)cout<<"没有符合的动物,请确认特征,重新输入"<<endl;}void idetify(){int i=0,u=0;if(find_rule(u)==0) //如果规则库中还有未使用的规则{//cout<<"还有未使用的规则"<<endl;int num=length;while(i<16) //从第一条规则开始遍历{if(r[i].mark==0) //如果该条规则未使用{if(r[i].count==1) //该条规则前提数为1{u=compare1(r[i]);if(u==1)r[i].mark=1;if(r[i].mark==1){cout<<"使用规则"<<i+1;cout<<"且加入的新事实为"<<r[i].back<<endl;}}else{u=compare2(r[i]);if(u==1)r[i].mark=1;if(r[i].mark==1){cout<<"使用规则"<<i+1;cout<<"且加入的新事实为"<<r[i].back<<endl;}}}if(i==15){if(num!=length){i=0;num=length;}elsei=16;}else{i++;}}}else{cout<<"所有的规则都已使用"<<endl;}result();}void main(){int u=0;cout<<"请输入动物的特征数"<<endl;cin>>length;cout<<"请输入动物的特征"<<endl;for(int i=1;i<=length;i++)cin >> f[i];idetify();}Identify函数是为了实现根据规则的前提条件数的不同选择不同的函数来判断事实和前提条件是否匹配。

其结束的出口有两个:一是当所有的规则都使用过,规则库中没有可以使用的规则时,判断结束;二是虽然规则库中还有未使用的规则,但是已经和事实不匹配,即无法使用该规则,则退出,这里我使用了检查事实库是否更新来判断是否还有与事实库匹配的规则。

C ompare1函数用来判断前提条件中条件数为一个的规则,用事实库中的事实逐个与前提条件中的条件对比,若匹配,则规则可用,若不匹配,则不可用。

C ompare2函数是用来判断当规则的前提条件有多个时,这多个条件是否和事实库中的所有事实匹配,由此得出该规则是否可用。

提取规则库前提条件的第一条,用事实库中的所有事实与它匹配,若两者相同,则将设定的记录前提条件满足的变量加1,然后,在用同样的方法来查看事实库中是否有第二条前提条件,直到所有的前提条件都查看完毕截止。

根据前提条件满足的变量是否等于该规则的前提条件数来判断该规则是否可用。

Compare1和compare2均返回最终的判断结果,即:若判断出来当前规则可用,则将规则的标记改为已使用,返回到idetify函数中后根据compare1和compare2的返回值来输出规则的使用情况,并且由此继续判断规则库中是否还有规则可用。

相关主题