为什么具有可接受的不一致的启发式算法的A *会找到最优解?

时间:2018-08-04 10:29:06

标签: algorithm search graph-theory a-star heuristics

我知道具有可接受的不一致启发式的A *不会找到最佳解决方案,但是我正在努力寻找何时会发生这种情况的示例。

由于这种想法,我找不到示例-在将我们的目标节点(具有非最优f(n))插入优先级队列后,优先级队列还必须包含例如 node_1 (位于最佳路径上)。优先级队列中 node_1 的f(n)必须小于目标节点的f(n),因为我们使用的是允许的启发式方法。这就是为什么 node_1 会更早出队,并且在A *的某些迭代(使用相同的想法)之后, goal_node 将在找到最佳路径后稍后出队。

我在哪里想错了?有人可以给我简单图形的简洁示例,当具有可接受的不一致启发式的A *会找到非最优路径吗?

谢谢。

1 个答案:

答案 0 :(得分:9)

这是一个图表示例,在该图表中,我们使用不一致的启发式方法得出错误的答案。在这里,试探法在每个节点附近带有括号,并且在边沿旁边写有边沿成本:

     (8)
      A
     / \
+1  /   \ +3
   /     \   
  B ----- C ----- D
(7)  +1  (0)  +6  (0)

这里,从A到D的最佳路径是A-B-C-D,总成本为8。但是,让我们看看A *会做什么:

  • 从A开始,选项是A-B的成本加启发法为8,或者是A-C的成本+启发法为3。所以我们选择A-C。 p>

  • 现在,我们的选择是将A-B扩展为成本+启发式8,或将C-D扩展为成本+启发式9。所以我们选择A-B。

    < / li>
  • 我们已经通过较早的路径封闭了C,因此我们不考虑边B-C。相反,我们以9的成本选择C-D。

  • 总体而言,我们找到了路径A-C-D.糟糕。

下一个问题是,您如何在地球上找到这样的示例,为此,我认为以下观点对于思考A *的工作原理非常有用:

  

使用启发式函数h(v)在边成本为c(u,v)的图上运行A *等效于在边成本为(u,v)为的图上运行Dijkstra算法c(u,v)+ h(v)-h(u)。

换句话说,您可以想象一下A *在做什么,就好像您在运行Dijkstra的算法一样,通过增加每个边缘的启发式值的变化来调整每个边缘的成本。

之所以有用,是因为著名的Dijkstra算法在图形中存在负边的情况下会给出错误的答案。因此我们可以问-当我们将边成本更改为c(u,v)+ h(v)-h(u)时,我们是否最终会得到负成本?换句话说,必须采取什么措施才能确保

  

c(u,v)+ h(v)-h(u)≥0?

通过快速重新排列,您可能会注意到,如果发生这种情况,

  

c(u,v)+ h(v)≥h(u)

或等效地uf

  

h(u)≤c(u,v)+ h(v)。

嘿!这就是一致启发式的定义。

这意味着使用不一致的启发式算法使用A *可能会出错,这与使用负边缘权重的Dijkstra算法可能会出错的方式完全相同。您(很可能)会遇到一个问题,即在通往目标的路径上找到通往某个中间节点的次佳路径,然后从那里得到错误的答案。

我最终从上面的图开始制作了上面的图,其中A *失败了,从这张图开始,Dijkstra的答案是错误的,然后对启发式算法进行了逆向工程,使得边缘成本全部为正:

    A
+0 / \ -5
  /   \
 B --- C --- D
    -6    +6

在这里,Dijkstra从A到D的路径是成本为1的路径A-C-D,而不是成本为0的路径A-B-C-D。这是错误的路径就像上面的A *示例一样。