Astar算法的Java实现 (其他很多都是错的,没有计入曼哈顿值的代价)
文章目录
- 错误描述
- 错误分析
- 效率
- 找到的正确的代码
- 个人维护的Astar仓库
看懂本文的前提是了解清楚A星算法的原理
推荐这篇 A星算法详解(个人认为最详细,最通俗易懂的一个版本)
错误描述
项目里的寻路算法是主程(已经走了)从网上直接copy下来用的
简单测试了下,以80*80
的地图为例,发现从(0,0)到((30,30)
之间随便找个起点,到终点(length-1,length-1)
的路径全都寻不到
排查到问题之后挺无语,百度搜到的Java实现的Astar算法都一模一样,计算出的曼哈顿值都没乘代价10就直接当做H使用,不止有很多路寻不到,并且还会产生大量(非常大量)多余的消耗 (断点分析时发现有异常大量的结点被加入到closeList,地图越大越多、消耗越大)。稍后会分析错误是如何产生的
2021.07.28 补充
通过查询到的错误资料的时间推断,大概率认为是各路"神仙"从这个github复制的代码:仓库链接
经过和作者沟通,确定了是有错误的。相关issues:issue#1、issue#3
我也创建了一个仓库对该实现进行了bug修复、效率优化并进行以后的维护:仓库链接
贴几个无脑复制的错误示例,目的是让大家找资料的时候不要拿来就用
错误分析
简单举个例子,当曼哈顿值不乘代价直接作为H值来用时,造成最直接的问题就是 会取到错误的最优点
假设在12*12的无障碍物地图中,从(4,4)寻路到(11,11)
(4,4)周围的八个格子中,理论上最优点(F值最小的点)应该是(5,5)
而实际在这个错误的算法中最优点会变成(4,5)
因为曼哈顿值不乘10(DIRECT_VALUE横竖移动代价)而直接作为H使用,是这样的:(4,5)的G=10,H=13;(5,5)的G=14,H=12;明显10+13 < 14+12
乘上DIRECT_VALUE再看:(4,5)的G=10,H=130;(5,5)的G=14,H=120;明显10+130 > 14+120
在整个算法过程中,这会导致有非常多错误的最优点,产生大量没用的分析计算,资源浪费非常严重,并且经常寻不到路
效率
下面对比一下错误代码和进行修复之后的代码(具体实现思路都一样,进行了修复和效率优化)
差距非常悬殊 (再次吐槽无脑复制)
消耗大的是网上错误的代码(曼哈顿值直接作为H使用),不仅非常慢,还会有很多点寻不到
消耗小的是正确的代码(曼哈顿值乘代价(10)作为H)
找到的正确的代码
百度筛选截止到16年的博文,基本都是正确的实现
如 A*算法的java实现
个人维护的Astar仓库
github:wushu037/java-astar
对原有实现进行了bug修复、效率优化,添加了寻路用例、路径地图打印
MyNode实体类 package lydia.astar;public class MyNode implements Comparable<MyNode> {private int x ... 文章目录 1. 定义 1.1 定义解析 1.2 Dijkstra算法与最佳优先搜索 1.2.1 Dijkstra算法(距离起始点的信息) 1.2.2 最佳优先搜索(距离终点的信息) 1.2.3 以上两 ... java的知识点有很多,如果是有java基础的同学,进行深度学习是非常有必要的,比较职场技能更新迭代非常的快,那么java培训深度学习都要学什么呢?来看看下面的详细介绍. Java培训深度学习都要学什 ... 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ... 2019独角兽企业重金招聘Python工程师标准>>> 一.对称加密算法 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过 ... 2019独角兽企业重金招聘Python工程师标准>>> 在Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(百搜技术) 在Java ME游戏开发中,经常需要进行碰撞检测 ... 史上最全经典排序算法总结(Java实现) 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗, ... 选择排序算法的JAVA实现 package Utils.Sort; /** *利用选择排序法对数组排序,数组中元素必须实现了Comparable接口. */ public class ChooseSo ... 搜索算法 图论中,应用最广泛的就是搜索算法了,比如,深度优先搜索.广度优先搜索等.在介绍 Dijkstra 算法那篇中,除了深度优先.广度优先这种暴力搜索算法,还有一些最短路算法也可以求得最短路径,并 ... 这是一篇来自算法转Java后端的一位读者的投稿!文章主要分享了作者从迷茫崩溃到最终斩获腾讯.京东.百度等大厂 offer 的经历.文章内容很全面.真实,相信可以对正在准备面试的小伙伴有帮助! 看到公众 ...Astar算法的Java实现 (其他很多都是错的,没有计入曼哈顿值的代价)相关推荐
最新文章
热门文章