算法学习-A*算法

虽然大二就接触过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

你可能感兴趣的:(算法)