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