【问题标题】:Implement A star (A*) path algorithm in large map, low performance在大地图中实现A星(A*)路径算法,性能低
【发布时间】:2016-01-26 10:18:42
【问题描述】:

我正在使用这个 A 星 (A*) Pathfinder.java 在 Android 地图应用程序中计算和生成我的路线。 https://github.com/xSmallDeadGuyx/SimpleAStar/blob/master/Pathfinder.java

地图的尺寸​​很大,尺寸在 8000x8000 左右,当我使用 A 星 Pathfinder.java 计算地图中从一个点到另一个点的路线时。

A 星 Pathfinder 1 比 1 计算并用于大地图 (8000x8000),性能/计算速度相当低/慢(效率不高)。我尝试将计算量增加到 100 乘 100,它工作正常,但绘制的路线路径曲线不平滑。

是否有任何方法可以使用 A 星算法或任何其他解决问题的建议来提高路线计算性能?我需要帮助来解决问题。

【问题讨论】:

    标签: android a-star


    【解决方案1】:

    实施:如果您正在寻找代码审查,请将工作代码发布到 CodeReview.StackExchange.com。他们可能会给你一些优化技巧。

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

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

    此外,如果世界是静态的(即布局是已知的先验),您可以预先计算大量信息以帮助加快搜索速度。存在几种算法来完成这项任务。 Swamps 是一种预先计算容易被不必要搜索的区域(即沼泽​​)的方法。除非进出沼泽,否则不需要在运行时搜索这些区域。沼泽地的加速很大程度上取决于世界的地形。更具欺骗性的地图(即倾向于将搜索引向沼泽的地图)有很多好处。

    另一种方法是使用分层寻路方法,例如HPA*。这可能会在与您一样大的地图(8000x8000,哎呀)上显着提高性能。 HPA* 通过将区域分组到链接的本地集群并计算跨越集群边界的成本先验进行操作。然后,搜索在多个级别进行:高级工作通过利用预先计算的成本来集中搜索,而低级工作确定将使用的确切路径。

    此外,存在通过利用运行时环境的特征来减少 A* 探索的节点数量的算法。例如,Jump Point Search (JPS) 利用了网格图(如您正在使用的)经常呈现对称性这一事实。如果您的世界中的移动成本不变,那么 JPS 可以在搜索中“跳过”许多节点,并大大减少搜索时间。我已经看到它将 A* 搜索时间减少了 24 倍,其他人看到了超过 30 倍的改进。

    最后一点:据我所知,您使用的是 L1 路径(即 4 个基本方向)。通过预处理航路点之间的路径和使用差分启发式方法,您可能会获得很多好处。请参阅 this article 以获取演示以及对 JavaScript 实现 here 的讨论。

    其他链接:

    【讨论】:

    • 非常感谢您为我提供了所有信息。我会阅读并尝试所有这些,希望它可以帮助我解决我的问题。
    猜你喜欢
    • 2011-06-05
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多