也许我遗漏了一些非常简单明显的东西。
但是,如果试探函数h
是单调的(一致的),我不明白为什么从总估算成本中减去源顶点的估算成本:
单音功能:f(x) = g(x) + h(x)
非单调函数:d'(x, y) = d(x, y) + h(y) − h(x)
UPD :
我很困惑,完全误解了单调/非单调启发法。 @david-aisenstat's answer帮助我更正了以下问题:
A *算法可以用作Dijkstra算法的扩展。在其主循环的每次迭代中,它选择估计成本加上该顶点的路径成本最小的顶点:
对于顶点u
及其后继v
,使用某些启发式函数f(u, v) = d(u, v) + h(v)
,根据公式h
计算总成本。其中:
d(u,v)
到u
的路径的v
成本h(v)
估算从v
到目标顶点t
的成本如果对于任何相邻的顶点u
和v
,则h(u) <= d(u, v) + h(v)
确实是h
是单调的。换句话说,图拥有triangle inequality属性。
它在A* algorithm的Wiki页面中声明:
如果启发式h满足图的每个边(x,y)的附加条件h(x)≤d(x,y)+ h(y)(其中d表示该边的长度),则h称为单调或一致。在这种情况下,可以更高效地实现A *-粗略地说,无需处理一次以上的节点(请参见下面的封闭集),并且A *等效于以降低的成本d'(x,运行Dijkstra算法) y)= d(x,y)+ h(y)− h(x)。
我的问题是:
和A *等效于以降低的成本d'(x,y)= d(x,y)+ h(y)-h(x)运行Dijkstra算法。
有任何等价证据吗?
很明显0 <= d(x, y) + h(y) - h(x)
是可行的。但是:
答案 0 :(得分:2)
标记为“非单调”的条件实际上是单调的条件。 “单调”下的方程式是如何推导新的距离函数d'
的过程,该函数将一致的启发式h
合并到d
中。然后,您可以在d'
上运行Dijkstra,除非通过h
的值,否则它不会查看d'
。
维基百科中A *的伪代码省略了减法,因为它涉及一般可允许的启发式情况,该情况将f(n) = g(n) + h(n)
用作通过路径使用节点n
的解决方案成本的下限费用为g(n)
。