人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次文档格式.docx
《人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次文档格式.docx》由会员分享,可在线阅读,更多相关《人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次文档格式.docx(83页珍藏版)》请在冰点文库上搜索。
二、编程环境
VC语言
三、问题描述
房子里有一只猴子(即机器人),位于a处。
在c处上方的天花板上有一串香蕉,猴子想吃,但摘不到。
房间的b处还有一个箱子,如果猴子站到箱子上,就可以摸着天花板。
如图1所示,对于上述问题,可以通过谓词逻辑表示法来描述知识。
要求通过VC语言编程实现猴子摘香蕉问题的求解过程。
图1猴子摘香蕉问题
四、源代码
#include<
stdio.h>
unsignedinti;
voidMonkey_Go_Box(unsignedcharx,unsignedchary)
{
printf( "
Step%d:
monkey从%c走到%c\n"
++i,x,y);
//x表示猴子的位置,y为箱子的
位置
}
voidMonkey_Move_Box(charx,chary)
monkey把箱子从%c运到%c\n"
//x表示箱子的位置,y为
香蕉的位置
}voidMonkey_On_Box()
monkey爬上箱子\n"
++i);
}voidMonkey_Get_Banana()
monkey摘到香蕉\n"
}voidmain()
unsignedcharMonkey,Box,Banana;
********智能1501班**********\n"
);
********06153034************\n"
********刘少鹏**************\n"
请用abc来表示猴子箱子香蕉的位置\n"
);
Monkey\tbox\tbanana\n"
scanf( "
%c"
&
Monkey);
getchar();
\t"
scanf("
Box);
\t\t"
Banana);
\n操作步骤如下\n"
if(Monkey!
=Box)
{
Monkey_Go_Box(Monkey,Box);
}
if(Box!
=Banana)
Monkey_Move_Box(Box,Banana);
Monkey_On_Box();
Monkey_Get_Banana();
\n"
五、实验结果相关截图
六、心得体会
通过本次实验,我初步了学会了使用VC的新建工程,并且进行简单的程序编写。
此外我还学会如何使用一些谓词来解决生活中的一些简单问题,并且用VC编程给出具体的操作步骤,感觉对VC编程有了新的认识。
在实验中我也遇到过许多问题,比如在我写完代码进行编译时总是会出现一个错误“fatalerrorC1010:
在查找预编译头时遇到意外的文件结尾,是否忘记了向源中添加“#include‘stdafx.h’”关于这个错误我我问了几个同学得不出答案后,我决定通过上网查找,最终找到了解决方法,需要在该项目的每一个cpp结尾的文件属性中设置不使用预编译头即可。
在这个过程中也锻炼了自己解决问题的能力。
实验2:
编程实现简单动物识别系统的知识表示
自动化学院班 级:
智能1501
姓 名:
刘少鹏(33)
06153034
2017-3-1310:
00
1、理解和掌握产生式知识表示方法;
2、能够通过VC编程语言实现产生式系统的规则库。
二、实验内容
1、以动物识别系统的产生式规则为例;
2、用选定的编程语言建造规则库和综合数据库,并能对它们进行增加、删除和修改操作。
三、实验步骤
1、确定需要识别的动物及其属性
本次实验的简单动物识别系统总共能识别7种动物,即:
老虎、金钱豹、斑马、长颈鹿、
企鹅、鸵鸟和信天翁。
2、建立识别七种动物识别系统的规则
3、选定编程语言并确定综合数据库和规则库结构
(1)选用C语言作为编程语言
(2)综合数据库的建立
(3)规则库的建立
四、程序源代码
iostream>
#include<
string>
usingnamespacestd;
structRULES
{intcount;
charpre[255];
charback[255];
intmark;
};
voidcheck();
RULESr[100]={
{1, "
有毛发"
"
哺乳动物"
0}, //所有规则静态数据库
有奶"
0},
有羽毛"
鸟"
{2, "
会飞&
下蛋&
"
{1, "
吃肉"
食肉动物"
{3, "
有锋利的牙齿&
有爪&
眼睛盯着前方&
哺乳动物&
有蹄&
有蹄类哺乳动物"
反刍&
有偶蹄类哺乳动物"
{4, "
食肉动物&
黄褐色&
有暗斑&
金钱豹"
黑色条纹&
老虎"
有蹄类哺乳动物&
有长脖子&
有长腿&
长颈鹿"
黑条纹&
斑马"
{5,"
鸟&
不会飞&
黑白色&
鸵鸟"
会游泳&
企鹅"
信天翁"
反刍"
0}
intnumber;
intm;
intcat=15;
inta;
intlength;
//输入的事实长度stringf[255];
//输入的事实数组voidinput()
{while
(1)
cat++;
cout<
<
number"
endl;
cin>
>
r[cat].count;
输入事实,两种以上的事实请在每个事实后加上‘&
’符号"
r[cat].pre;
输入结果"
r[cat].back;
r[cat].mark=0;
while
(1)
{
cout<
输入“1”继续添加规则,输入“2”查看规则库"
intp;
cin>
p;
if(p==1)
}else
input();
if(p==2)
check();
}
cout<
输入错误,重新输入"
}voiddelate()
cout<
输入要删除的条数"
intbar;
cin>
bar;
for(intt=0;
t<
=cat;
t++)
r[bar-1]=r[bar];
bar++;
cat--;
check();
}voidcheck()
endl<
规则库如下"
for(inti=0;
i<
i++)
i+1<
."
由"
r[i].pre<
可得"
r[i].back<
输入“1”继续添加规则,输入“3”删除选定的规则"
m;
if(m==1)
if(m==3)
delate();
intfind_rule(ints) //查找规则库中是否还有可使用的规则
for(inti=0;
=15;
i++)s=s*r[i].mark;
//cout<
find_rule结果"
s<
returns;
intcompare1(RULESr)//当前提条件为1时
intj=0,i=1;
stringstr,str2;
str=r.pre;
while(i<
=length)
if(f[i]==str)
str2=r.back;
f[length+1]=str2;
//加入事实库
length++;
//事实库的长度加1
r.mark=1;
//标记规则已使用过break;
i++;
returnr.mark;
intcompare2(RULESr) //前提条件不为1
stringb[10];
inti,j=1,num=0;
inta=0;
str=r.pre;
for(i=0;
i!
=10;
++i)//转换数组
b[i]="
;
=str.length();
++i)
if(str.at(i)!
='
&
'
)
b[j]+=str.at(i);
j++;
i=1;
while(i<
=r.count)
for(j=1;
j!
=length+1;
j++)
if(f[j]==b[i])
a+=1;
if(a==r.count)
str2=r.back;
r.mark=1;
//标记规则已使用过
voidresult()
inti=1,m=0;
while(i!
=length+1)
if(f[i]=="
该动物是金钱豹"
m=1;
break;
该动物是老虎"
该动物是长颈鹿"
该动物是斑马"
该动物是鸵鸟"
该动物是企鹅"
if(m==0)
没有符合的动物,请确认特征,重新输入"
}voididetify()
inti=0,u=0;
if(find_rule(u)==0)//如果规则库中还有未使用的规则
{//cout<
还有未使用的规则"
intnum=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)
使用规则"
i+1;
且加入的新事实为"
u=compare2(r[i]);
if(r[i].mark==1)
if(i==15)
if(num!
i=0;
num=length;
i=16;
}
所有的规则都已使用"
result();
/*主函数*/voidmain()
******智能1501班********"
******06153034**********"
<
******刘少鹏************"
进行动物识别请输入7"
进行规则库操作请输入8"
a;
while(a==8)
{while
(1)
添加规则输入‘1’,查看已有规则输入‘2’"
if(m==2)
输入错误请重新输入"
if(a==7)
intu=0;
请输入动物的特征数"
length;
请输入动物的特征"
for(inti=1;
=length;
f[i];
idetify();
system("
pause"
1、程序总体结构
2、规则库操作→查看规则库
3、规则库操作→添加规则→添加袋鼠规则
4、规则库操作→删除规则→删除袋鼠规则
5、动物识别→识别长颈鹿
通过本次实验我深刻的理解和掌握产生式知识表示方法,并且能够通过VC编程语言实现产生式系统的规则库。
本次实验我同样遇到许多问题,我通过自己查阅资料,与同学们讨论,逐步的将自己的问题解决,在这个过程中提高了我的问题解决能力。
最后因为本次实
验只有对数据库有清楚的掌握,同时熟悉规则才能合理编程,因此我在平时的学习中应当加大数据库与数据结构的学习力度,提高自己的编程能力。
实验3:
盲目搜索求解八数码问题
班 级:
智能1501
刘少鹏(33)
06153034
2017-03-3010:
人工智能课内实验3:
盲目搜索求解8数码问题
1、实验目的
(1)熟悉人工智能系统中的问题求解过程;
(2)熟悉状态空间中的盲目搜索策略;
(3)掌握盲目搜索算法,重点是宽度优先搜索和深度优先搜索算法。
2、实验要求
用VC语言编程,采用宽度优先搜索和深度优先搜索方法,求解8数码问
题
3、实验内容
(1)采用宽度优先算法,运行程序,要求输入初始状态假设给定如下初始状态S0
2 8 3
1 6 4
7 0 5
和目标状态Sg2 1 6
4 0 8
7 5 3
验证程序的输出结果,写出心得体会。
(2)对代码进行修改(选作),实现深度优先搜索求解该问题
提示:
每次选扩展节点时,从数组的最后一个生成的节点开始找,找一个没有被扩展的节点。
这样也需要对节点添加一个是否被扩展过的标志。
4源代码及实验结果截图
(1)实验源代码
#include<
stdlib.h>
#include<
TypedefstructNode{intnum[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(intnum[]