为啥具有可接受的非一致启发式的 A* 会找到非最优解?
Posted
技术标签:
【中文标题】为啥具有可接受的非一致启发式的 A* 会找到非最优解?【英文标题】:Why does A* with admissible non consistent heuristic find non optimal solution?为什么具有可接受的非一致启发式的 A* 会找到非最优解? 【发布时间】:2019-01-12 01:24:46 【问题描述】:我知道具有可接受的非一致启发式的 A* 不会找到最佳解决方案,但我正在努力寻找何时会发生的示例。
由于这个想法,我找不到示例 - 在将我们的目标节点(具有非最优 f(n))插入优先级队列后,优先级队列还必须包含节点,例如node_1 在最佳路径上。优先级队列中 node_1 的 f(n) 必须小于我们的目标节点的 f(n),因为我们使用了可接受的启发式算法。这就是为什么 node_1 会提前出队,并且在 A* 的一些迭代之后(使用相同的想法)goal_node 会在找到最佳路径后稍后出队。
我在哪里想错了?当具有可接受的非一致启发式的 A* 会找到非最优路径时,有人可以给我一个简单图的简明示例吗?
谢谢。
【问题讨论】:
恕我直言,这个问题是针对 cs.stackexchange.com 甚至 math.stackexchange.com 这句话来自Wikipedia 是否回答了您的问题? - "如果使用封闭集,那么 h 也必须是单调的(或一致的),A* 才能达到最优。... [如果不是单调的],封闭集中的节点可能是重新发现并提高了成本”。 @Dukeling 我说我已经知道了。我正在询问将发生这种情况的图表示例或证明它为什么不是最佳的。 如果您使用 A* 算法as originally defined[PDF],它将找到具有可接受启发式的最优解。 【参考方案1】:这是一个图表示例,其中我们通过不一致的启发式得到错误的答案。在这里,启发式在每个节点附近用括号显示,边成本写在边旁边:
(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。
现在,我们的选择是扩展 A - B 以获得 8 的成本加启发式,或扩展 C - D 以获得 9 的成本加启发式。所以我们选择 A - B。
我们已经通过前面的路径封闭了 C,所以我们不考虑边 B - C。相反,我们选择 C - D 的成本为 9。
总的来说,我们找到了路径 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* 示例一样。
【讨论】:
感谢您的回答。这很有帮助。但它并没有真正回答我的问题。在您的图形示例中,您使用的是不允许的启发式(节点 B 的启发式为 7,但实际路径的成本为 4)。我知道,在不允许的启发式 A* 下,可能会找到非最佳解决方案。但我很好奇找到这样一个图的例子,我们将使用 ADMISSIBLE 找到非最优解决方案,并且 A* 图搜索的启发式不一致。 @User5458622 糟糕!我刚刚更新了示例,使用了一个可接受的、不一致的启发式算法,但仍然给出了错误的路径。 错误示例。扩展CD意味着7的成本。 新的例子是不可接受的@templatetypedef 我在 A* 上看到了几种不同的变体。如果您使用封闭列表的概念,如 Dijkstra 算法,则 A* 需要一致的启发式算法以及可接受的启发式算法,以避免我的回答中说明的那种问题。如果你不使用封闭列表,那么如果你的启发式是可以接受的,那么你总是会得到正确的答案,但是运行时可能会在输入状态空间的大小上呈指数级增长。所以从这个意义上说,也许最好的答案是“如果你使用封闭列表,你可能会得到错误的答案,如果你不这样做,那么不一致会导致性能下降。”以上是关于为啥具有可接受的非一致启发式的 A* 会找到非最优解?的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核NUMA 非一致内存访问结构 ( NUMA 概念介绍 | NUMA 架构优势分析 | SMPNUMAMPP 架构 )