人工智能八数码难题Word格式.docx

上传人:b****6 文档编号:17005664 上传时间:2022-11-27 格式:DOCX 页数:16 大小:130.62KB
下载 相关 举报
人工智能八数码难题Word格式.docx_第1页
第1页 / 共16页
人工智能八数码难题Word格式.docx_第2页
第2页 / 共16页
人工智能八数码难题Word格式.docx_第3页
第3页 / 共16页
人工智能八数码难题Word格式.docx_第4页
第4页 / 共16页
人工智能八数码难题Word格式.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

人工智能八数码难题Word格式.docx

《人工智能八数码难题Word格式.docx》由会员分享,可在线阅读,更多相关《人工智能八数码难题Word格式.docx(16页珍藏版)》请在冰豆网上搜索。

人工智能八数码难题Word格式.docx

(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++的知识,虽然它有一定的难度,但只要我们用心去做,一定可以做好的,心有多大舞台就有做大。

从此数据结构变得不再那么陌生了,首先从看别人程序到自己尝试着编,然后不断地调整,问同学,网上查,最后终于成功了,但是感觉自己的知识还是很少,需要多加的努力,更加的投入学习,只要用心,人工智能是能学好的。

注:

教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1