对一个图(有向图),要找到从起点到终点的一条路径,既可以用图搜索算法,也可以用树搜索算法。
图搜索算法 不允许 重复访问结点。
树搜索算法允许重复访问结点。
以 A* 搜索为例,启发函数为 f ( n ) = g ( n ) + h ( n ) f(n)=g(n)+h(n) f(n)=g(n)+h(n), g ( n ) g(n) g(n) 是从起点到当前结点走过的路径的代价, h ( n ) h(n) h(n) 是当前节点到目标的估计代价。每次 A* 搜索都会搜拓展节点中 f f f 最小的点。
例子
1. A* 树搜索
Fringe 中包含了当前拓展出的所有可以走但尚未访问的路径。
需要注意的是第四行选择的 S-B 这一条路径,它可以拓展出 S-B-D 这一条路径放入 Fringe ,树搜索允许重复访问结点。
2. A* 图搜索
要注意的是第四行选择的 S-B 这一条路径,D 已经在之前访问过了并加入到了 Closed List 中,所以 S-B 只能拓展出 S-B-E 这一条路径。
3. 一致性与可采纳性
针对启发函数
f
f
f 而言,
如果
f
(
n
)
f(n)
f(n) 可采纳,那么要满足:
对于每个结点
n
n
n,
f
(
n
)
f(n)
f(n) <
h
∗
(
n
)
h^*(n)
h∗(n)。其中
h
∗
(
n
)
h^*(n)
h∗(n) 是到达目标节点的真实代价。
这意味着可采纳的启发函数绝对不会高估到达目标节点的代价,因此它是最优的。
如果启发函数是可采纳的,那么A*使用树搜索是最优的。