目录

一、问题描述

二、算法简介

三、算法步骤

四、评估函数

五、参考资料

六、源代码(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数码问题

15数码 java_A*算法求解15数码问题相关推荐

  1. 【人工智能导论】A*算法求解15数码问题 Java

    完整源码 - Eclipse项目文件 - GitHub地址 题目描述 关于本算法 两个晚上写完的,不足之处多多指教- 启发函数的选择: 一开始选用不在位数码个数+节点深度作为启发函数,效果不是很好. ...

  2. A*算法求解15数码问题

    目录 一.问题描述 二.算法简介 三.算法步骤 四.评估函数 五.参考资料 六.源代码(Java实现) 一.问题描述 利用A*算法进行表1到表2的转换,要求空白块移动次数最少. 转换规则为:空白块只可 ...

  3. 【人工智能实验】A*算法求解8数码问题

    目录 实验一 A*算法求解8数码问题 一.实验目的 二.实验原理 三.实验结果 四.实验总结 附录代码 推荐文章 实验一 A*算法求解8数码问题 一.实验目的 熟悉和掌握启发式搜索的定义.估价函数和算 ...

  4. A*算法求解N数码问题(AI实验一)

    1.实验题目 A*算法求解N数码问题,要求程序内,输入给定初始状态和目标状态,输出所需步数,过程状态及时间(程序可直接运行,无需再手动输入). 2.实验目的及要求 熟悉和掌握启发式搜索的定义.估价函数 ...

  5. Python利用A*算法解决八数码问题

    资源下载地址:https://download.csdn.net/download/sheziqiong/86790565 资源下载地址:https://download.csdn.net/downl ...

  6. 7段并行数码管显示实验C语言,七段数码管显示十进制数字 (15)

    实验报告 实验题目 设有10个开关,编号分别为0,1,--,9. 设计电路实现某开关闭合时对应显示相应的十进制数字.要求:(1)写出设计说明,(2)用 Proteus或Multisim仿真. 实验方案 ...

  7. 八数码问题a*算法c语言,八数码问题的A*算法求解

    A*算法是启发式搜素算法中较为出名和高效的算法之一,其关键是对于启发式函数的实际,启发式函数h(x)需要尽可能的接近实际的 .下面是人工智能八数码问题使用A*算法求解的源码放在博客上记录一下.程序使用 ...

  8. Python实现A*算法解决N数码问题

    Python实现A*算法解决N数码问题 A*算法的描述 A*算法的步骤 问题描述 代码以及测试结果 算法优势 算法存在一些不足 A*算法的描述 A*算法是BFS的一个变种,它把原来的BFS算法的无启发 ...

  9. 人工智能作业 - A*算法程序求解八数码

    文章目录 A*算法 简介 思路 A*伪代码 八数码问题 题目描述 注意事项 实验过程 解决思路 伪代码 二维压缩为一维 检查是否有解 其他 代码实现 h1和h2的对比 关于曼哈顿距离 参考链接 A*算 ...

最新文章

  1. Linux命令应用大词典-第1章 登录、退出、关机和重启
  2. 使用AOP动态调用WebService
  3. BitcoinCore JSONRPC Java使用,创建账号,获取余额,转账等等...
  4. java常见异常总结---自己工作中经常遇到的一些异常
  5. 【渝粤题库】广东开放大学 java web开发技术 形成性考核
  6. struts2之值栈
  7. 在Python中最快的HTTP GET方法是什么?
  8. bfs--最小步数--青蛙
  9. js获取url参数方法
  10. HTML5实践 -- 可伸缩的mobile搜索框
  11. DM368开发 -- 毕设之硬件
  12. 五年上市路,君亭才刚刚出发
  13. Python百度文库爬虫之doc文件
  14. 面试阿里,总结vue实现打印功能的两种方法,成功拿下offer!
  15. 随机梯度下降法的数学基础
  16. 随便输入两个单词,两个单词之间以空格隔开,输出时每个单词的首字母变为大写。如输入:“hello java”,输出为“Hello Java”
  17. JAVA 中IO总结 之前篇阻塞、非阻塞
  18. AndroidStudio按钮实现点击响应详细代码
  19. 几种限流、控频策略对比
  20. MindSpore Science科学计算行业套件——MindSpore Elec电磁仿真套件

热门文章

  1. JavaScript 编码规范大全-Eslint(持续更新,欢迎关注点赞加评论)
  2. 第一位女性商业程序员玛丽库姆斯去世,享年 93 岁
  3. 为什么说 Rust 是编程的未来?
  4. 一个小爱好竟然改变了全世界!Linux30年都经历了什么?
  5. Maven 依赖冲突踩坑后,将依赖调解、类加载彻底整明白了
  6. 查漏补缺!这份 VUE 学习知识总结请注意查收! | 原力计划
  7. 15 岁黑进系统,发挑衅邮件意外获 Offer,不惑之年捐出全部财产,Twitter CEO 太牛了!...
  8. 收藏!MySQL 面试必须掌握的 8 个知识点!
  9. 如何用Python画一只机器猫?| 原力计划
  10. 编程工作枯燥、代码质量不高?华为云 MVP 来支招!