人工智能实验报告八数码难题Word格式文档下载.doc
《人工智能实验报告八数码难题Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《人工智能实验报告八数码难题Word格式文档下载.doc(5页珍藏版)》请在冰豆网上搜索。
![人工智能实验报告八数码难题Word格式文档下载.doc](https://file1.bdocx.com/fileroot1/2022-10/7/59f9ba14-a51a-4d39-8267-1a8a19e2863b/59f9ba14-a51a-4d39-8267-1a8a19e2863b1.gif)
A.详细□ B.一般□ C.没有□
教师签名:
年月日
一、实验内容
八数码难题,问题描述:
在3×
3方格棋盘上,分别放置了标有数字1,2,3,4,5,6,7,8的
八张牌,初始状态S0,目标状态S1如图所示,可以使用的操作有:
空格上移,空格左移,
空格右移,空格下移。
只允许位于空格左,上,右,下方的牌移入空格。
用广度优先搜索
策略寻找从初始状态到目标状态的解路径。
二、实验原理
算法思想:
这是一种盲目搜索算法。
算法主要思想是从初始结点开始依次沿其上下左右四个方向扩展
结点,并逐一检查这些后继结点是否为目标结点,若不等于目标结点则把该后继结点插入到
数组末尾。
然后取数组中未扩展的第一个结点重复以上操作,直到得到目标结点为止或在限
定步数以内未得到解。
广度优先搜索策略数据结构:
voidBfs()
{
queue<
Map>
Queue;
Queue.push(org);
HashTable[org.myindex]=-1;
while(NOTQueue.empty())
{
Mapnode=Queue.front();
Queue.pop();
for(intk=0;
k<
4;
k++)
{
Maptmp=node;
tmp.position=node.position+derection[k];
if(tmp.position<
0||tmp.position>
8||(k>
1&
&
tmp.position/3!
=node.position/3))
continue;
tmp.myindex=HashValue(node,k);
if(0!
=HashTable[tmp.myindex])continue;
tmp.detail[node.position]=tmp.detail[tmp.position];
tmp.detail[tmp.position]=0;
HashTable[tmp.myindex]=node.myindex;
//状态记录到hashtable中
if(node.myindex==EndIndex)return;
Queue.push(tmp);
}
}
return;
}
三、所用仪器、材料
1台PC及VISUALC++6.0软件
四、实验方法、步骤
源代码见同一文件夹中bashuma.cpp
部分程序代码:
typedefstructNode{
intnum[9];
intdeepth;
intdiffnum;
intvalue;
structNode*pre;
structNode*next;
structNode*parent;
}numNode;
intmain(intargc,char*argv[])
{
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++)
{
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("
输入初始状态S0(请从左到右依次输入每行数字,0代表空格):
chartemp[10];
scanf("
%s"
&
temp);
inti=0;
for(i=0;
i<
9&
temp[i]-'
0'
>
=0&
<
=8;
{
origin[i]=temp[i]-'
;
}
请输入目标状态S1:
intj=0;
for(j=0;
j<
temp[j]-'
j++)
{
target[j]=temp[j]-'
system("
cls"
if(i==9&
j==9)
{
break;
}
intoperate(intm[],intop)
intblank;
blank=0;
while(m[blank]!
blank<
9)
++blank;
if(blank==9)
return1;
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:
return1;
return0;
}
五、实验过程原始记录
六、实验总结:
人工智能这门课程综合了许多学科的知识,这些知识面十分广,以及它
的应用也是十分广泛的,才刚开始学习的时候就会感觉有点复杂,因为它毕竟
综合了一些我们还没有学过的知识。
通过这次实验,我对八数码难题有了更进
一步的认识,对广度优先搜索策略更加熟悉,广度优先搜索策略在有解的情形
总能保证搜索到最短路经,也就是移动最少步数的路径。
在进行广度优先搜索
时候,将父结点所在的数组索引记录在子结点中了,所以得到目标排列的时
候,我们只要从子结点逆向搜索就可以得到最优搜索路径了。
这次实验还让我对人工智能的应用有了更全面的认识,让我对今后的学习
有了一个更加明确的目标。
-5-