【问题标题】:A* algorithm open list selectionA*算法开放列表选择
【发布时间】:2015-04-06 13:52:43
【问题描述】:

我知道在 A* 算法中,当采取下一步行动时,应从开放列表或前沿中选择具有下一个最低预测成本的步骤,但是当有多个最低步骤都具有相同的预测成本时,是否有任何偏好应该选择哪一个?

我认为 last on first off 可能会更好,但我不确定当有多个匹配成本时是否有更好的方法来选择下一步。

【问题讨论】:

  • 我删除了您的 MATLAB 标签,因为这是一个算法问题,并且独立于实现语言。

标签: algorithm a-star


【解决方案1】:

我想你正在寻找bounded relaxation (AKA A*-epsilon)。

这个想法是生成f(v) = g(v) + (1+eps)h(v)。 eps 的值非常小,不会改变算法的最优性,同时在搜索中偏向于“深度”而不是“广度”,通常会提高搜索速度。

同样,您可以通过给出非常接近零但为负值的eps 来支持广度 - 但我不熟悉这里偏爱广度的任何用法。

【讨论】:

  • 嗯,这不是问题的确切答案。您的建议(并且运行良好,但您仍然冒着失去最优性的风险)是改变步骤的成本,但问题是如何在成本相等的情况下进行选择(这也会发生在您的情况下)。
  • @FrancisColas 想想当 eps>0 时会发生什么,但非常小,实际上是 eps = 1/infinity。在g(v) = x, h(v) = y 和g(u) = x-c, h(v) = y+c 等两个节点之间进行连接中断就足够了,并且将有利于v 而不是u(并且有效地将具有相同g 值的连接中断节点以有利于深度)。如果eps 选择得足够小,它不会影响最优性,因为每个 eps 最优解都是最优的。
  • 我对这个概念很熟悉,但您忽略了两种情况。如果您的图表具有连续成本,那么您对仍然保证最优性的 epsilon 没有任何线索(这对于某些应用程序可能很重要(这可能不是 OP 的情况,因为这通常会导致很少的联系))。如果你在一个成本统一的网格世界中(那是你得到很多平局的地方),那么你的启发式也是结构化的,你改变启发式并不能保证你摆脱平局(想想中间有障碍和必须在左或右之间进行选择)。你仍然需要打破关系。
  • @FrancisColas 没有灵丹妙药,但它确实打破了一些重要的联系。回顾一下您的网格示例,没有障碍物,需要从 (0,0) 移动到 (n,n)。常规 A* 将始终拥有所有节点 g(v) = 2n,并且选择一个节点将是随机的,如果在队列中完成 - 它将衰减到 BFS。但是,使用这种方法,您将倾向于深度并直接到达目标,从而有效地使 A* 运行得更快(与 n^2 相比,要开发 2n 个节点)。
  • 别误会,这绝对有用。但它不是同一个算法,它并没有完全摆脱选择问题。
【解决方案2】:

根据 A*,所有具有相同估计成本(从开始的成本加上启发式)的步骤都同样值得研究。

问题是,如果没有进一步的启发,我很难做出选择;或者更确切地说,这取决于您想要什么。

在标准的f(x) = g(x) + h(x) 情况下,如果您没有其他启发式或信息,则有两种主要策略:

  • 你选择最近的步骤x,希望它对应一个好的轨道(它可能有助于解决内存局部性问题):如果它是最近的,这意味着它只获得了相对较小的成本更新其他;
  • 您选择x 和最小h 的步长,即已知成本相对于未知成本的相对贡献最高(这就是加权 A* 的目标)。

对于第二种策略,除了扩展启发式方法之外,您只需按 (f, h) 对而不是 f 对您的步骤/节点进行排序。但是,它不能保证您没有关系:

 *
/ \
| |
\ /
 +

最后,您需要选择一个,例如最近的一个(或者只是您的优先级队列实现产生的那个)。

请注意,如果您选择 x 和最多的 h,您将更接近 Amit 所指的广度行为。

【讨论】:

    【解决方案3】:

    理论上,两者都不是比另一个更好的选择,因为您的适应度函数应该使用所有可用信息来模拟比另一个更好的选择。

    从列表中选择最容易编程的、最新的或您最喜欢的ith prime。应该没关系。

    【讨论】:

      【解决方案4】:

      打破平局的一个好选择可能是选择 G 值最大的节点,毕竟它们会更接近终点。

      这个想法来自这里 http://movingai.com/astar.html

      在该页面上,有视频显示了通过选择最低 G 和选择最高 G 来打破平局之间的区别。

      很遗憾,没有视频显示“最大 G”与“最后一个节点”。正如弗朗西斯在他的回答中提到的那样,使用最后一个可能对缓存更友好并带来更好的速度。再加上简单地使用最后一个可能需要更少的簿记代码这一事实......

      同一个网站有大量真实的游戏地图和测试场景,您可以使用它们来衡量哪个效果更好。你可以在这里找到他们http://movingai.com/benchmarks/

      我的测试,使用我自己的 A* 实现表明......这完全取决于地图/场景 :)

      总体而言,使用上面链接中的地图和场景以及我自己的 A* 实现,只需选择最后一个节点即可打破平局,赢得 90% 的时间。另一方面,在一些地图中,通过选择最高 G 来打破平局赢得 90% 的时间。

      我很想听听你的情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        • 2018-12-10
        相关资源
        最近更新 更多