八数码问题实验报告解读.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《八数码问题》实验报告 一、实验目的 熟练掌握启发式有哪些信誉好的足球投注网站算法。实验内容: 使用启发式有哪些信誉好的足球投注网站算法求解8数码问题。编制程序实现求解8数码问题算法,采用估价函数 , 其中:是有哪些信誉好的足球投注网站树中结点的深度;为结点的数据库中错放的棋子个数;为结点的数据库中每个棋子与其目标位置之间的距离总和。 实验 问题描述: 八数码问题也称为九宫问题。在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。所谓问题的一个状态就是棋子在棋盘上的一种摆法。解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态。 发式有哪些信誉好的足球投注网站就是在状态空间中的有哪些信誉好的足球投注网站对每一个有哪些信誉好的足球投注网站的位置进行评估,得到最好的位置,再从这个位置进行有哪些信誉好的足球投注网站直到目标。这样可以省略大量无谓的有哪些信誉好的足球投注网站路径,提高了效率。在启发式有哪些信誉好的足球投注网站中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。,可以分成两个部分:n的估价函数定义为从初始节点、经过n、到达目标节点的路径的最小代价的估计值,即 = + 。 是从初始节点到达当前节点n的实际代价; 是从节点n到目标节点的最佳路径的估计代价。 所占的比重越大,越趋向于宽度优先或等代价有哪些信誉好的足球投注网站;反之,的比重越大,表示启发性能就越强。 (3)算法描述: 把起始节点SOPEN表中,并计算节点S的; 如果OPEN是空表,则失败退出,无解; 从OPEN表中选择一个值最小的节点。如果有几个节点值相同,当其中有一个 为目标节点时,则选择此目标节点;否则就选择其中任一个节点作为节点; 把节点OPEN 表中移出,并把它放入 CLOSED 的已扩展节点表中; 如果是个目标节点,则成功退出,求得一个解; 扩展节点,生成其全部后继节点。对于的每一个后继节点: 计算;如果 既不在OPEN表中,又不在CLOCED表中,则用估价函数把 它添入OPEN表中。从加一指向其父节点的指针,以便一旦找到目标节点时记住一个解答路径;如果已在OPEN表或CLOSED表中,则比较刚刚对计算过的和前面计算过的该节点在表中的值。如果新的较小,则 (I)以此新值取代旧值。 (II)从指向,而不是指向他的父节点。 (III)如果节点在CLOSED表中,则把它移回OPEN表中。 转向②,即GOTO②。 算法流程图: 实验结果 输入矩阵: 目标矩阵: 2 8 3 1 2 3 1 4 5 8 0 4 7 6 0 7 6 5 实验小结 通过本次试验,我对启发式有哪些信誉好的足球投注网站有了更加深入的了解。在实验中,通过对两种启发式有哪些信誉好的足球投注网站所扩在的节点数来看,看来比更加有效,能在复杂情况下求得更加优质的解,避免不必要的节点的扩展。所以,要更好地定义一个估价函数还有待深入讨论。 源代码: #includestdio.h #define num 3 //宏定义数码的行列数为3 /*显示当前待调整数码矩阵*/ void show(int begin[num][num]) { for(int i = 0; i num; i++) { for(int j = 0; j num; j++) printf(%d , begin[i][j]); printf(\n); } printf(\n); } /*交换数码中的 begin[row_one][column_one] 与 begin[row_two][column_two] 这两个数*/ void exchange(int begin[num][num], int row_one, int column_one, int row_two, int column_two) { int temp; temp = begin[row_two][column_two] ; begin[row_two][column_two] = begin[row_one][column_one]; begin[row_one][column_one] = temp; } /*判断待调整的数码与最终数码相比正确位置数码的个数*/ int judge(int begin[num][num], int end[num][num]) { int count=0; //count记录数码中正确位置的个数 for(int i = 0; i num; i++) //检查当前图形的正确度 for(int j = 0; j num; j++) { if(begin[i][j] == end[i][j]

文档评论(0)

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

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

1亿VIP精品文档

相关文档