[计算机软件及应用]最优合并and八数码问题Java.docVIP

[计算机软件及应用]最优合并and八数码问题Java.doc

  1. 1、本文档共58页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[计算机软件及应用]最优合并and八数码问题Java

文档编号:NUC-2012-A05A06-01 版 本: 作 者: 打印日期: 2013年1月4日 拷贝份数:1 最优合并问题 任务说明: 给定k个排好序的序列S1,S2…,Sk,用2路合并算法将这k个序列合并成一个序列。假设所采用的2路合并算法合并2个长度分别为m和n的序列需要m+n-1次比较。试设计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。 题目相关知识说明: 这个程序比较适合用堆,最优用最小堆,最差用最大堆。使用各序列的长度建堆,把堆中两个最小(最大)的元素出堆,计算这两序列合并需要的比较次数(本体采用二路合并算法,两个长度分别为m和n的序列需要m+n-1次比较),该次数入堆, 重复以上步骤,直到堆只剩下一个元素,最后剩下的元素即为题目的解。 相关知识: 堆可以定义为一颗二叉树,数的节点中包含键(每个节点一个键),并且满足以下两个条件: (1)树的形状要求——这棵二叉树为完全二叉树,即树的每层都是满的,除了最后一层最右边的元素有可能缺位。 (2)父母优势要求——对于最大堆,每个节点的键都要大于或等于它子女的键。 对于最小堆来说,每个节点都要小于或等于它子女的键。 堆也可以定义为一个数组H[1...n],数组的前半部分中,每个位置i上的元素,总是大于等于位置2i和2i+1 中的元素。 本题中堆使用数组来实现。 八数码问题 任务说明: 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标面局(目标状态),找到一种移动方法,实现从初始布局到目标布局的转变。 题目相关知识说明: 状态用二维数组来表示布局比较直观,S(i,j)表示第i行第j列格子上放的棋子数字。空格则用0来表示。 输入一种状态作为当前状态,从当前状态出发,采用广度优先搜索策略进行搜索。在搜索过程中,问题的状态用结点描述需要使用一个队列存储搜索的中间结点,为了在找到目标结点后,能够找到从初始结点到目标结点的路径,需要保留所有搜索过的结点搜索算法中。 结点中除了描述状态的数组外,还有一个父结点指针last,它记录了当前结点的父结点编号在到达目标结点后,通过last 可以找出搜索的路径 移动规则: 根据题意空格周围的棋子可以向空格移动。为便于解决问题,显然从另一个角度来看,“空格周围的棋子可以向空格移动”相当于“空格向四周移动”,这样就把四枚棋子的移动转化为一个空格的移动,从而便于问题的处理。设空格位置在(i0,j0),则根据题意有四条移动规则: (1)空格向上移动。If i0-1=1 then s(i0,j0):=s(i0-1,j0); s(i0-1,j0):=0 (2)空格向下移动。If i0+1=3 then s(i0,j0):=s(i0+1,j0); s(i0+1,j0):=0 (3)空格向左移动。If j0-1=1 then s(i0,j0):=s(i0,j0-1); s(i0,j0-1):=0 (4)空格向右移动。If j0+1=3 then s(i0,j0):=s(i0-1,j0); s(i0,j0+1):=0 搜索步骤: (1)把初始状态作为当前状态; (2)从当前状态出发,运用四条移动规则,产生新的状态; (3)判断新的状态是否达到目标状态,如果是,转(5); (4)把新的状态记录下来,取出下一个中间状态作为当前状态,返回(2); (5)输出从初始状态到目标状态的路径,结束。 常用的搜索策略有广度优先搜索、深度优先搜索和启发式搜索三种策略。前两种搜索策略属于盲目搜索,效率低,而且在很多情况下得不到解!而启发式搜索根据贪婪技术,每一步选择的都是最好的与目标节点最近的节点。 对于任意给定的一组数,用0代表空格,则九宫图初始状态为数0~8的一个排列,记为 n0 n1 n2 n3 n4 n5 n6 n7 n8 使用线性代数的有关理论可以证明,与目标结点逆序数( 这里的逆序数计算不包括0)奇偶性相同的八数码才可通过一定的移动到达目标状态,也即对于任一个目标状态节点,只有(1/2)×91=181440个状态有解。 相应的剪枝函数: 八数码问题中,每个数字可以有9个不同的位置,因此,在任意状态中的每个数字和目标状态中同一数字的相对距离就有9*9种,可以先将这些相对距离算出来,用一个矩阵存储,这样只要知道两个状态中同一个数字的位置,就可查出它们的相对距离,也就是该数字的偏移距离: 本题所采用的剪枝函数是计算每个位置移动到目标状态相应位置所走的步数之和,即曼哈顿距离。通过计算每个节点

文档评论(0)

skvdnd51 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档