专家系统(动物识别)
此项目为一个小型的专家系统,根据动物的特征进行动物识别。
程序思想
- 初始化综合数据库(事实库)和规则库。
- 显示综合库并输入条件。
接下来是正向推理 - 检测规则库中是否有与事实相匹配的规则,若有,则执行4,否则执行5。
- 更新综合数据库,即添加步骤3所检测到与综合数据库匹配的规则,并将所有规则做标记,接着执行5。
- 验证综合数据库是否包含解,若有,则终止求解过程,否则转3,继续检测规则库是否有事实相匹配规则。
- 若规则库中不再提供更多的所需信息,则问题求解失败,否则更新综合数据库,转3。
源代码
// professiorsystem.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
//存放推理规则的结构体
typedef struct{
int codition[5];
int name;
}Rule;
//初始化综合数据库
char *feature[]={"有毛","有奶","有羽毛","会飞","会下蛋","吃肉","有犬齿",//0,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
//规则库
Rule rule[15]={
{{0,-1},20},//1
{{1,-1},20},//2
{{2,-1},21},//3
{{3,4,-1},21},//4
{{5,-1},22},//5
{{6,7,8,-1},22},//6
{{20,9,-1},23},//7
{{20,10,-1},23},//8
{{20,5,11,12,-1},30},//9
{{20,5,11,13,-1},29},//10
{{23,14,15,12,-1},28},//11
{{23,13,-1},27},//12
{{21,14,15,16,-1},26},//13
{{21,17,16,18,-1},24},//14
{{21,19,-1},25}//15
};
int flag[23]={0};//标记各个特征是否被选择
void menu();
int isAnimal(int a);
void input();
int inference();
//菜单
void menu(){
for(int i=0;i<=30;i++){
if(i%4==0&&i!=0)
cout<<endl;
printf("%-3d.%-15s",i,feature[i]);
}
}
//判断是否是动物
int isAnimal(int a){
if(a>=24&&a<=30)
return 1;
else
return 0;
}
//输入函数
void input()
{
int ti=0;
for(int i=0;i<24;i++)
{
flag[i]=0;
}
cout<<"\n输入选择,-1结束:";
while(ti!=-1)
{
cin>>ti;
if(ti>=0&&ti<=23)
flag[ti]=1;
else if(ti!=-1)
{
cout<<"请输入0-24之间的数字"<<endl;
cin.clear();
cin.sync();
}
}
}
//正向推理
int inference()
{
int ti;
int i,j;
int tres;
cout<<endl;
for(i=0;i<15;i++)
{
j=0;
ti=rule[i].codition[j];
while(ti!=-1)
{
if(flag[ti]==0)//如果这个条件没有被选择直接跳出循环
break;
j++;
ti=rule[i].codition[j];
}
if(ti==-1)//如果满足规则库
{
tres=rule[i].name;//标记推理的结果
flag[tres]=1;//把推理出的结果作为条件加入规则库
printf("运用了规则%d:",i);
j=0;
while(rule[i].codition[j]!=-1){//
cout<<feature[rule[i].codition[j]]<<" ";
j++;
}
cout<<"====>"<<feature[tres]<<endl;
if(isAnimal(tres)){//判断是否得出解,若是,结束。若不是,继续执行循环体
return 1;
}
}
}
if(i==15)
printf("没有这种动物");
return -1;
}
int main()
{
char x;
cin>>x;
while(x!='n')
{
menu();
input();
inference();
cout<<"\n继续?(Y/N)"<<endl;
cin>>x;
system("cls");
}
return 0;
}