虽然大二就接触过A*算法,但实际上根本没去实现过,所以很快就忘了。。做题基本都是Dijkstra。现在在上AI课,要写A*的作业,所以复习(重学)一遍,做一点笔记。
常见的搜索有DFS和BFS,当然还有大名鼎鼎的Dijkstra,以及加速的最佳优先搜索算法。下面介绍Dijkstra、Best First、A*算法的区别
Dijkstra算法在寻找下个点时,选择标准为:【open列表中,距离起点最近的点。即:起点到该点的距离最短】
最佳优先搜索算法在寻找下个点时,选择标准为:【open列表中,距离终点最近的点。即:终点到该点的距离最短】
A*算法在寻找下个点时,选择标准为:【open列表中,起点到该点的距离 + 该点到终点的直线距离 最短。】
Dijkstra 算法保证最终路径是最短的,但比较慢;最佳优先算法比较快,但有障碍物时,不一定保证路径是最短的。
A*算法集合了两种算法的特点,通过新的函数来计算每个节点的优先级:
f
(
n
)
=
g
(
n
)
+
h
(
n
)
f(n)=g(n)+h(n)
f(n)=g(n)+h(n)
其中
- f ( n ) f(n) f(n)是综合优先级;
- g ( n ) g(n) g(n)是节点 n n n离起的代价;
- h ( n ) h(n) h(n)是节点 n n n离终点的预计代价;
- f ( n ) f(n) f(n)值越大,优先级越低。
启发函数 h ( n ) h(n) h(n)会影响A*算法的performance。
- 当 h ( n ) = 0 h(n)=0 h(n)=0恒成立时,就退化为了Dijkstra算法
- 若 h ( n ) h(n) h(n)始终小于等于节点 n n n到终点的代价,那么A*算法能保证找到最短路径。并且 h ( n ) h(n) h(n)估计得越接近真实代价,算法速度越快
- 在 h ( n ) h(n) h(n)大于等于节点 n n n到终点的代价时,A*算法虽然很快,但无法找到最短路径。此时有些接近Best First算法。
参考:
- https://zhuanlan.zhihu.com/p/54510444
- https://zhuanlan.zhihu.com/p/108344917