【发布时间】:2015-04-06 13:52:43
【问题描述】:
我知道在 A* 算法中,当采取下一步行动时,应从开放列表或前沿中选择具有下一个最低预测成本的步骤,但是当有多个最低步骤都具有相同的预测成本时,是否有任何偏好应该选择哪一个?
我认为 last on first off 可能会更好,但我不确定当有多个匹配成本时是否有更好的方法来选择下一步。
【问题讨论】:
-
我删除了您的 MATLAB 标签,因为这是一个算法问题,并且独立于实现语言。
我知道在 A* 算法中,当采取下一步行动时,应从开放列表或前沿中选择具有下一个最低预测成本的步骤,但是当有多个最低步骤都具有相同的预测成本时,是否有任何偏好应该选择哪一个?
我认为 last on first off 可能会更好,但我不确定当有多个匹配成本时是否有更好的方法来选择下一步。
【问题讨论】:
我想你正在寻找bounded relaxation (AKA A*-epsilon)。
这个想法是生成f(v) = g(v) + (1+eps)h(v)。 eps 的值非常小,不会改变算法的最优性,同时在搜索中偏向于“深度”而不是“广度”,通常会提高搜索速度。
同样,您可以通过给出非常接近零但为负值的eps 来支持广度 - 但我不熟悉这里偏爱广度的任何用法。
【讨论】:
eps = 1/infinity。在g(v) = x, h(v) = y 和g(u) = x-c, h(v) = y+c 等两个节点之间进行连接中断就足够了,并且将有利于v 而不是u(并且有效地将具有相同g 值的连接中断节点以有利于深度)。如果eps 选择得足够小,它不会影响最优性,因为每个 eps 最优解都是最优的。
g(v) = 2n,并且选择一个节点将是随机的,如果在队列中完成 - 它将衰减到 BFS。但是,使用这种方法,您将倾向于深度并直接到达目标,从而有效地使 A* 运行得更快(与 n^2 相比,要开发 2n 个节点)。
根据 A*,所有具有相同估计成本(从开始的成本加上启发式)的步骤都同样值得研究。
问题是,如果没有进一步的启发,我很难做出选择;或者更确切地说,这取决于您想要什么。
在标准的f(x) = g(x) + h(x) 情况下,如果您没有其他启发式或信息,则有两种主要策略:
x,希望它对应一个好的轨道(它可能有助于解决内存局部性问题):如果它是最近的,这意味着它只获得了相对较小的成本更新其他; x 和最小h 的步长,即已知成本相对于未知成本的相对贡献最高(这就是加权 A* 的目标)。对于第二种策略,除了扩展启发式方法之外,您只需按 (f, h) 对而不是 f 对您的步骤/节点进行排序。但是,它不能保证您没有关系:
*
/ \
| |
\ /
+
最后,您需要选择一个,例如最近的一个(或者只是您的优先级队列实现产生的那个)。
请注意,如果您选择 x 和最多的 h,您将更接近 Amit 所指的广度行为。
【讨论】:
理论上,两者都不是比另一个更好的选择,因为您的适应度函数应该使用所有可用信息来模拟比另一个更好的选择。
从列表中选择最容易编程的、最新的或您最喜欢的ith prime。应该没关系。
【讨论】:
打破平局的一个好选择可能是选择 G 值最大的节点,毕竟它们会更接近终点。
这个想法来自这里 http://movingai.com/astar.html
在该页面上,有视频显示了通过选择最低 G 和选择最高 G 来打破平局之间的区别。
很遗憾,没有视频显示“最大 G”与“最后一个节点”。正如弗朗西斯在他的回答中提到的那样,使用最后一个可能对缓存更友好并带来更好的速度。再加上简单地使用最后一个可能需要更少的簿记代码这一事实......
同一个网站有大量真实的游戏地图和测试场景,您可以使用它们来衡量哪个效果更好。你可以在这里找到他们http://movingai.com/benchmarks/
我的测试,使用我自己的 A* 实现表明......这完全取决于地图/场景 :)
总体而言,使用上面链接中的地图和场景以及我自己的 A* 实现,只需选择最后一个节点即可打破平局,赢得 90% 的时间。另一方面,在一些地图中,通过选择最高 G 来打破平局赢得 90% 的时间。
我很想听听你的情况。
【讨论】: