文章目录

  • 错误描述
    • 错误分析
    • 效率
  • 找到的正确的代码
  • 个人维护的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修复、效率优化,添加了寻路用例、路径地图打印


Astar算法的Java实现 (其他很多都是错的,没有计入曼哈顿值的代价)相关推荐

  1. A*/AStar算法(Java实现)

    MyNode实体类 package lydia.astar;public class MyNode implements Comparable<MyNode> {private int x ...

  2. 【算法】A-star 算法摘录整合

    文章目录 1. 定义 1.1 定义解析 1.2 Dijkstra算法与最佳优先搜索 1.2.1 Dijkstra算法(距离起始点的信息) 1.2.2 最佳优先搜索(距离终点的信息) 1.2.3 以上两 ...

  3. Java培训深度学习都要学什么

    java的知识点有很多,如果是有java基础的同学,进行深度学习是非常有必要的,比较职场技能更新迭代非常的快,那么java培训深度学习都要学什么呢?来看看下面的详细介绍. Java培训深度学习都要学什 ...

  4. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  5. DES和RSA算法的java实现

    2019独角兽企业重金招聘Python工程师标准>>> 一.对称加密算法 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过 ...

  6. Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(

    2019独角兽企业重金招聘Python工程师标准>>> 在Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(百搜技术) 在Java ME游戏开发中,经常需要进行碰撞检测 ...

  7. java 3 9 2 6数字排序_GitHub - JourWon/sort-algorithm: 史上最全经典排序算法总结(Java实现)...

    史上最全经典排序算法总结(Java实现) 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗, ...

  8. java实现选择排序 带打印,选择排序算法的JAVA实现

    选择排序算法的JAVA实现 package Utils.Sort; /** *利用选择排序法对数组排序,数组中元素必须实现了Comparable接口. */ public class ChooseSo ...

  9. A-star 算法原理分析

    搜索算法 图论中,应用最广泛的就是搜索算法了,比如,深度优先搜索.广度优先搜索等.在介绍 Dijkstra 算法那篇中,除了深度优先.广度优先这种暴力搜索算法,还有一些最短路算法也可以求得最短路径,并 ...

  10. 算法转 Java 后端,2021秋招斩获腾讯、京东、百度等大厂 offer 面经分享

    这是一篇来自算法转Java后端的一位读者的投稿!文章主要分享了作者从迷茫崩溃到最终斩获腾讯.京东.百度等大厂 offer 的经历.文章内容很全面.真实,相信可以对正在准备面试的小伙伴有帮助! 看到公众 ...

最新文章

  1. 不能忽略的Nginx做web服务器的favicon.ico图像找不到问题
  2. 985博士:导师是院士,直到毕业,我们都没单独说过一句话
  3. 条形图与直方图的区别
  4. python和c哪个适合入门-Python和C先学哪个好?
  5. 岗位内推 | 微软亚洲互联网工程院自然语言处理组招聘
  6. mysql 写磁盘_图解MySQL | [原理解析] MySQL insert 语句的磁盘写入之旅
  7. 如何能出令自己满意的代码
  8. HDU - 6769-In Search of Gold-二分+树形dp
  9. 只需几分钟即可安装Red Hat Container Development Kit(视频)
  10. eclipse启动出现“An Error has Occurred. See the log file”解决方法
  11. 超松弛迭代法(C语言实现)
  12. 详解如何挑战4秒内百万级数据导入SQL Server(转)
  13. getAttribute 与getParmeter 区别
  14. 太干了,Android 抓包姿势总结!
  15. 数据大屏产品介绍PPT_精品推荐 | 产品介绍、公司宣传、解决方案 | 可编辑PPT(收藏)...
  16. python实现素数判断
  17. 大数据技术如何影响企业决策?
  18. uniapp数组已经更新到data页面不实时渲染问题
  19. Windows10添加自定义右键菜单(详细步骤)
  20. Linux计算节点怎么关闭,OpenStack 删除无用的计算结点

热门文章

  1. 2022华为杯数学建模A题思路代码
  2. 信号与系统19(拉普拉斯逆变换)
  3. Esri大赛必备:3度带6度带中央经线及带号换算问题
  4. 《Java疯狂讲义》重点及相关信息 第一章
  5. 云桌面计算机被锁定如何解决,桌面布局已锁定怎么解除?电脑桌面便签布局锁定后怎么解除?...
  6. 大漠插件最新版dm7.2135
  7. Maven 引入 ojdbc:ojdbc14-10.2.0.4.0.jar
  8. 工具 | Procexp工具使用及案例说明
  9. 任务调度:分布式调度引擎-DAGScheduleX简介
  10. linux 桌面时间,桌面锁屏时钟下载-桌面锁屏时钟appv2.8.1-Linux公社