具有曼哈顿距离启发式和带有
的启发式算法 greater value of (square root(x1-x2),square root(y1-y2))
你如何考虑他们的知情度,他们是否可以从a到b搜索网格中的最短路径,只允许水平和垂直移动?
在所有情况下测试它们时,第二种启发式方法总是采用对角线方式,有时它发现的节点数量明显小于曼哈顿。但情况并非总是如此,这让我感到困惑。
答案 0 :(得分:1)
给定当前点a = (x1, y1)
和目标b = (x2, y2)
。我会让dist1(a, b)
表示曼哈顿距离,dist2(a, b)
表示你建议的其他启发式。我们有:
dist1(a, b) = |x1 - x2| + |y1 - y2|
dist2(a, b) = max(sqrt(|x1 - x2|), sqrt(|y1 - y2|))
请注意,我改变了你的新提议的启发式,以取绝对差异的平方根,而不仅仅是差异,因为取负数的平方根会导致问题。无论如何,对于任何a
和b
,dist1(a, b) >= dist2(a, b)
,应该很容易看到。
由于在允许仅允许垂直和水平移动的网格的情况下两种启发法都是可接受的,这通常意味着两者的最大启发式(曼哈顿距离)更有效,因为它将更接近于真相。
在OP中,您实际上提到过您正在测量“发现的节点数”,并且对于第二个启发式,这有时会更小(更好)。有了这个,我将假设您的意思是您正在运行A *算法,并且您正在测量从边界/打开列表/优先级队列/您想要的任何术语弹出的节点数量使用。
我的猜测是,正在发生的事情是,如果多个节点在边界中具有相同的分数(通常称为f
),则会出现严重的打破平局。您提出的第二种启发式方法确实倾向于选择沿当前节点和目标之间的对角线的节点,而曼哈顿距离没有这种趋势。当边界中的多个节点具有相等(f
)得分时,良好的打破平局将是优先考虑具有高实际成本的节点(通常称为g
)到目前为止,并且低启发式成本(通常称为h
)。这可以通过在g
分数相等时明确比较h
或f
得分,或者通过简单地将所有启发式得分乘以略大于{{1 (例如,1
)。有关详情,请参阅http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html#breaking-ties