631306050107侯甚男+启发式搜索+状态空间搜索资料.doc

631306050107侯甚男+启发式搜索+状态空间搜索资料.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
重庆交通大学计算机与信息学院 验证性实验报告班级: 计软 专业 13 级 1 班学号:0107姓名:侯甚男实验项目名称:启发式搜索 A*算法2016 年 6 月 9 日一、实验目的 理解和掌握A*算法 二、实验内容及要求 1、实验 在8数码问题中,利用策略函数判断搜索,并使用A*算法减少搜索目标。 2、实验 用选定的编程语言编写程序,利用策略函数判断搜索和A*算法 笔记本,Microsoft Visual Studio 2010 四、设计方案 (一) 在?3×3方格盘上,放有八个数码,剩下第九个为空,每一空格其上下左右的数码可移至空格。要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。 所谓问题的一个状态就是棋子在棋盘上的一种摆法。棋子移动后,状态就会发生改变。解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态。 解八数码的问题如果按正常的思维,采用盲目搜索的话,不仅搜索的次数多,而且往往容易陷入死循环中,所以面对此问题需要一种策略——启发式搜索) 1、A*算法 A*(A-Star)算法是一种静态路网中求解最短路最有效的方法。 公式表示为:f(x)=d(x)+w(x), 其中f(x) 是节点x从初始点到目标点的估价函数, d(x) 是在状态空间中从初始节点到n节点的实际代价, w(x是从x到目标节点最佳路径的估计代价。 保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取: 估价值w(x)= x到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。 如果 估价值实际值, 搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。 估价值与实际值越接近,估价函数取得就越好。 例如对于几何路网来说,可以取两节点间欧几理德距离(直线距离)做为估价值,即f=g(n)+sqrt((dx-nx)*(dx-nx)+(dy-ny)*(dy-ny));这样估价函数f在g值一定的情况下,会或多或少的受估价值h的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向进行。明显优于Dijstra算法的毫无无方向的向四周搜索。其中是当前被考察和扩展的结点在搜索图中的节点深度,是节点与目标状态结点相比较,错位的数字个数。一般来说,某结点的越大,说明它离目标节点越远。 2、主要代码的设计 定义goal数组为目标状态——{1,2,3,8,0,4,7,6,5}。结构体Chessboard记录棋盘信息,其中变量pos数组坐标记录每个数码a的位置,其值为数码a。d表示该棋盘的深度,f为启发函数值,move为父节点移动到该节点的方式,以便在输出时告诉用户该如何移动棋子知道目标状态。 2)struct LNode: 定义节点LNode结构体,存放该节点状态时的棋盘信息board,和指向父节点、下一节点的指针(*parent,*next),以及标记量flag——值为true时表示该节点是最佳路径上的节点。 3)int* Findzero(LNode* Node): 为方便找到空格,我设计了找到该函数Findzero(*Node),以便找到当前节点空格所在位置以利于接下来的程序执行。返回值为空格所在的行和列。 4)int Wrong(LNode *Node)和int pick(LNode *Node): 分别为函数和。 5)LNode* extend(LNode *Node,int depth,int zero[2],int moveflag,int Choose) 树形方式扩展节点。Node为要扩展的当前节点,depth为当前深度,zero存放该节点空格位置信息,moveflag即扩展节点的移动方式,Choose为选择函数还是。 6)void InitList(LNode* Open,LNode* Close)和int ListInsert(List L,LNode* NewNode) 分别为表OPEN、CLOSE的创建和表的插入操作。 7)LNode* Getminf(List L) 主要是实现从OPEN表中选择一个值最小的节点。如果有几个节点值相同,当其中 有一个为目标节点时,则选择此目标节点;否则就选择其中任一个节点作为节点。 主要 六、实验体会 通过本次验证性实验,了解学习了A*算法,获益匪浅。重庆交通大学计算机与信息学院 验证性实验报告班级: 计软 专业 13 级 1 班学号:0107姓名:侯甚男实验项目名称: 状态空间搜索(8数码问题)2016 年 6 月 8 日实验目的 理解和掌握状态空间搜索的策略 实验内容及要求 1、实验 2、实验 用选定的编程语言编

文档评论(0)

2266670 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档