动物识别系统.docx
《动物识别系统.docx》由会员分享,可在线阅读,更多相关《动物识别系统.docx(27页珍藏版)》请在冰豆网上搜索。
动物识别系统
学生实验报告
实验课名称:
人工智能
实验项目名称:
产生式系统实验
专业名称:
计算机科学与技术
班级:
2012240201
学号:
12
学生姓名:
雷彬
教师姓名:
陈亮亮
2014年12月10日
实验日期:
2012年_J2_月J0_日实验室名称:
明远2202
1.实验名称:
产生式系统实验
2.实验目的与要求:
1、确定推理方法(正向还是反向),并根据问题设计实现一个简单的不通用推理机(匹配、冲突消解)
2、规则库要求至少包含15条规则
3、初始事实可以任意给定,输入初始事实后能够得到推理结果
4、设计人机界面,解释模块提供查询规则的功能
5、可以不考虑知识库管理模块
6提交实验报告
7、报告中要有推理树
3.实验内容:
动物识别专家系统是流行的专家系统实验模型,它用产生式规则来表示知识,共15条规则、可以识别七种动物,这些规则既少又简单,可以改造他们,也可以加进新的规则,还可以用来识别其他东西的新规则来取代这些规则。
四.算法描述:
动物识别的15条规则:
规则
1:
如果:
动物有毛发
则:
该动物是哺乳动物
规则
2:
如果:
动物能产奶
则:
该单位是哺乳动物
规则
3:
如果:
该动物有羽毛
则:
该动物是鸟
规则
4:
如果:
动物会飞,且会下蛋
则:
该动物是鸟
规则
5:
如果:
动物吃肉
则:
该动物是肉食动物
规则
6:
如果:
动物有犬齿,且有爪,
且眼盯前方贝该动物是食肉动物
规则
7:
如果:
动物是哺乳动物,
且有蹄
则:
该动物是有蹄动物
规则
8:
如果:
动物是哺乳动物,
且是反刍动物
则:
该动物是有蹄动物
规则
9:
规则
规则
规则
规则
规则
规则
如果:
贝该动物是豹
10:
如果:
动物是黄褐色的,贝该动物是虎
11:
如果:
动物有暗斑点,且有长腿,且有长脖子,且是有蹄类贝该动物是长颈鹿
12:
如果:
动物有黑条纹,且是有蹄类动物贝该动物是斑马
13:
如果:
动物有长腿,且有长脖子,且是黑色的,且是鸟,且不会飞贝该动物是鸵鸟
14:
如果:
动物是鸟,且不会飞,且会游泳,且是黑色的贝该动物是企鹅
15:
如果:
动物是鸟,且善飞则:
该动物是信天翁
动物是哺乳动物,
且是食肉动物,
且是黄褐色的,且有暗斑点
且是哺乳动物,且是食肉,且有黑条纹
首先给定初始事实,将初始事实放入动态数组中,并用初始事实与15条规则进行匹配,如果规则匹配成功,将规则的后件存入数组中,再用数组中所有的元素与规则进行匹配,满足即加入数组,直到匹配出动物。
如果给定初始事实能推出多种动物,按照数组中条件的先后顺序,顺序循环匹配规则,先匹配出哪种动物就显示该动物。
5.源程序:
//MFC_AnimalDlg.cpp:
实现文件
#include
"stdafx.h"
#include
"MFC_Animal.h"
#include
"MFC_AnimalDlg.h"
#include"afxdialogex.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//用于应用程序“关于”菜单项的CAboutDlg对话框
classCAboutDlg:
publicCDialogEx
{
public:
CAboutDlg。
;
//对话框数据
enum{IDD=IDD_ABOUTBC}X
protected:
virtualvoidDoDataExchange(CDataExchang@pDX);//DDX/DDV支持
//实现
protected:
DECLAREMESSAGE)MAP
};
CAboutDlg:
:
CAboutDlg():
CDialogEx(CAboutDlg:
:
IDD)
{
}voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialogEx:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MCPboutDlg,CDialogEx)END_MESSAGE_MAP
//CMFC_AnimalDlg对话框
CMFC_AnimalDlg:
CMFC_AnimalDlg(CWndpParent/*=NULL*/)|:
CDialogEx(CMFC_AnimalDlg:
IDD,pParent)
{
mhlcon=AfxGetApp()->LoadIcon(IDRMAINFRAME
}
voidCMFC_AnimalDlg:
DoDataExchange(CDataExchange*pDX)
{
CDialogEx:
:
DoDataExchange(pDX);
DDXControl(pDX,IDCCOMBOmpoint1);
DDXControl(pDXIDCCOMBOmpoint2);
DDX_Control(pDXIDC_COMBOm_point3);
DDX_Control(pDXIDC_COMBOm_point4);
DDX_Control(pDXIDC_COMBOm_point5);
DDXControl(pDXIDCCOMBOmpoint6);
DDX_Control(pDXIDC_COMBOm_point7);
}
BEGIN_MESSAGE_MAPFC_AnimalDlgCDialogEx)
ON_WM_SYSCOMMAND
ON_WM_PAINT
ON_WM_QUERYDRAG)CON
ONBNCLICKEIDCBUTTON2CMFCAnimalDlg:
OnClickedButton2)ON_BN_CLICKEIDC_BUTTON&CMFC_AnimalDlg:
OnClickedButton1)END_MESSAGE_MAP
//CMFCAnimalDlg消息处理程序BOOLCMFC_AnimalDlg:
OnlnitDialog(){
CDialogEx:
:
OnlnitDialog();
//将“关于…”菜单项添加到系统菜单中。
//IDM_ABOUTBOX必须在系统命令范围内。
ASSERTIDM_ABOUTBOX3xFFFO)==IDM_ABOUTBOXASSER(HDM_ABOUTBOX)xFOOO);
CMenUpSysMenu=GetSystemMenu(FALSE;if(pSysMenu!
=NULL
{
ASSER(bNameValid);
if(!
strAboutMenu.lsEmpty())
{
pSysMenu->AppendMenuMF_SEPARATOR
pSysMenu->AppendMenuMF_STRIN,GIDM_ABOUTBOXrAboutMenu);
}
}
//设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动
//执行此操作
SetIcon(mhlcon,TRUE//设置大图标
SetIcon(m_hlcon,FALSE;//设置小图标
//TODO:
在此添加额外的初始化代码
m_point1.SetCurSel(0);
//设置组合框的默认值为第一项
m_point2.SetCurSel(0);
m_point3.SetCurSel(0);
m_point4.SetCurSel(0);
mpoint5.SetCurSel(0);
mpoint6.SetCurSel(0);
mpoint7.SetCurSel(0);
returnTRUE〃除非将焦点设置到控件,否则返回TRUE
}
voidCMFC_AnimalDlg:
OnSysCommandUINTnID,LPARAMParam)if((nID&0xFFF0)==IDM_ABOUTBpX
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx:
:
OnSysCommand(ilD,IParam);
}
}
//如果向对话框添加最小化按钮,则需要下面的代码
//来绘制该图标。
对于使用文档/视图模型的MFC应用程序,
//这将由框架自动完成。
voidCMFCAnimalDlg:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//用于绘制的设备上下文
SendMessageWM」CONERASEBKGtemterpret_cast//使图标在工作区矩形中居中
intcxlcon=GetSystemMetrics(
smcxicon
intcylcon=GetSystemMetrics(
SM_CYICON
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;inty=(rect.Height()-cylcon+1)/2;
//绘制图标
dc.DrawIcon(x,y,mhlcon);
}
else
{
CDialogEx:
:
OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标//显示。
HCURSORMFC_AnimalDlg:
OnQueryDraglcon(){
returnstatic_cast}
voidCMFC_AnimalDlg:
OnClickedButton2()
{
//TODO:
在此添加控件通知处理程序代码
((CListBox*)GetDlgltem(IDC_LIST1))->ResetContent();inti,j,n;
intflag=1;
boolcheck=true;
CStringmsg;
CStringpoint[7];
CStringFact[10];
intk=-1;
mpoint1.GetWindowText(point[0]);
m_point2.GetWindowText(point[1]);
mpoint3.GetWindowText(point[2]);
mpoint4.GetWindowText(point[3]);
m_point5.GetWindowText(point[4]);
mpoint6.GetWindowText(point[5]);m_point7.GetWindowText(point[6]);
|for(i=0;i<=5;i++)
{
if(point[i]!
="无")
{
|for(j=i+1;j<=6;j++)
匚{
if(point[i]==point[j])
{check=false;
}丨
|}I
}
}
if(check==false)
{
MessageBoXL"特征不能一样!
");
//初始事实放入综合数据库中
}else{
for(i=0;i<=6;i++)
"无")
if(point[i]!
={
k++;
Fact[k]=point[i];
IDC_LIST1))->InsertString(k,point[i]);
((CListBox*)GetDlgltem(
}
〃R1
if(Fact[i]=="有毛发"){
msg="哺乳动物“;
((CListBox*)GetDlgItem(IDC_LIST1))->InsertString(k+1,msg);k++;
Fact[k]=msg;
}
}
if(Fact[i]=="有奶")
{
msg="哺乳动物“;
((CListBox*)GetDlgItem(IDC_LIST1))->InsertString(k+1,msg);k++;
Fact[k]=msg;
}丨
|}I
}
//Sleep(IOOO);
for(i=0;i<=k;i++)〃R3
{
if(Fact[i]=="有羽毛")
{
msg="鸟";
((CListBox*)GetDlgItem(IDCLIST1))->InsertString(k+1,msg);
k++;
Fact[k]=msg;
}
"鸟")〃R4
for(i=0;i<=k;i++){
if(Fact[i]=="会飞")
if(n==2)
{
msg="鸟";
((CListBox*)GetDlgltem(IDCLIST1))->InsertString(k+1,msg);
k++;
Fact[k]=msg;
}
if(Fact[i]=="吃肉")
{
msg="食肉动物";
((CListBox*)GetDlgItem(IDCLIST1))->InsertString(k+1,msg);
k++;
Fact[k]=msg;
}
n=0;
if(Fact[k]!
="食肉动物“)〃R6
{
for(i=0;i<=k;i++)
{
if(Fact[i]==“有犬齿“)
if(n==3)
{
msg="食肉动物”;
((CListBox*)GetDlgltem(IDC_LIST1))->InsertString(k+1,msg);
k++;
Fact[k]=msg;
}
}
for(j=O;j<=k;j++)〃R7
{
if(Fact[j]=="哺乳动物")
{
for(i=0;i<=k;i++)
I~~!
{
if(Fact[i]=="有蹄")
{I
msg="有蹄动物";
((CListBox*)GetDlgItem(IDCLIST1))->InsertString(k+1,msg);k++;
Fact[k]=msg;
|}I
}丨
}
if(Fact[k]!
="有蹄动物")〃R8
{
for(j=0;j<=k;j++)
{
if(Fact[j]=="哺乳动物“)
for(i=0;i<=k;i++)
{
if(Fact[i]=="反刍动物")
{
msg="有蹄动物";
((CListBox*)GetDlgltem(IDC_LIST1))->InsertString(k+1,msg);
k++;
Fact[k]=msg;
}
}
}
}
}
n=0;
for(j=O;j<=k;j++)〃R9
{
if(Fact[j]=="哺乳动物")
{
for(i=0;i<=k;i++)
if(n==3)
{
msg="金钱豹";
((CListBox*)GetDlgItem(IDC_LIST1))->InsertString(k+1,msg);
Fact[k]=msg;
SetDlgItemText(IDCEDIT2,msg);
CStatic*cwm=(CStatic*)GetDlgltem(IDCSHOWBITMAP
for(i=0;i<=k;i++)〃R10
{
if(Fact[i]=="哺乳动物")
{
n++;
}
if(Fact[i]=="食肉动物")
{
n++;
}
if(Fact[i]=="黄褐色")
{
n++;
}
if(Fact[i]=="有黑色条纹")
{
n++;
}
}
if(n==4)
((CListBox*)GetDlgltem(IDC_LIST1))->InsertString(k+1,msg);Fact[k]=msg;
SetDlgItemText(IDC_EDIT2,msg);
CStatic*cwm=(CStatic*)GetDlgItem(IDCSHOWBITMAPCBitmapbmpload;
bmpload.LoadBitmap(IDB_BITMAP2cwm->ModifyStyle(O,SS_BITMAPcwm->SetBitmap(HBITMA(bmpload.Detach()));
}n=0;
for(i=0;i<=k;i++)〃R11
{
if(Fact[i]=="有蹄动物")
if(n==4)
{
msg="长颈鹿";
((CListBox*)GetDlgltem(IDCLIST1))->InsertString(k+1,msg);
Fact[k]=msg;
SetDlgItemText
(IDC_EDIT2msg);
CStatic*cwm=(CStatic*)GetDlgItem(IDCSHOWBITMAP
CBitmapbmpload;
bmpload.LoadBitmap(IDB_BITMAP3cwm->ModifyStyle(O,SSBITMAPcwm->SetBitmap(HBITMA(bmpload.Detach()));
}n=0;
for(i=0;i<=k;i++)〃R12
{
if(Fact[i]=="有蹄动物")
}
msg="斑马";
((CListBox*)GetDlgltem(IDC_LIST1))->InsertString(k+1,msg);
Fact[k]=msg;
SetDlgItemText(IDC_EDIT2,msg);
CStatic*cwm=(CStatic*)GetDlgItem(IDCSHOWBITMAP
CBitmapbmpload;
}
n=0;
for(i=0;i<=k;i++)〃R13
{
if(Fact[i]=="鸟")
msg="鸵鸟((CListBox*)GetDlgltem(IDC_LIST1))->InsertString(k+1,msg);Fact[k]=msg;
SetDlgItemText(IDC_EDIT2,msg);
CStatic*cwm=(CStatic*)GetDlgItem(IDCSHOWBITMAP
CBitmapbmpload;
bmpload.LoadBitmap(IDB_BITMAP5cwm->ModifyStyle(O,SSBITMAPcwm->SetBitmap(HBITMA(bmpload.Detach()));
}
n=0;
for(i=0;i<=k;i++)〃R14
{
if(Fact[i]=="鸟")
{
n++;
}
if(Fact[i]=="不会飞")
{
n++;
}
if(Fact[i]=="黑白二色")
{
n++;
}
if(Fact[i]=="会游泳")
{
n++;
|}I
}
if(n==4)
{
msg="企鹅";
((CListBox*)GetDlgItem(IDC_LIST1))->InsertString(k+1,msg);
Fact[k]=msg;
SetDlgItemText(IDC_EDIT2,msg);
CStatic*cwm=(CStatic*)GetDlgItem(IDCSHOWBITMAPCBitmapbmpload;
bmpload.LoadBitmap(IDB_BITMAP6cwm->ModifyStyle(0,SSBITMAPcwm->SetBitmap(HBITMA(bmpload.Detach()));
n=0;
for(i=0;i<=k;i++)〃R15
{
if(Fact[i]=="鸟")
{
n++;
}
if(Fact[i]=="善飞")
{
n++;
}
((CListBox*)GetDlgltem(IDC_LIST1))->InsertString(k+1,msg);Fact[k]=msg;
SetDlgItemText(IDC_EDIT2,msg);
CStatic*cwm=(CStatic*)GetDlgItem(IDCSHOWBITMAPCBitmapbmpload;
bmpload.LoadBitmap(IDB_BITMAP7;cwm->ModifyStyle(O,SSBITMAPcwm->SetBitmap(HBITMA(bmpload.Detach()));
}
}
}
voidCMFC_AnimalDlg:
OnClickedButton1()
{
//TODO:
在此添加控件通知处理程序代码
mpoint1.SetCurSel(0);//设置组合框的默认值为第一项
mpoint2.SetCurSel(0);
m_point3.SetCurSel(0);
mpoint4.SetCurSel(0);
mpoint5.SetCurSel(0);
m_point6.SetCurSel(0);
mpoint7.SetCurSel(0);
CStringstr=NULL
SetDlgItemText(IDC_EDIT2str);
//GetDlgItem(IDCSHOWBITMAP)->SetWindowText(NULL);
((CListBox*)GetDlgItem(IDCLIST1))->ResetContent();
CStatic*cwm=(CStatic*)GetDlgltem(IDCSHOWBITM)AP
CBitmapbmpload;
bmpload.LoadBitmap(IDB_BITMAP8;cwm->ModifyStyle(0,SS_BITMAPcwm->SetBitmap(HBITMA(bmpload.Detach()));
}
6.
运行结果与分析:
动物识别系统
当只输入某个动物的特征时,动态数据库就只会显示与该动物有关的特征,若是给定事实中既包含了鸟类特征,还包含哺乳类特征时,动态数据库就会显