advantages/disadvantages 在加权 A* 搜索中使用完整的 g(n) 与完整的 h(n) 有什么区别?

What are the advantages/disadvantages to using full g(n) vs. full h(n) in a weighted A* search?

Weighted A* = (1 - weight) * g(n) + weight * h(n)

据我了解,基于成本进行全面搜索可为您提供最佳解决方案,但比全面启发式搜索花费的时间更长,反之亦然?这个对吗?还有其他重要的事情我应该知道吗?

编辑:好的,我想我现在了解得更多了。使用完全基于成本的搜索可以引导您找到更长的路径。但仍然不确定完整的启发式。

编辑 2:仅使用启发式会让您到达一个节点,但可能使用了很长的路径?

案例一(全g(n),a.k.a.盲搜):

如果您使用评估函数f(n)仅根据g(n)来选择要探索的下一条路径,那么您基本上是在使用Dijkstra 算法。换句话说,如果 f(n) = g(n) + h(n)h(n) = 0f(n) = g(n) 并且您在每次迭代中都在探索成本最低的路径。这保证找到最佳路径(图中只有正成本),但您可能会探索次优路径。 例如,在下图中我们要找到从 st 的路径:

       n1               node  |  h(node) 
      / \                 s   |    3
   2 /   \ 1             n1   |    1                
    /     \              n2   |    4
   s       t
    \     /
   1 \   / 4
      \ /
       n2

和 table 给我们每个节点的启发式评估(让我假设我们有一个完美的启发式,即启发式值总是对应于到目标的最短路径)。因此,在第一次迭代中,s 被扩展并且 n1n2 添加到 OPEN 列表。 当执行盲搜索(或全g(n))时,则:

  • f(n1) = g(n1) = 2.

  • f(n2) = g(n2) = 1.

和节点 n2 将被探索,因为它在 OPEN 列表中具有最小 g 值。

但是,当我们使用 A* 和启发式值时:

  • f(n1) = g(n1) + h(n1) = 2 + 1 = 3.

  • f(n2) = g(n2) + h(n2) = 1 + 4 = 5.

n1 将被探索,然后 t,导致最优解,而不是通过 n2 一路探索次优路径。

因此,完整的 g(n) 表示 Dijkstra vs A*。如果您的启发式是一个很好的估计(让我们像这样简化),A* 将始终是可取的。

案例 2(全 h(n)):

我们这里有不同的情况,因为我们没有使用已经找到的路径的成本,我们只相信我们函数的启发式评估。根据启发式的质量,您最终可以探索图中的所有节点或仅探索最佳路径,但您已经失去了 A* 的美丽理论特性。