【问题标题】:Is A-star guaranteed to give the shortest path in a 2D gridA-star 是否保证在 2D 网格中给出最短路径
【发布时间】:2013-04-21 04:39:00
【问题描述】:

我正在使用 A-star 算法,其中我有一个 2D 网格和一些障碍物。现在,我只有垂直和水平障碍物,但它们可能变化很大。

现在,A-star 运行良好(即大多数情况下找到的最短路径),但如果我尝试从左上角到达右下角,那么我有时会看到,路径不是最短的,即那里是路上有些笨拙。

路径似乎偏离了应该是最短路径的路径。

现在这就是我正在用我的算法做的事情。我从源开始,在计算邻居值的同时向外移动,对于到源的距离+到目的地的距离,我不断选择最小的单元格,并不断重复,直到我遇到的单元格是目的地,此时我停下来。

我的问题是,为什么 A-star 不能保证给我最短路径。或者是吗?我做错了什么?

谢谢。

【问题讨论】:

    标签: algorithm path-finding a-star


    【解决方案1】:

    A-star 保证根据您的度量函数提供最短路径(不一定是“像鸟儿一样飞行”),前提是您的启发式是“可接受的”,这意味着它永远不会高估剩余距离。

    查看此链接:http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html

    为了帮助确定您的实施错误,我们需要有关您的指标和启发式的详细信息。

    更新
    OP 的度量函数是 10 用于正交移动,14 用于对角线移动。

    OP 的启发式只考虑正交移动,因此是“不可接受的”;它通过忽略更便宜的对角线移动而高估了。

    过于保守的启发式方法的唯一代价是在找到最小路径之前访问了额外的节点;过度激进的启发式方法的代价是可能返回的非最优路径。 OP 应该使用以下启发式方法:

            7 * (deltaX + deltaY)
    

    这略微低估了直接对角路径的可能性,因此也应该是高性能的。

    更新 #2:
    要真正挤出性能,这接近于最佳值,同时仍然非常快:

    7 * min(deltaX,deltaY) + 10 * ( max(deltaX,deltaY) - min(deltaX,deltaY) )

    更新 #3:
    上面的 7 源自 14/2,其中 14 是指标中的对角线成本。

    只有你的启发式改变;该指标是“业务规则”,并驱动所有其余部分。如果您对六边形网格的 A-star 感兴趣,请在此处查看我的项目:http://hexgridutilities.codeplex.com/

    更新 #4(关于性能):
    我对 A-star 的印象是,它在 O(N^2) 性能区域和几乎 O(N) 性能区域之间交错。但这太依赖于网格或图形、障碍物的位置以及起点和终点,很难一概而论。对于已知特定形状或风格的网格和图形,有多种更有效的算法,但它们通常也会变得更复杂; TANSTAAFL

    【讨论】:

    • @Pieter Geerkens fromSource=fromSourceOfParent+10(用于水平或垂直移动);或 14(用于倾斜运动) fromDestination = 10*(positiveDifference(destY,currentY) + positiveDifference(destX,currentX));
    • 大声笑-您的关键字字符串非常出色,我已经对您的答案投了赞成票! ;)
    • 是的,只有你的启发式改变;您的指标是“业务规则”,其余的都干了。如果您对六边形网格的 A-tar 感兴趣,请在此处查看我的项目:hexgridutilities.codeplex.com
    • 我签字前的最后一件事。如果使用这种启发式方法和指标,我要根据网格(N)的大小来找到寻路算法的运行时间性能(平均值)。有没有可能,找到了。我问了很多次,但从来没有真正得到满意的答案。谢谢。
    • 好吧,我猜,最坏的情况是我会遇到网格的所有单元格,即 N^2。乘以每个网格所花费的时间。
    【解决方案2】:

    我确定你做错了什么(也许是一些实现缺陷,你的 A* 想法听起来是正确的)。 A* 保证给出了最短路径,可以用数学证明。

    查看此wiki pages 将为您提供解决问题的所有信息。

    【讨论】:

      【解决方案3】:

      没有

      A* 是最快的探路者算法之一,但它不一定给出最短路径。如果您正在寻找随着时间推移的正确性,那么最好使用 dijkstra 算法。

      【讨论】:

      • A* 保证在满足条件的情况下找到最短路径(即,如果您使用的是可接受的启发式算法)。
      • ^ 使用正确的启发式 A* 可以保证最短路径,使用错误的启发式 A* 仍然可以保证最短路径,但只是 BFS,使用不同的启发式 A* 可以为您提供一条路径:不保证是最短的。
      猜你喜欢
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多