Answers:
实际回答您的问题:当您被约束沿着未加权的网格垂直/水平移动时,曼哈顿距离是一致的(这可以通过Wikipedia上的定义轻松显示)。所以可以,在您的情况下,您可以避免重新检查封闭集中的节点。
但是,一旦允许对角线或任何角度的移动,曼哈顿距离就变得不可接受,因为它高估了对角线成本,这必然意味着不一致。
h(x) = min(manhattan(p1), manhattan(p2))
(即p1或p2是很好的终点,我想到达最接近的那个)会很高兴。这h(x)
仍然单调吗?
h(x, p1)
和h(x, p2)
一致,那么min(h(x,p1), h(x,p2))
也将一致。从Wikipedia的定义中可以很容易地看出这一点(我们需要显示min(h(x, p1), h(x, p2)) <= distance(x,y) + min(h(y, p1), h(y, p2))
所有节点x
并y
在它们之间有一条边。现在假设这h(x, p1)
是最小的;您可以证明它绝对<=
是右边的事实吗?两种启发式方法是否一致?)
是的,两点之间的曼哈顿距离始终相同,就像两点之间的常规距离一样。您可以认为曼哈顿距离是两点之间的直线的X和Y分量。
该图像(来自Wikipedia)很好地说明了这一点:
该绿线是实际距离。
的蓝色,红色和黄色的线都表示相同的曼哈顿距离(12个单位)。无论您从左下角点到右下角进行向上或向右的运动组合,都将获得相同的曼哈顿总距离。
h(x) = 1000
,显然是不一致的)。他能避免复查节点,但仅仅是因为曼哈顿距离是一致的,它这个答案不显示。
2*manhatten
满足,但不一致。
在扩展Byte56的答案时,我想指出,在您的特定数据集中,使用“ 曼哈顿距离”作为启发式函数实际上始终是完美的启发式,因为它将始终返回实际路径成本(假设存在没有“阻塞”路径)。
您还应注意,正确方向(水平或垂直)上的所有节点都将产生相同的预期距离(因为到目标的路径很多同样短)。您应该意识到,如果优先级绑定,优先级队列(开放集)应首先使最新添加的节点出队(LIFO-后进先出)。这样,您将只检查将以最佳路径结束的节点。如果以FIFO(先进先出)的方式检查同样合适的节点,则将有效地检查属于最佳路径的所有节点。出现此问题的原因是,存在通往目标节点的多个同样好的路径。
我不确定“始终”是什么意思。固定距离上的曼哈顿距离是否与所走的路径无关?是的,正如Byte56的回答所说。
但是,例如,曼哈顿距离在旋转下不是不变的。例如,原点和点之间的曼哈顿距离(L1-norm)(10,10)
为|10-0| + |10-0| = 20
。但是,如果将坐标旋转45度(因此现在您的固定点位于网格的方向之一上),那么您现在会发现相同的点位于(10sqrt(2),0)
,因此到的原点与曼哈顿的距离也是如此10sqrt(2)~14.14
。