A*算法求解15数码问题
目录
一、问题描述
二、算法简介
三、算法步骤
四、评估函数
五、参考资料
六、源代码(Java实现)
一、问题描述
利用A*算法进行表1到表2的转换,要求空白块移动次数最少。
转换规则为:空白块只可以与上下左右四个方向的相邻数字交换。
表1 起始状态 表2 目标状态
二、算法简介
A*算法是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。该算法综合了Best-First Search和Dijkstra算法的优点:在进行启发式搜索提高算法效率的同时,基于评估函数计算损失,保证找到一条最优路径。
算法能否找到最优解的关键在于评估函数的选择,A*算法的评估函数表示为:f(n) = g(n) + h(n)
f(n) 是从初始状态经由状态n到目标状态的代价估计
g(n) 是在状态空间中从初始状态到状态n的实际代价
h(n) 是从状态n到目标状态的最佳路径的估计代价
例如在8数码问题中,g(n) 表示状态空间树中搜索的层数,h(n) 表示状态n与目标状态中元素位置不同的元素个数。
三、算法步骤
设定两个集合,open集,close集
1. 将起始点加入open集(设置父亲节点为空)
2. 在open集中选着一个f(n)值最小的节点作为当前节点
2.1 将当前节点从open集中移除,添加到close集
2.2 如果当前节点为终点节点,那么结束搜索
2.3 处理当前节点的所有邻接节点,规则如下:
如果不在open集中,那么就将其添加到open集,并将该节点的父节点为当前节点
如果已经添加到open集中,重新计算f(n)值,如果f(n)值小于先前的f(n)值,那么就更新open集中相应节点的f(n)
如果该节点不可通过或者已经被添加到close集,那么不予处理
3、如果open集不为空,那么转到步骤2继续执行。
四、评估函数
1. f(n) = 状态n状态空间树中的搜索深度 + 状态n与目标状态不同的元素个数
效果:与8数码问题使用了相同的评估函数,大概跑了30W步无法求出解
评价:效果极差,15数码问题的状态空间树要远复杂于8 数码问题,且15数码问题中空白块的移动更为复杂,此评估函数不适用。
2. f(n) = 状态n状态空间树中的搜索深度 + 状态n与目标状态各个位置数字偏差的绝对值
效果:随着搜索的进行,空白块的移动集中在表格上部,表格下部几乎不移动 ,无法求出解
评价:因为下部数字较大,移动后差值较大造成评估值较大,因此搜索集中在了数值较小的部分,效果很差。
3. f(n) = 状态n状态空间树中的搜索深度 + 状态n与目标状态各个元素的路径差值(一维数组各元素的距离差之和)
效果:空白块最终移动55步得到目标状态。
评价:效果比较理想,但h(n)还可继续优化。
4. f(n) = 状态n状态空间树中的搜索深度 + 状态n与目标状态各个元素的曼哈顿距离
效果:空白块最终移动41步得到目标状态。
评价:效果理想。
实际上,1和2的评估函数效果大致相同,都将搜索局限在了一部分导致无法计算出问题的解。3实际是以一维数组各元素的距离差之和估计状态n到目标状态的曼哈顿距离,但此估计方式和计算平面两点的曼哈顿距离存在较大误差,因此只求解出可行解。
五、参考资料
A*算法详解,看完后全懂了
启发式搜索浅谈,解决八数码问题
六、源代码(Java实现)
Github地址:A*算法求解15数码问题
A*算法求解15数码问题相关推荐
- 【人工智能导论】A*算法求解15数码问题 Java
完整源码 - Eclipse项目文件 - GitHub地址 题目描述 关于本算法 两个晚上写完的,不足之处多多指教- 启发函数的选择: 一开始选用不在位数码个数+节点深度作为启发函数,效果不是很好. ...
- 15数码 java_A*算法求解15数码问题
目录 一.问题描述 二.算法简介 三.算法步骤 四.评估函数 五.参考资料 六.源代码(Java实现) 一.问题描述 利用A*算法进行表1到表2的转换,要求空白块移动次数最少. 转换规则为:空白块只可 ...
- 【人工智能实验】A*算法求解8数码问题
目录 实验一 A*算法求解8数码问题 一.实验目的 二.实验原理 三.实验结果 四.实验总结 附录代码 推荐文章 实验一 A*算法求解8数码问题 一.实验目的 熟悉和掌握启发式搜索的定义.估价函数和算 ...
- A*算法求解N数码问题(AI实验一)
1.实验题目 A*算法求解N数码问题,要求程序内,输入给定初始状态和目标状态,输出所需步数,过程状态及时间(程序可直接运行,无需再手动输入). 2.实验目的及要求 熟悉和掌握启发式搜索的定义.估价函数 ...
- python解决八数码问题_A*算法解决15数码问题_Python实现
1问题描述 数码问题常被用来演示如何在状态空间中生成动作序列.一个典型的例子是15数码问题,它是由放在一个4×4的16宫格棋盘中的15个数码(1-15)构成,棋盘中的一个单元是空的,它的邻接单元中的数 ...
- 15数码问题(A*算法)
一.题目 设计一个启发函数,利用A*算法求解15数码问题. 初始状态 5 1 2 4 9 6 3 8 13 15 10 11 14 0 7 12 目标状态 1 2 3 4 5 6 7 8 9 10 1 ...
- Python利用A*算法解决八数码问题
资源下载地址:https://download.csdn.net/download/sheziqiong/86790565 资源下载地址:https://download.csdn.net/downl ...
- 八数码问题a*算法c语言,八数码问题的A*算法求解
A*算法是启发式搜素算法中较为出名和高效的算法之一,其关键是对于启发式函数的实际,启发式函数h(x)需要尽可能的接近实际的 .下面是人工智能八数码问题使用A*算法求解的源码放在博客上记录一下.程序使用 ...
- Python实现A*算法解决N数码问题
Python实现A*算法解决N数码问题 A*算法的描述 A*算法的步骤 问题描述 代码以及测试结果 算法优势 算法存在一些不足 A*算法的描述 A*算法是BFS的一个变种,它把原来的BFS算法的无启发 ...
最新文章
- ace unlock 苹果解锁_【曝光】苹果iPhone最新专利:全屏指纹解锁,保留人脸识别...
- bios get serialnumber 无法启动服务_联想笔记本BIOS升级教程
- go web本地化资源
- 好多人都说存储过程很难?认真看这篇文章就够了
- 漫话:如何给女朋友解释什么是适配器模式?
- Python全栈之路--Django ORM详解
- 将Nginx加入service服务中
- SVN教程代码比较(图文教程)
- DPDK示例l3fwd性能测试
- 冰点还原精灵手工强制删除方法
- SpringBoot项目:抽奖精灵
- 【业务安全03】密码找回业务安全
- 沟通管理--关于信息的有效传递和维护
- 微型计算机中常见到的Ega.VGA等是指,大学计算机基础选择题汇总
- 论文水记|How to Train Triplet Networks with 100K Identities?
- 苹果计算机能打出分数吗,Apple M1芯片安兔兔跑分曝光:分数打破安兔兔记录
- 渗透测试实践指南:必知必会的工具与方法学习笔记(二)——扫描
- UML图及UML工具使用技巧
- 贵州省毕节市谷歌卫星地图下载
- AI教程之 Stable Diffusion在自己电脑上运行稳定的AI自动艺术创作
热门文章
- linux下运行win10效果好不好,Win10不好用?继续坚守Win7的人依然巨多
- VC++开发垃圾文件清理软件之三:程序的界面设计与实现----对话框界面
- O2耳放 DIY 模拟放大
- 老婆小厂程序媛竟想在北京买房!
- 山石网科Hillstone防火墙L2TP over ***详细配置步骤(官方最新版)
- 疯子的匣子_人工智能扮演``疯子''来像孩子一样学习语法
- 工作站启动不起来的解决方案
- 软件测试建模:Google ACC
- c++操作符重载,拷贝构造函数和友…
- Waymo van参与亚利桑那州的严重碰撞