人工智能实验报告大全.docx
《人工智能实验报告大全.docx》由会员分享,可在线阅读,更多相关《人工智能实验报告大全.docx(129页珍藏版)》请在冰点文库上搜索。
人工智能课内实验报告
(8次)
学 院:
自动化学院
班 级:
智能1501
姓 名:
刘少鹏(34)
学 号:
06153034
课内实验1:
猴子摘香蕉问题的VC编程实现……………………1
课内实验2:
编程实现简单动物识别系统的知识表示………5
课内实验3:
盲目搜索求解8数码问题………………………18
课内实验4:
回溯算法求解四皇后问题………………………33
课内实验5:
编程实现一字棋游戏……………………………37
课内实验6:
字句集消解实验…………………………………46
课内实验7:
简单动物识别系统的产生式推理………………66
课内实验8:
编程实现D-S证据推理算法……………………78
人工智能课内实验报告
实验1:
猴子摘香蕉问题的VC编程实现
学 院:
自动化学院
班 级:
智能1501
姓 名:
刘少鹏 (33)
学 号:
06153034
日 期:
2017-3-8 10:
15-12:
00
实验1:
猴子摘香蕉问题的VC编程实现
1、实验目的
(1)熟悉谓词逻辑表示法;
(2)掌握人工智能谓词逻辑中的经典例子——猴子摘香蕉问题的编程实现。
二、编程环境
VC语言
3、问题描述
房子里有一只猴子(即机器人),位于a处。
在c处上方的天花板上有一串香蕉,猴子想吃,但摘不到。
房间的b处还有一个箱子,如果猴子站到箱子上,就可以摸着天花板。
如图1所示,对于上述问题,可以通过谓词逻辑表示法来描述知识。
要求通过VC语言编程实现猴子摘香蕉问题的求解过程。
图1 猴子摘香蕉问题
4、源代码
#include
unsigned int i;
void Monkey_Go_Box(unsigned char x, unsigned char y)
{
printf("Step%d:
monkey从%c走到%c\n",++i, x, y);//x表示猴子的位置,y为箱子的位置
}
void Monkey_Move_Box(char x, char y)
{
printf("Step%d:
monkey把箱子从%c运到%c\n",++i, x, y);//x表示箱子的位置,y为香蕉的位置
}
void Monkey_On_Box()
{
printf("Step%d:
monkey爬上箱子\n",++i);
}
void Monkey_Get_Banana()
{
printf("Step%d:
monkey摘到香蕉\n",++i);
}
void main()
{
unsigned char Monkey,Box,Banana;
printf("********智能1501班**********\n");
printf("********06153034************\n");
printf("********刘少鹏**************\n");
printf("请用abc来表示猴子箱子香蕉的位置\n");
printf("Monkey\tbox\tbanana\n");
scanf("%c",&Monkey);
getchar();
printf("\t");
scanf("%c",&Box);
getchar();
printf("\t\t");
scanf("%c",&Banana);
getchar();
printf("\n操作步骤如下\n");
if (Monkey!
=Box)
{
Monkey_Go_Box(Monkey,Box);
}
if (Box!
=Banana)
{
Monkey_Move_Box(Box,Banana);
}
Monkey_On_Box();
Monkey_Get_Banana();
printf("\n");
getchar();
}
5、实验结果相关截图
六、心得体会
通过本次实验,我初步了学会了使用VC的新建工程,并且进行简单的程序编写。
此外我还学会如何使用一些谓词来解决生活中的一些简单问题,并且用VC编程给出具体的操作步骤,感觉对VC编程有了新的认识。
在实验中我也遇到过许多问题,比如在我写完代码进行编译时总是会出现一个错误“ fatalerrorC1010:
在查找预编译头时遇到意外的文件结尾,是否忘记了向源中添加“#include ‘stdafx.h’”关于这个错误我我问了几个同学得不出答案后,我决定通过上网查找,最终找到了解决方法,需要在该项目的每一个cpp结尾的文件属性中设置不使用预编译头即可。
在这个过程中也锻炼了自己解决问题的能力。
人工智能课内实验报告
实验2:
编程实现简单动物识别系统的知识表示
学 院:
自动化学院
班 级:
智能1501
姓 名:
刘少鹏(33)
学 号:
06153034
日 期:
2017-3-13 10:
15-12:
00
实验2:
编程实现简单动物识别系统的知识表示
一、实验目的
1、理解和掌握产生式知识表示方法;
2、能够通过VC编程语言实现产生式系统的规则库。
二、实验内容
1、以动物识别系统的产生式规则为例;
2、用选定的编程语言建造规则库和综合数据库,并能对它们进行增加、删除和修改操作。
3、实验步骤
1、确定需要识别的动物及其属性
本次实验的简单动物识别系统总共能识别7种动物,即:
老虎、金钱豹、斑马、长颈鹿、企鹅、鸵鸟和信天翁。
2、建立识别七种动物识别系统的规则
3、选定编程语言并确定综合数据库和规则库结构
(1)选用C语言作为编程语言
(2)综合数据库的建立
(3)规则库的建立
四、程序源代码
#include
#include
using namespace std;
struct RULES
{
int count;
char pre[255];
char back[255];
int mark;
};
void check();
RULES r[100]={
{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},
{1,"反刍","哺乳动物",0}
};
int number;
int m;
int cat=15;
int a;
int length; //输入的事实长度
string f[255]; //输入的事实数组
void input()
{
while
(1)
{
cat++;
cout << "number" << endl;
cin >> r[cat].count;
cout << "输入事实,两种以上的事实请在每个事实后加上‘&’符号" << endl;
cin >> r[cat].pre;
cout << "输入结果" << endl;
cin >> r[cat].back;
r[cat].mark=0;
while
(1)
{
cout << "输入“1”继续添加规则,输入“2”查看规则库" << endl;
int p;
cin >> p;
if (p==1)
{
input();
}
else
{
if (p==2)
{
check();
}
else
{
cout << "输入错误,重新输入" << endl;
}
}
}
}
}
void delate()
{
cout << "输入要删除的条数" << endl;
int bar;
cin >> bar;
for (int t=0;t<=cat;t++)
{
r[bar-1] = r[bar];
bar++;
}
cat--;
check();
}
void check()
{
cout << endl << "规则库如下" << endl;
for (int i=0;i<=cat;i++)
{
cout << i+1 << "." << "由" << r[i].pre << "可得" << r[i].back << endl;
}
cout << endl;
while
(1)
{
cout << "输入“1”继续添加规则,输入“3”删除选定的规则" << endl;
cin >> m;
if (m==1)
{
input();
}
else
{
if (m==3)
delate();
}
}
}
int find_rule(int s) //查找规则库中是否还有可使用的规则
{
for (int i=0;i<=15;i++)
s = s*r[i].mark;
//cout<<"find_rule结果"<
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++; //事实库的长度加1
r.mark=1; //标记规则已使用过
break;
}
else
i++;
}
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++; //事实库的长度加1
r.mark=1; //标记规则已使用过
}
return r.mark;
}
void result()
{
int i=1,m=0;
while (i!
= length+1)
{
if (f[i] == "金钱豹")
{
cout << "该动物是金钱豹" << endl;
m=1;
break;
}
else
if (f[i] == "老虎")
{
cout << "该动物是老虎" << endl;
m=1;
break;
}
else
if (f[i] == "长颈鹿")
{
cout << "该动物是长颈鹿" << endl;
m=1;
break;
}
else
if (f[i] == "斑马")
{
cout << "该动物是斑马" << endl;
m=1;
break;
}
else
if (f[i] == "鸵鸟")
{
cout << "该动物是鸵鸟" << endl;
m=1;
break;
}
else
if (f[i] == "企鹅")
{
cout << "该动物是企鹅" << endl;
m=1;
break;
}
else
if (f[i] == "信天翁")
{
cout << "信天翁" << endl;
m=1;
break;
}
else
i++;
}
if (m==0)
cout << "没有符合的动物,请确认特征,重新输入" << endl;
}
void idetify()
{
int i=0,u=0;
if (find_rule(u)==0) //如果规则库中还有未使用的规则
{//cout<<"还有未使用的规则"<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;
}
else
i=16;
}
else
{
i++;
}
}
}
else
{
cout << "所有的规则都已使用" << endl;
}
result();
}
/*主函数*/
void main()
{
cout << "******智能1501班********" << endl;
cout << "******06153034**********" << endl;
cout << "******刘少鹏************" << endl;
cout << "进行动物识别请输入7" << endl;
cout << "进行规则库操作请输入8" << endl;
cin >> a;
while (a==8)
{ while
(1)
{
cout << "添加规则输入‘1’,查看已有规则输入‘2’" << endl;
cin >> m;
if (m==1)
{
input();
}
else
{
if (m==2)
{
check();
}
else
cout << "输入错误请重新输入" << endl;
}
}
}
if (a==7)
{
int u=0;
cout << "请输入动物的特征数" << endl;
cin >> length;
cout << "请输入动物的特征" << endl;
for (int i=1;i<=length;i++)
cin >> f[i];
idetify();
}
system("pause");
}
5、实验结果相关截图
1、程序总体结构
2、 规则库操作→查看规则库
3、 规则库操作→添加规则→添加袋鼠规则
4、 规则库操作→删除规则→删除袋鼠规则
5、动物识别→识别长颈鹿
六、心得体会
通过本次实验我深刻的理解和掌握产生式知识表示方法,并且能够通过VC编程语言实现产生式系统的规则库。
本次实验我同样遇到许多问题,我通过自己查阅资料,与同学们讨论,逐步的将自己的问题解决,在这个过程中提高了我的问题解决能力。
最后因为本次实验只有对数据库有清楚的掌握,同时熟悉规则才能合理编程,因此我在平时的学习中应当加大数据库与数据结构的学习力度,提高自己的编程能力。
人工智能课内实验报告
实验3:
盲目搜索求解八数码问题
学 院:
自动化学院
班 级:
智能1501
姓 名:
刘少鹏 (33)
学 号:
06153034
日 期:
2017-03-30 10:
15-12:
00
人工智能课内实验3:
盲目搜索求解8数码问题
1、 实验目的
(1)熟悉人工智能系统中的问题求解过程;
(2)熟悉状态空间中的盲目搜索策略;
(3)掌握盲目搜索算法,重点是宽度优先搜索和深度优先搜索算法。
2、 实验要求
用VC语言编程,采用宽度优先搜索和深度优先搜索方法,求解8数码问题
3、 实验内容
(1)采用宽度优先算法,运行程序,要求输入初始状态
假设给定如下初始状态S0
283
164
705
和目标状态Sg
216
408
753
验证程序的输出结果,写出心得体会。
(2)对代码进行修改(选作),实现深度优先搜索求解该问题
提示:
每次选扩展节点时,从数组的最后一个生成的节点开始找,找一个没有被扩展的节点。
这样也需要对节点添加一个是否被扩展过的标志。
4 源代码及实验结果截图
(1) 实验源代码
#include
#include
TypedefstructNode{ int num[9];//棋盘状态
intdeepth;//派生的深度 g(n)
intdiffnum;//不在位的数目 h(n)
intvalue;//耗散值 f(n)=g(n)+h(n)
structNode*pre;
structNode*next;
structNode*parent;
}numNode;/*--endofstructnumNode--*/
intorigin[9];//棋盘初始状态
inttarget[9];//棋盘目标状态
intnumNode_num,total_step;
numNode*open,*close;//Open表和Close表
numNode*create_numNode()
{
return(numNode*)malloc(sizeof(numNode));
}
numNode*open_getfirst(numNode*head);//返回第一项,并从Open表中删除
voidopen_insert(numNode*head,numNode*item);//向Open表中按序插入新节点
voidclose_append(numNode*head,numNode*item);//向Close表中插入新节点
intexpand(numNode*item);//扩展节点
intprint_result(numNode*item);//打印结果
numNode *copy_numNode(numNode*orgin);
charisNewNode(numNode*open,numNode*close,intnum[9]);//是否在Open表或Close表中
voidprint_num(intnum[9]);//打印棋盘状态
intdiff(intnum[9]);//求不在位棋子的个数
voidinit();//初始化,获得棋盘初始状态和目标状态
voidswap(int*a,int*b);
intoperate(int num[],intop);
voidfree_list(numNode*head);
//*Name:
主函數
//*Description:
程序入口
intmain(intargc,char*argv[])
{
//初始化Open表和Close表
printf("*****智能1501****\n");
printf("*****刘少鹏******\n");
printf("*****06153034****\n");
open=create_numNode();
close=create_numNode();
open->pre=open->next=close->pre=close->next=NULL;
init();//由用户输入初始和目标状态
//初始化初始节点
numNode*p1;
p1=create_numNode();
p1->parent=NULL;
p1->deepth=0;
inti=0;
for(i=0;i<9;i++)
{
p1->num[i]=origin[i];
}
open_insert(open,p1);
numNode_num=1;
p1=open_getfirst(open);
while(p1!
=NULL)
{
close_append(close,p1);
if(expand(p1))
returnEXIT_SUCCESS;
p1=open_getfirst(open);
}
printf("Nosolution!
\n");
returnEXIT_SUCCESS;
}/*----------endoffunctionmain----------*/
voidinit()
{
while
(1)
{
printf("Pleaseinputopriginalstatus:
\nForexample:
123456780standsfor\n"
"123\n"
"456\n"
"7 80\n");
chartemp[10];
scanf("%s",&temp);
inti=0;
for(i=0;i<9&&temp[i]-'0'>=0&&temp[i]-'0'<=8;i++)
{
origin[i]=temp[i]-'0';
}
printf("Pleaseinputtargetstatus:
\n");
scanf("%s",&temp);
int