人工智能八数码难题.docx
- 文档编号:4089643
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:16
- 大小:130.62KB
人工智能八数码难题.docx
《人工智能八数码难题.docx》由会员分享,可在线阅读,更多相关《人工智能八数码难题.docx(16页珍藏版)》请在冰豆网上搜索。
人工智能八数码难题
**********大学信息工程与自动化学院学生实验报告
(2012—2013学年第1学期)
课程名称:
人工智能开课实验室:
信自楼4422012年10月24日
年级、专业、班
学号
姓名
成绩
实验项目名称
八数码难题
指导教师
教师评语
该同学是否了解实验原理:
A.了解□B.基本了解□C.不了解□
该同学的实验能力:
A.强□B.中等□C.差□
该同学的实验是否达到要求:
A.达到□B.基本达到□C.未达到□
实验报告是否规范:
A.规范□B.基本规范□C.不规范□
实验过程是否详细记录:
A.详细□B.一般□C.没有□
教师签名:
年月日
一、上机目的及内容
1.上机内容
用确定性推理算法求解教材65-66页介绍的八数码难题。
2.上机目的
(1)复习程序设计和数据结构课程的相关知识,实现课程间的平滑过渡;
(2)掌握并实现在小规模状态空间中进行图搜索的方法;
(3)理解并掌握图搜索的技术要点。
二、实验原理及基本技术路线图(方框原理图或程序流程图)
(1)设计并实现程序,求解出正确的解答路径;
(2)对所设计的算法采用大O符号进行时间复杂性和空间复杂性分析;
(3)对一般图搜索的技术要点和技术难点进行评述性分析。
程序流程图:
三、所用仪器、材料(设备名称、型号、规格等或使用软件)
1台PC及VISUALC++6.0软件
四、实验方法、步骤(或:
程序代码或操作过程)
#include
#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[],intop);
voidfree_list(numNode*head);
//Name:
主函数
intmain(intargc,char*argv[])
{//初始化Open表和Close表
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;
}
voidinit()//初始化
{
while
(1)
{
printf("八数码程序\n");
printf("---------------------------------------------------------------------\n");
chartemp[10];
printf("请输入初始状态:
");
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("\n");
printf("请输入目标状态:
");
scanf("%s",&temp);
intj=0;
for(j=0;j<9&&temp[j]-'0'>=0&&temp[j]-'0'<=8;j++)
{
target[j]=temp[j]-'0';
}
system("cls");
if(i==9&&j==9)
{
break;
}
}
}//endoffunctioninit
voidopen_insert(numNode*head,numNode*item)
{
numNode*p,*q;
p=head->next;
q=head;
while(p!
=NULL&&item->value>p->value)
{
q=p;
p=p->next;
}
q->next=item;
item->pre=q;
item->next=p;
if(p!
=NULL)
{
p->pre=item;
}
}/*-----endoffunctionopen_insert-----*/
numNode*open_getfirst(numNode*head)
{
numNode*p;
if(head->next==NULL)
{
returnNULL;
}
p=head->next;
head->next=p->next;
if(p->next!
=NULL)
{
p->next->pre=head;
}
p->pre=NULL;
p->next=NULL;
returnp;
}/*-----endoffunctionopen_getfirst-----*/
voidclose_append(numNode*head,numNode*item)
{
item->next=head->next;
item->pre=head;
head->next=item;
if(item->next!
=NULL)
{
item->next->pre=item;
}
}/*-----endoffunctionclose_append-----*/
intexpand(numNode*p1)
{
numNode*p2;
intop=1;
for(op=1;op<=4;op++)
{
p2=copy_numNode(p1);
operate(p2->num,op);
if(isNewNode(open,close,p2->num)=='N')
{
p2->parent=p1;
p2->deepth=p1->deepth+1;
p2->diffnum=diff(p2->num);
p2->value=p2->deepth+p2->diffnum;
if(p2->diffnum==0)
{
total_step=print_result(p2);
printf("Totalstep:
%d\n",total_step);
free_list(open);
free_list(close);
return1;
}
else
{
numNode_num++;
open_insert(open,p2);
}
}
else
free(p2);
}
return0;
}/*-----endoffunctionexpand-----*/
intoperate(intm[],intop)
{
intblank;
blank=0;
while(m[blank]!
=0&&blank<9)
++blank;
if(blank==9)
return1;
switch(op){
case1:
/*up*/
if(blank>2)
swap(m+blank,m+blank-3);
break;
case2:
/*down*/
if(blank<6)
swap(m+blank,m+blank+3);
break;
case3:
/*left*/
if(blank!
=0&&blank!
=3&&blank!
=6)
swap(m+blank,m+blank-1);
break;
case4:
/*right*/
if(blank!
=2&&blank!
=5&&blank!
=8)
swap(m+blank,m+blank+1);
break;
default:
return1;
}
return0;
}
voidswap(int*a,int*b)
{
intc;
c=*a;
*a=*b;
*b=c;
}
numNode*
copy_numNode(numNode*origin)
{
numNode*p;
p=create_numNode();
p->deepth=origin->deepth;
p->diffnum=origin->diffnum;
p->value=origin->value;
inti;
for(i=0;i<9;i++)
{
(p->num)[i]=(origin->num)[i];
}
returnp;
}/*-----endoffunctioncopy_numNode-----*/
intdiff(intnum[9])
{
inti,diffnum=0;
for(i=0;i<9;i++)
if(num[i]!
=target[i])
diffnum++;
returndiffnum;
}/*-----endoffunctiondiff-----*/
char
isNewNode(numNode*open,numNode*close,intnum[9])
{
numNode*p;
inti=0;
p=open->next;
while(p!
=NULL)
{
for(i=0;i<9;i++)
{
if(p->num[i]!
=num[i])
break;
}
if(i==9)
return'O';//Open
p=p->next;
}
p=close->next;
while(p!
=NULL)
{
for(i=0;i<9;i++)
{
if(p->num[i]!
=num[i])
break;
}
if(i==9)
return'C';//Close
p=p->next;
}
return'N';
}/*-----endoffunctionisNewNode-----*/
voidfree_list(numNode*head)
{
numNode*p,*q;
p=head->next;
while(p!
=NULL)
{
q=p->next;
free(p);
p=q;
}
free(head);
}/*-----endoffunctionfree_list-----*/
voidprint_num(intnum[9])
{
inti;
for(i=0;i<9;i++)
{
printf("%d\t",num[i]);
if((i%3)==2)
printf("\n");
}
}/*-----endoffunctionprint_num-----*/
intprint_result(numNode*item)
{
numNode*p;
intstep;
p=item;
if(p!
=NULL)
{
step=print_result(p->parent);
printf("\nStep%d:
\n",step+1);
print_num(p->num);
returnstep+1;
}
else
{
return-1;
}
}
五、实验过程原始记录(测试数据、图表、计算等)
输入要解决的数据串213654870
还要输入目标数据串123804765
最后通过20步的广度优先算法排序可得到结果如下:
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。
其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获)
在老师动手给我们编程演示一次后,我多次看过老师的代码,明白其中的流程和思路,用C语言写了一个,和老师的相比相差甚远啊。
我们通过这次实验有效地复习了数据结构的相关的知识,为以后的学习和研究做了先前的准备,这一点非常的开心,但是该问题我们编程还是有一定的困难,需要我们以后多加的复习相关的语言知识,努力的坚强的的编程,多读代码。
由上面的结果,通过和其它的算法比较,我得出了以下结论对广度优先算法进行归纳:
广度优先搜索法在有解的情形总能保证搜索到最短路经,也就是移动最少步数的路径。
但广度优先搜索法的最大问题在于搜索的结点数量太多,因为在广度优先搜索法中,每一个可能扩展出的结点都是搜索的对象。
随着结点在搜索树上的深度增大,搜索的结点数会很快增长,并以指数形式扩张,从而所需的存储空间和搜索花费的时间也会成倍增长。
在进行广度搜索时候,将父结点所在的数组索引记录在子结点中了,所以得到目标排列的时候,我们只要从子结点逆向搜索就可以得到最优搜索路径了。
通过上机,我们学到了不少的知识,理论上想的和实际是不一样的,我们要学好人工智能首先要学好数据结构,数据结构和C、C++语言都是一门基础性的课程,需要把理论变为实践,我们一定要把基础打好,几乎每一样与计算机相关的考试都有数据结构,所以更应该好好学习。
上机使我们温故了C++的知识,虽然它有一定的难度,但只要我们用心去做,一定可以做好的,心有多大舞台就有做大。
从此数据结构变得不再那么陌生了,首先从看别人程序到自己尝试着编,然后不断地调整,问同学,网上查,最后终于成功了,但是感觉自己的知识还是很少,需要多加的努力,更加的投入学习,只要用心,人工智能是能学好的。
注:
教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 数码 难题