在大地图上实现A*路径算法,性能低下

4
我正在使用这个A星(A*)Pathfinder.java在Android地图应用中计算并生成我的路线。 https://github.com/xSmallDeadGuyx/SimpleAStar/blob/master/Pathfinder.java 地图的尺寸很大,大约为8000x8000。当我在地图上使用A星路径查找算法来计算从一个点到另一个点的路径时,性能/计算速度非常低/慢(不高效)。我尝试将计算量增加到100x100,它可以正常工作,但曲线路径不够平滑。
有没有办法提高A星算法的路径计算性能或其他建议来解决问题?我需要帮助来解决这个问题。
1个回答

7

实现: 如果你正在寻找代码审查,请在CodeReview.StackExchange.com上发布工作代码。他们可能会给你一些优化建议。

算法: 以下是从算法角度考虑的几个因素。

首先,看一下你的启发式算法。如果启发式算法估计过低,则A*退化为Dikstra算法。如果启发式算法估计过高,则A*退化为贪婪最佳优先搜索。一个具有可接受启发式算法的A*位于中间:它产生了最优路径,但保持最优性需要额外的计算时间。如果你愿意牺牲最优性,可以选择一个启发式算法,它有时会高估到目标的距离。这样做,路径不能保证是最优的,但算法的贪婪性能够减少执行时间。

此外,如果世界是静态的(即布局是已知的先验),则可以预先计算大量信息以帮助加速搜索。有几种算法可以完成这项任务。Swamps 是一种方法,它预先计算出 tend to be searched needlessly 的区域(即沼泽)。除非进入或离开沼泽,否则无需在运行时搜索这些区域。Swamps 带来的加速效果严重依赖于世界的地形;更具欺骗性的地图(即倾向于将搜索引导到沼泽的地图)受益更大。

另一种方法是使用分层路径搜索方法,例如HPA*。在你的地图上(8000x8000,呜呜),这可能会显著提高性能。HPA* 通过将区域分组成链接的本地集群,并预先计算穿越集群边界的成本来操作。然后,搜索在多个级别进行:高级工作通过利用预计算的成本来聚焦搜索,低级工作确定将要使用的确切路径。

此外,还存在一些算法,可以通过在运行时利用环境特征来减少A*所探索的节点数。例如,Jump Point Search (JPS) 利用了网格图(像你正在使用的那种)经常展现出对称性这一事实。如果你的世界中的移动具有恒定的成本,JPS可以在搜索中“跳过”许多节点,并将搜索时间减少相当多。我曾看到它将A*搜索时间缩短了24倍,其他人则看到了超过30倍的改进。

最后需要注意的一点是:从我所了解到的来看,您正在使用L1路径(即4个基本方向)。通过在路标之间进行路径预处理并使用微分启发式,您可能会获得更多收益。请参阅此文章以获取演示和JavaScript实现讨论的信息,请点击这里

附加链接:


非常感谢您提供给我的所有信息。我会阅读并尝试所有这些,希望它们能帮助我解决我的问题。谢谢! - FrancisOrb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接