为什么允许对角线移动会使A *和曼哈顿距离不可接受?

时间:2013-12-12 15:24:28

标签: artificial-intelligence graph-theory graph-algorithm heuristics

我对使用A *和曼哈顿距离度量的网格中的对角线移动感到有些困惑。有人可以解释为什么使用对角线运动使其不可接受吗?不会进入对角线运动找到一个更好的最佳解决方案,因为采取较少的步骤来达到目标​​状态而不是向左下方或我错过了什么?

2 个答案:

答案 0 :(得分:8)

就像烧杯的评论所表达的那样,曼哈顿距离将过度估计一个州与对角线可以接近的州之间的距离。 根据定义,超出估算距离的启发式算法是不可接受的。

现在,为什么会这样呢?

让我们假设你的曼哈顿距离程序看起来像这样:

function manhattan_dist(state): 
    y_dist = abs(state.y - goal.y)
    x_dist = abs(state.x - goal.x)
    return (y_dist + x_dist)

现在,考虑将该过程应用于(1,1)状态的情况,并假设目标是(3,3)。这将返回值4,其估计实际距离为2.因此,在这种情况下,曼哈顿距离将不能作为可接受的启发式算法。

通常使用允许对角线移动Chebyshev Distance的游戏板。为什么呢?

考虑这个新程序:

function chebyshev dist(state): 
    y_dist = abs(state.y - goal.y)
    x_dist = abs(state.x - goal.x)
    return max(y_dist, x_dist)

回到上一个(1,1)和(3,3)的例子,这个过程将返回值2,这实际上高估了实际距离。

答案 1 :(得分:1)

虽然这个主题较旧,但我想添加一个不同的解决方案,如果允许对角线移动,则使用实际最快的自由路径。

function heuristic(state):
    delta_x = abs(state.x - goal.x)
    delta_y = abs(state.y - goal.y)
    return min(delta_x, delta_y) * sqrt(2) + abs(delta_x - delta_y)

此方法返回一个启发式,它将对角线的最大量和其余部分以直线方式移动到目标,并提供最大可能的启发式,不会高估目标的移动成本。