八数码问题C语言A星算法详细实验报告含代码_第1页
八数码问题C语言A星算法详细实验报告含代码_第2页
八数码问题C语言A星算法详细实验报告含代码_第3页
八数码问题C语言A星算法详细实验报告含代码_第4页
八数码问题C语言A星算法详细实验报告含代码_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

./一、实验容和要求八数码问题:在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所示,要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态。例如:28312316484705765<a>初始状态<b>目标状态图1八数码问题示意图请任选一种盲目搜索算法〔广度优先搜索或深度优先搜索或任选一种启发式搜索方法〔全局择优搜索,加权状态图搜索,A算法或A*算法编程求解八数码问题〔初始状态任选。选择一个初始状态,画出搜索树,填写相应的OPEN表和CLOSED表,给出解路径,对实验结果进行分析总结,得出结论。二、实验目的1.熟悉人工智能系统中的问题求解过程;2.熟悉状态空间的盲目搜索和启发式搜索算法的应用;3.熟悉对八数码问题的建模、求解及编程语言的应用。三、实验算法A*算法是一种常用的启发式搜索算法。在A*算法中,一个结点位置的好坏用估价函数来对它进行评估。A*算法的估价函数可表示为:f'<n>=g'<n>+h'<n>这里,f'<n>是估价函数,g'<n>是起点到终点的最短路径值〔也称为最小耗费或最小代价,h'<n>是n到目标的最短路经的启发值。由于这个f'<n>其实是无法预先知道的,所以实际上使用的是下面的估价函数:f<n>=g<n>+h<n>其中g<n>是从初始结点到节点n的实际代价,h<n>是从结点n到目标结点的最佳路径的估计代价。在这里主要是h<n>体现了搜索的启发信息,因为g<n>是已知的。用f<n>作为f'<n>的近似,也就是用g<n>代替g'<n>,h<n>代替h'<n>。这样必须满足两个条件:〔1g<n>>=g'<n>〔大多数情况下都是满足的,可以不用考虑,且f必须保持单调递增。〔2h必须小于等于实际的从当前节点到达目标节点的最小耗费h<n><=h'<n>。第二点特别的重要。可以证明应用这样的估价函数是可以找到最短路径的。3.A*算法的步骤A*算法基本上与广度优先算法相同,但是在扩展出一个结点后,要计算它的估价函数,并根据估价函数对待扩展的结点排序,从而保证每次扩展的结点都是估价函数最小的结点。A*算法的步骤如下:1建立一个队列,计算初始结点的估价函数f,并将初始结点入队,设置队列头和尾指针。2取出队列头〔队列头指针所指的结点,如果该结点是目标结点,则输出路径,程序结束。否则对结点进行扩展。3检查扩展出的新结点是否与队列中的结点重复,若与不能再扩展的结点重复〔位于队列头指针之前,则将它抛弃;若新结点与待扩展的结点重复〔位于队列头指针之后,则比较两个结点的估价函数中g的大小,保留较小g值的结点。跳至第五步。4如果扩展出的新结点与队列中的结点不重复,则按照它的估价函数f大小将它插入队列中的头结点后待扩展结点的适当位置,使它们按从小到大的顺序排列,最后更新队列尾指针。5如果队列头的结点还可以扩展,直接返回第二步。否则将队列头指针指向下一结点,再返回第二步。四、程序框图五、实验结果及分析输入初始状态:283 目标状态: 123 164 804 705 765 运行结果屏幕打印OPEN表与CLOSE表:OPENCLOSE1234023456012346701523468901572348910015762348111213015769234812131415015769113481213141516170157691124812131415161718190157691123481213141516171920015769112318812131415161719212201576911231841213141516171921222301576911231848121314151617192122242501576911231848231213141516171921222426015769112318482324发现26为目标节点0…72830…72831047652..112831642..112831647051…72031847654..112831407653..1128301476522.1428314576019.1222.1428314576019.1228371406521.1228314376518.1008321476511.1428316475010.142831647056…92301847655…80231847657…912307…912308476510.1123418076520.11803214765注释:每个注释:每个方格中最上面两个数字分别为编号与启发值,下面九个数字为八数码。较粗的箭头为解路径8..121237840659..1012380476511..9111..910382476523..912378460513.1312384076512.1312386470524..812324..812370468525.1212378465014.12014.1201382476515标目标节点六、结论对于八数码问题,BFS算法最慢,A*算法较快。八数码问题的一个状态实际上是0~9的一个排列,对于任意给定的初始状态和目标,不一定有解,也就是说从初始状态不一定能到达目标状态。因为排列有奇排列和偶排列两类,从奇排列不能转化成偶排列。如果一个数字0~8的随机排列871526340,用F<X>表示数字X前面比它小的数的个数,全部数字的F<X>之和为Y=∑<F<X>>,如果Y为奇数则称原数字的排列是奇排列,如果Y为偶数则称原数字的排列是偶排列。因此,可以在运行程序前检查初始状态和目标状态的排序的奇偶行是否相同,相同则问题可解,应当能搜索到路径。否则无解。七、源程序及注释#include<iostream>#include<ctime>#include<vector>usingnamespacestd;constintROW=3;constintCOL=3;constintMAXDISTANCE=10000;constintMAXNUM=10000;intabs<inta>{if<a>0>returna;elsereturn-a;}typedefstruct_Node{intdigit[ROW][COL];intdist;//距离intdep;//深度intindex;//索引值}Node;Nodesrc,dest;vector<Node>node_v;//储存节点boolisEmptyOfOPEN<>{//判断Open表是否空for<inti=0;i<node_v.size<>;i++>{if<node_v[i].dist!=MAXNUM>returnfalse;}returntrue;}boolisEqual<intindex,intdigit[][COL]>{//判断节点是否与索引值指向的节点相同for<inti=0;i<ROW;i++>for<intj=0;j<COL;j++>{if<node_v[index].digit[i][j]!=digit[i][j]>returnfalse;}returntrue;}ostream&operator<<<ostream&os,Node&node>{for<inti=0;i<ROW;i++>{for<intj=0;j<COL;j++>os<<node.digit[i][j]<<'';os<<endl;}returnos;}voidPrintSteps<intindex,vector<Node>&rstep_v>{//输出步骤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"<<rstep_v.size<>-i<<endl<<rstep_v[i]<<endl;}voidSwap<int&a,int&b>{//交换intt;t=a;a=b;b=t;}voidAssign<Node&node,intindex>{//获取节点for<inti=0;i<ROW;i++>for<intj=0;j<COL;j++>node.digit[i][j]=node_v[index].digit[i][j];}intGetMinNode<>{//获取启发值最小的节点intdist=MAXNUM;intloc;//thelocationofminimizenodefor<inti=0;i<node_v.size<>;i++>{if<node_v[i].dist==MAXNUM>continue;elseif<<node_v[i].dist+node_v[i].dep><dist>{loc=i;dist=node_v[i].dist+node_v[i].dep;}}returnloc;}boolisExpandable<Node&node>{//判断是否可扩展for<inti=0;i<node_v.size<>;i++>{if<isEqual<i,node.digit>>returnfalse;}returntrue;}intDistance<Node&node,intdigit[][COL]>{//计算距离intdistance=0;boolflag=false;for<inti=0;i<ROW;i++>for<intj=0;j<COL;j++>for<intk=0;k<ROW;k++>{for<intl=0;l<COL;l++>{if<node.digit[i][j]==digit[k][l]>{distance+=abs<i-k>+abs<j-l>;flag=true;break;}elseflag=false;}if<flag>break;}returndistance;}intMinDistance<inta,intb>{//二者取小return<a<b?a:b>;}voidProcessNode<intindex>{//展开节点intx,y;boolflag;for<inti=0;i<ROW;i++>{for<intj=0;j<COL;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[ind

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论