为什么A-star算法需要g(n)?

时间:2018-09-20 08:30:15

标签: algorithm a-star

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)?

1 个答案:

答案 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添加到所有值中,并将其作为较大图形的一部分,但最终仍然会错误地选择右侧上方的左侧。

这里更笼统的结论是,您可以在两个节点n1n2之间进行选择,其中h(n1) < h(n2),因此我们选择n1,但是{{ 1}}是最便宜的路径,而不是n2

如果我们包含n1,我们也可以选择错误的节点。但是,在那种情况下,对于包含g(n)的路径上的某个节点nn1会比最便宜的路径大(在最坏的情况下,f(n)将是目标并且n将是通过f(n)到达它的真实成本,这显然比实际最便宜的路径贵,因此也比n1高(因为启发式方法需要低估费用),因此我们将在达到目标之前探索f(n2)

如果n2是真实成本(而不是估计

那么我们确实不需要h(n)

但是在这种情况下(考虑非负边缘权重),仅考虑g(n)会使它成为一个贪婪算法,因为h(n)对于我们选择的每个节点都会减少(因为我们接近目标) ),因此在起始节点上,我们将选择最佳路径上的一个节点(因为它将具有最低的h(n)),然后,我们将继续在最佳路径上选择节点。