动物识别专家系统

专家系统(动物识别)

此项目为一个小型的专家系统,根据动物的特征进行动物识别。
在这里插入图片描述

程序思想

  1. 初始化综合数据库(事实库)和规则库。
  2. 显示综合库并输入条件。
    接下来是正向推理
  3. 检测规则库中是否有与事实相匹配的规则,若有,则执行4,否则执行5。
  4. 更新综合数据库,即添加步骤3所检测到与综合数据库匹配的规则,并将所有规则做标记,接着执行5。
  5. 验证综合数据库是否包含解,若有,则终止求解过程,否则转3,继续检测规则库是否有事实相匹配规则。
  6. 若规则库中不再提供更多的所需信息,则问题求解失败,否则更新综合数据库,转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;
}


运行结果

在这里插入图片描述

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值