A*算法及其变种
一、A*算法原理
相比贪婪最优搜索的
f
(
n
)
=
h
(
n
)
f(n)=h(n)
f(n)=h(n)注重当前节点到目标节点的距离h(n),A*算法还注重当前节点到初始节点的距离g(n),用公式表示为:
f
(
n
)
=
g
(
n
)
+
h
(
n
)
f(n) = g(n) + h(n)
f(n)=g(n)+h(n)
这公式看着可太枯燥了,用个简单图的表达就是:
A*算法每次扩展f(n)最小的节点。
二、做个例题吧~
著名的Romania地图,以Bucharest为目标,Arad为起点:
- 初始状态, 366表示点Arad到目标Bucharest的距离,0表示Arad到初始节点Arad它本身的距离:
- 然后扩展Arad,接着判断Sibiu, Timisoara和Zerind的 f(n),发现 f(Sibiu)最小,其中g(Sibiu)=140表示 Arad到Sibiu的距离,h(Sibiu)=253表示Sibiu到目标Bucharest的距离:
- 扩展Sibiu,然后继续判断 f(Rimnica Vakea) 最小:
- 继续遵循 f(n)最小的原则去扩展节点。此时,f(Petisti) = 417不是最小了!因为之前的 f(Fagaras) = 415最小!这时候就要返回来扩展 Fagaras 节点:
- 回来扩展 Fagaras,此时我们已经找到了目标节点 Bucharest,但是!此时的 f(Bucharest)=450,当前最小的 f 是 f(Pitesti) = 417,那就再回来扩展 Pitesti节点:
- 最后找到 f(Bucharest) = 418,则为最终最优解:
这时候,找到的解也是最优
的!
三、A*算法的最优性
保证最优性的两个条件:
- 可采纳启发式 Admissible Heuristic
- 一致性启发式 Consistent Heuristic
1.可采纳启发式 Admissible Heuristic
这个是说,可采纳启发式不会高估到达目标的距离,f(n)永远不会超过实际解的距离。
我个人觉得,就是说,A*每次找的路径,都不超过实际到达解的距离,因为他每次找的 f(n)都是最小的,所以他每次找的路径都是近路,他不会绕远路去找解。
2.一致性启发式 Consistent Heuristic
是说,对于节点 n 和通过任一行动 a 生成的每个 n 的后继节点 n’,从节点 n 到达目标的代价都不大于从 n 到 n’ 的单步代价与从 n’ 到达目标的代价之和,公式为:
h
(
n
)
≤
c
(
n
,
a
,
n
′
)
+
h
(
n
′
)
h(n) \le c(n,a,n')+h(n')
h(n)≤c(n,a,n′)+h(n′)
说人话就是,,,,懒得写了,直接看知乎大佬的解释吧:
四、A*算法的性能
A*算法可以找到最优解,其他的,,看下图吧:
五、IDA算法 Iterative-Deepening A
A*算法的一个缺点在于,他需要存储所有处在候选区域的节点信息,这些信息是呈指数级增长的,这会极大的占用内存。
如果你对迭代深度有所疑问,请移步迭代深度搜索 Iterative Deepening Search
IDA是指,采用迭代深度A算法,即设置一个限制,每次限制迭代增大, IDA*所用的截断值是 f(g+h).每次迭代,截断值取上一次迭代截断值得节点中最小的 f 代价值。
六、递归最佳优先搜索 RBFS
原理和贪婪最佳优先搜索差不多,只不过用的是线性存储空间。
下图是一些详细信息,太长了,我实在不想打字了55555:
七、SMA*
我先简单贴点图,等我有时间了再回来更。。。
1. SMA*原理
2.SMA*算法性能
3.SMA*算法的使用
各位看官老爷,一键三连再走吧~再不济点个赞也行啊~~