用盲目搜索技术解决八数码问题.docx
- 文档编号:2469102
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:10
- 大小:18.15KB
用盲目搜索技术解决八数码问题.docx
《用盲目搜索技术解决八数码问题.docx》由会员分享,可在线阅读,更多相关《用盲目搜索技术解决八数码问题.docx(10页珍藏版)》请在冰豆网上搜索。
用盲目搜索技术解决八数码问题
用盲目搜索技术解决八数码问题
题目
在3×3的棋盘,有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。
棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。
要解决的问题是:
任意给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。
算法流程
使用宽度优先搜索
从初始节点开始,向下逐层对节点进形依次扩展,并考察它是否为目标节点,再对下层节点进行扩展(或搜索)之前,必须完成对当层的所有节点的扩展。
再搜索过程中,未扩展节点表OPEN中的节点排序准则是:
先进入的节点排在前面,后进入的节点排在后面。
宽度优先算法如下:
把初始结点S0放入OPEN表中
若OPEN表为空,则搜索失败,问题无解
取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编号n
若目标结点,则搜索成功,问题有解
若N无子结点,则转2
扩展结点N,将其所有子结点配上指向N的放回指针,依次放入OPEN表的尾部,转2
源程序
#include
#include
#include
usingnamespacestd;
constintROW=3;//行数
constintCOL=3;//列数
constintMAXDISTANCE=10000;//最多可以有的表的数目
constintMAXNUM=10000;
typedefstruct_Node{
intdigit[ROW][COL];
intdist;//distancebetweenonestateandthedestination
一个表和目的表的距离
intdep;//thedepthofnode深度
//Sothecommentfunction=dist+dep.估价函数值
intindex;//pointtothelocationofparent父节点的位置
}Node;
Nodesrc,dest;//父节表目的表
vector
boolisEmptyOfOPEN()//open表是否为空
{
for(inti=0;i if(node_v[i].dist! =MAXNUM) returnfalse; } returntrue; } boolisEqual(intindex,intdigit[][COL])//判断这个最优的节点是否和目的节点一样 { for(inti=0;i for(intj=0;j if(node_v[index].digit[i][j]! =digit[i][j]) returnfalse; } returntrue; } ostream&operator<<(ostream&os,Node&node) { for(inti=0;i for(intj=0;j os< os< } returnos; } voidPrintSteps(intindex,vector { rstep_v.push_back(node_v[index]); index=node_v[index].index; while(index! =0) { rstep_v.push_back(node_v[index]); index=node_v[index].index; } for(inti=rstep_v.size()-1;i>=0;i--)//输出每一步的探索过程 cout<<"Step"< < } voidSwap(int&a,int&b) { intt; t=a; a=b; b=t; } voidAssign(Node&node,intindex) { for(inti=0;i for(intj=0;j node.digit[i][j]=node_v[index].digit[i][j]; } intGetMinNode()//找到最小的节点的位置即最优节点 { intdist=MAXNUM; intloc;//thelocationofminimizenode for(inti=0;i { if(node_v[i].dist==MAXNUM) continue; elseif((node_v[i].dist+node_v[i].dep) loc=i; dist=node_v[i].dist+node_v[i].dep; } } returnloc; } boolisExpandable(Node&node) { for(inti=0;i if(isEqual(i,node.digit)) returnfalse; } returntrue; } intDistance(Node&node,intdigit[][COL]) { intdistance=0; boolflag=false; for(inti=0;i for(intj=0;j for(intk=0;k for(intl=0;l if(node.digit[i][j]==digit[k][l]){ distance+=abs(i-k)+abs(j-l); flag=true; break; } else flag=false; } if(flag) break; } returndistance; } intMinDistance(inta,intb) { return(a a: b); } voidProcessNode(intindex) { intx,y; boolflag; for(inti=0;i for(intj=0;j if(node_v[index].digit[i][j]==0) { x=i;y=j; flag=true; break; } elseflag=false; } if(flag) break; } Nodenode_up; Assign(node_up,index);//向上扩展的节点 intdist_up=MAXDISTANCE; if(x>0) { Swap(node_up.digit[x][y],node_up.digit[x-1][y]); if(isExpandable(node_up)) { dist_up=Distance(node_up,dest.digit); node_up.index=index; node_up.dist=dist_up; node_up.dep=node_v[index].dep+1; node_v.push_back(node_up); } } Nodenode_down; Assign(node_down,index);//向下扩展的节点 intdist_down=MAXDISTANCE; if(x<2) { Swap(node_down.digit[x][y],node_down.digit[x+1][y]); if(isExpandable(node_down)) { dist_down=Distance(node_down,dest.digit); node_down.index=index; node_down.dist=dist_down; node_down.dep=node_v[index].dep+1; node_v.push_back(node_down); } } Nodenode_left; Assign(node_left,index);//向左扩展的节点 intdist_left=MAXDISTANCE; if(y>0) { Swap(node_left.digit[x][y],node_left.digit[x][y-1]); if(isExpandable(node_left)) { dist_left=Distance(node_left,dest.digit); node_left.index=index; node_left.dist=dist_left; node_left.dep=node_v[index].dep+1; node_v.push_back(node_left); } } Nodenode_right; Assign(node_right,index);//向右扩展的节点 intdist_right=MAXDISTANCE; if(y<2) { Swap(node_right.digit[x][y],node_right.digit[x][y+1]); if(isExpandable(node_right)) { dist_right=Distance(node_right,dest.digit); node_right.index=index; node_right.dist=dist_right; node_right.dep=node_v[index].dep+1; node_v.push_back(node_right); } } node_v[index].dist=MAXNUM;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 盲目 搜索 技术 解决 数码 问题