Dijkstra的算法为f(n) = g(n)
而A *为f(n) = g(n) + h(n)
。
g(n)是从起始节点到n的路径成本。
h(n)是一种启发式函数,用于估算从n到目标的最便宜路径的成本。
是否需要g(n)?没有g(n)找不到最短的路径吗?
为什么A *需要g(n)?
答案 0 :(得分:1)
g(n)
请考虑以下情况:对于目标的某个给定路径上的所有节点,h(n)
为0
(这是完全有效的,即可允许的启发式),而对于所有其他节点,该值为非零。 / p>
如果我们忽略了到目前为止的成本(g(n)
,那么显然无论实际成本是多少,我们都会选择该路径上的节点,因此最终的路径可以成本要比其他途径高得多。
start
g(n)=0 O --
5 | \ 1
h(n)=0,g(n)=5 O O h(n)=1,g(n)=1
5 | / 1
h(n)=0,g(n)=10 O --
goal
在上面的示例中,我们将选择左侧的节点,然后选择目标,因为两者的h(n) = 0
(大于右侧节点的h(n) = 1
)。这将为我们提供一条成本为10
的路径,其中最便宜的路径包括为成本2
选择右侧的节点。
这也许是一个极端的例子,但是同样的想法在许多其他情况下也适用。例如,您还可以在示例中将10添加到所有值中,并将其作为较大图形的一部分,但最终仍然会错误地选择右侧上方的左侧。
这里更笼统的结论是,您可以在两个节点n1
和n2
之间进行选择,其中h(n1) < h(n2)
,因此我们选择n1
,但是{{ 1}}是最便宜的路径,而不是n2
。
如果我们包含n1
,我们也可以选择错误的节点。但是,在那种情况下,对于包含g(n)
的路径上的某个节点n
,n1
会比最便宜的路径大(在最坏的情况下,f(n)
将是目标并且n
将是通过f(n)
到达它的真实成本,这显然比实际最便宜的路径贵,因此也比n1
高(因为启发式方法需要低估费用),因此我们将在达到目标之前探索f(n2)
。
n2
是真实成本(而不是估计)那么我们确实不需要h(n)
。
但是在这种情况下(考虑非负边缘权重),仅考虑g(n)
会使它成为一个贪婪算法,因为h(n)
对于我们选择的每个节点都会减少(因为我们接近目标) ),因此在起始节点上,我们将选择最佳路径上的一个节点(因为它将具有最低的h(n)
),然后,我们将继续在最佳路径上选择节点。