电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > PDF文档下载
分享到微信 分享到微博 分享到QQ空间

用A星算法解决八数码问题

  • 资源ID:51733106       资源大小:386.79KB        全文页数:12页
  • 资源格式: PDF        下载积分:20金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要20金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

用A星算法解决八数码问题

A*算法解决八数码问题1 问题描述1.1 什么是八数码问题 八数码游戏包括一个3× 3 的棋盘,棋盘上摆放着8 个数字的棋子,留下一个空位。与空位相邻的棋子可以滑动到空位中。游戏的目的是要达到一个特定的目标状态。标注的形式化如下:1 2 3 4 5 6 7 8 1.2 问题的搜索形式描述 状态 :状态描述了8 个棋子和空位在棋盘的9 个方格上的分布。初始状态 :任何状态都可以被指定为初始状态。操作符 :用来产生4 个行动(上下左右移动)。目标测试 :用来检测状态是否能匹配上图的目标布局。路径费用函数:每一步的费用为1,因此整个路径的费用是路径中的步数。现在任意给定一个初始状态,要求找到一种搜索策略,用尽可能少的步数得到上图的目标状态。1.3 解决方案介绍1.3.1 算法思想估价函数是搜索特性的一种数学表示,是指从问题树根节点到达目标节点所要耗费的全部代价的一种估算,记为f(n)。估价函数通常由两部分组成,其数学表达式为f(n)=g(n)+h(n) 其中 f(n) 是节点 n 从初始点到目标点的估价函数,g(n) 是在状态空间中从初始节点到n 节点的实际代价,h(n) 是从 n 到目标节点最佳路径的估计代价。保证找到最短路径(最优解)的条件,关键在于估价函数h(n) 的选取。估价值h(n)实际值 , 搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。搜索中利用启发式信息,对当前未扩展结点根据设定的估价函数值选取离目标最近的结点进行扩展,从而缩小搜索空间,更快的得到最优解,提高效率。1.3.2 启发函数进一步考虑当前结点与目标结点的距离信息,令启发函数h ( n )为当前 8 个数字位与目标结点对应数字位距离和(不考虑中间路径),且对于目标状态有h ( t ) = 0,对于结点 m 和 n (n 是 m 的子结点)有 h ( m ) h ( n ) #include #include #include #include #include #include using namespace std;/* item记录搜索空间中一个结点state 记录用整数形式表示的8 数码格局blank 记录当前空格位置,主要用于程序优化,扩展时可不必在寻找空格位置g, h 对应 g(n), h(n) pre 记录当前结点由哪个结点扩展而来*/ struct item int state; int blank; int g; int h; int pre; ; const int MAXSTEPS = 100000; const int MAXCHAR = 100; char bufMAXCHARMAXCHAR; /open表item openMAXSTEPS; int steps = 0; /closed表,已查询状态只要知道该状态以及它由哪个结点扩展而来即可,用于输出路径/ 每次只需得到对应f 值最小的待扩展结点,用堆实现提高效率pair closedMAXSTEPS; / 读入,将8 数码矩阵格局转换为整数表示bool read(pair if (!gets(buf1) return false; if (!gets(buf2) return false; assert(strlen(buf0) = 5 state.first = 0; for (int i = 0, p = 1; i b.g + b.h; ; / 将整数形式表示转换为矩阵表示输出void pr(int state) memset(buf, ' ', sizeof(buf); for (int i = 0; i = 0 char tmp100; int i, x, y, a, b, nx, ny, end, next, index, kase = 0; pair start, target; item head; /4个方向移动时的偏移量const int xtran4 = -1, 0, 1, 0; const int ytran4 = 0, 1, 0, -1; const int p = 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000; while (read(start) unsigned int t2 = clock(); printf(“Case %d:nn“, +kase); gets(tmp); read(target); gets(tmp); / 初始化 open表,将初始状态加入open0.state = start.first; open0.h = calculate(start.first, target.first); open0.blank = start.second; open0.pre = -1; open0.g = 0; index = 0; states.insert(start.first); / 提取 open 表中 f 值最小元素放入closed表,并对该结点进行扩展for (end = 1; end > 0; +index) assert(index < MAXSTEPS); / 临时存储head = open0; / 放入 closed表记录当前格局和由哪个结点扩展而来(该结点肯定已在 closed表中)closedindex.first = open0.state; closedindex.second = open0.pre; / 从 open 表中删除该结点pop_heap(open, open + end, cmp(); -end; / 得到结果,递归输出路径if (head.state = target.first) path(index); break; x = head.blank / 3; y = head.blank % 3; for (i = 0; i < 4; +i) nx = x + xtrani; ny = y + ytrani; if (suit(nx, ny) a = head.blank; b = nx * 3 + ny; / 调换十进制表示整数对应两个数字位next = head.state + (head.state % pa + 1) / pa - (head.state % pb + 1) / pb) * pb + (head.state % pb + 1) / pb - (head.state % pa + 1) / pa) * pa; / 判断是否已经扩展过if (states.find(next) = states.end() states.insert(next); openend.pre = index; openend.blank = b; openend.state = next; openend.h = calculate(next, target.first); openend.g = head.g + 1; +end; push_heap(open, open + end, cmp(); if (end <= 0) puts(“No solution“); else printf(“Num of steps: %dn“, steps); printf(“Num of expanded: %dn“, index); printf(“Num of generated: %dn“, index + end); printf(“Time consumed: %dnn“, clock() - t2); states.clear(); steps = 0; printf(“Total time consumed: %dn“, clock() - t1); return 0; 系统中间及最终输出结果输入 3 1 2 4 0 5 6 7 8 输入 3 1 2 4 7 5 6 8 0 输入 3 7 2 8 1 5 4 6 0 输入 1 2 3 4 5 6 7 8 0

注意事项

本文(用A星算法解决八数码问题)为本站会员(飞***)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.