编程语言
首页 > 编程语言> > android – 在大型地图中实现星型(A *)路径算法,性能低下

android – 在大型地图中实现星型(A *)路径算法,性能低下

作者:互联网

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

当我使用A星的Pathfinder.java来计算地图中从一个点到另一个点的路线时,地图的大小很大,尺寸大约为8000×8000.

A星探路者计算1乘1并用于大地图(8000×8000),性能/计算速度相当低/慢(效率不高).我试图将计算增加到100乘以100,它工作正常,但绘制的路径路径在曲线上不平滑.

无论如何使用A星算法或任何其他建议来改善路线计算性能来解决问题?我需要帮助才能解决问题.

解决方法:

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

算法:从算法的角度来看,这是几个考虑因素.

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

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

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

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

最后一点:从我所知道的,你正在使用L1路径(即4个主要方向).通过预先处理航点之间的路径和使用差分启发式,您可能会获得很多好处.有关演示和JavaScript实现here的讨论,请参阅this article.

其他链接:

> Great visualizations of JPS in action
> More info for JPS
> Variations of A*
> Amit’s A* Pages: the best A* resource I know
> How to speed up A* blog post

标签:a-star,android
来源: https://codeday.me/bug/20190824/1706347.html