算法简介

首先,让我们回顾一下A算法的基本原理。A算法使用了一个启发式函数(heuristic function)来评估每个节点的代价,并选择代价最小的节点进行扩展。这个启发式函数通常是从当前节点到目标节点的估计代价,也被称为启发式估计(heuristic estimate)。A*算法同时使用了已经走过的路径的实际代价(g(n))和启发式估计(h(n))来评估节点的总代价(f(n) = g(n) + h(n)),并选择具有最小总代价的节点进行扩展。

算法流程

A*算法大致流程如下图:

对于算法更为具体的流程这里就不做过多介绍了,重点来看启发函数的重要性和优化。

算法优化

优化A*算法的关键在于设计一个高效而准确的启发式函数。一个好的启发式函数应该能够提供准确的估计值,并且能够尽可能地减少搜索空间。
这是因为启发函数可以用来控制A*算法的行为.
 
·    在极端情况下,如果h(n)=0,那么只有g(n)实际上是有用的,这时A*算法也就是迪杰斯特拉算法,它能保证一定可以找到一条最优路径.
 
·    如果h(n)总是小于(或者等于)从结点n走到目标结点的步数,那么A*算法是一定可以找到最优路径的.h(n)越小,A*扩展的结点越多,导致A*算法越慢.
 
·    如果h(n)恰好等于从结点n走到目标结点的步数,A*算法扩展的所有结点都在最优路径上,它不会扩展任何其他无关结点,此时A*算法的速度是非常快的.尽管你无法总是做到这一点,但在某些特定情况下你确实做到.知道A*算法可以在某些时候运行的很好是一件很值得高兴的事.
 
·    如果h(n)所给出的信息有时大于从结点n走到目标结点的步数,那么A*算法将无法确保能够找到最优路径,但它会运行得更快.
 
在另一种极端的情况下,如果h(n)非常接近于g(n),那么只有h(n)将起作用,此时A*算法实际上变成广度优先搜索.
 
下面是几种常见的启发式函数优化方法:
 
1.曼哈顿距离(Manhattan Distance):对于在一个网格中移动的问题,曼哈顿距离是一种常用的启发式函数。它通过计算当前位置到目标位置的水平和垂直距离之和来估计最短路径的代价。曼哈顿距离可以直接应用于许多网格型问题,比如迷宫问题或棋盘游戏。
 
其公式为 
$$h(n) = |x2 - x1| + |y2 - y1|$$
2.欧几里得距离(Euclidean Distance):对于连续空间中的问题,欧几里得距离是一种更为准确的启发式函数。它通过计算当前位置到目标位置的直线距离来估计最短路径的代价。欧几里得距离在一些机器人路径规划或无人机路径规划等领域得到广泛应用。
 
 其公式为
$$h(n) = \sqrt{(x2 - x1)^2 + (y2 - y1)^2}$$
3.动态调整启发式函数:有时候,启发式函数可能不够准确,导致A*算法搜索到次优解或搜索空间过大。在这种情况下,可以考虑动态调整启发式函数,以提供更准确的估计。例如,可以根据搜索过程中的实际代价来调整启发式函数的权重,使其更贴近实际情况。
这里呢我就会用动态调整启发式函数的形式来优化A*算法,具体实现为:
启发函数采用距离*倍数形式,即
$${h(n) = h_1(n) * (1 +(h_2(n)/h_3(n))* a)}$$
其中h1(n)为当前点到目标点的欧式距离,h2(n)为当前点到目标点的曼哈顿距离,h3(n)为起点到目标点的曼哈顿距离,a是当前节点与目标节点的距离乘以的一个可变倍数,使得其对启发函数进行了很好的调节。
这部分h1采用距离为欧几里得距离是因为需要可以找到最小距离的界限,而倍数中距离采用曼哈顿距离是因为不改变性质的情况下计算耗时更短。
这里呢拿到我的A*程序做一下测试 
原图呢是这样的,后续呢为了可以清晰的观察到路径的区别,我对后续的图片都隐藏了障碍物以便对比
启发函数 1曼哈顿距离:
启发函数 2欧氏距离:
启发函数 3优化后:
下面是是启发函数部分的程序实现,这里倍数a我取值为0.18,可以根据实际情况自行调节。

测试结果

第一组

启发函数

用时/ms

Path cost/m

Visited_nodes size

曼哈顿距离

近0.1ms

1.451507

28

欧氏距离

0.3ms左右

1.428075

522

欧氏距离优化

0.1ms左右

1.428075

54

 
 

第二组

启发函数

用时/ms

Path cost/m

Visited_nodes size

曼哈顿距离

0.1ms左右

1.444644

26

欧氏距离

0.3ms左右

1.421212

203

欧氏距离优化

0.1ms左右

1.421212

27

 
第三组
 

启发函数

用时/ms

Path cost/m

Visited_nodes size

曼哈顿距离

近0.1ms

1.488499

27

欧氏距离

0.3ms左右

1.461212

269

欧氏距离优化

0.1ms左右

1.461212

28

结果分析

曼哈顿距离作为启发函数,运行是十分快的,但是找到的路径容易不是最优的;欧几里得距离作为启发函数,可以找到最优路径,但是往往运行的比较慢;为此优化过后使得运行速度十分接近曼哈顿距离,有了很大的提升,而且绝大多数情况下是可以找到最优路径的。通过选择合适的启发式函数,并应用一些优化技巧,我们可以使A算法在各种路径搜索问题中发挥出最佳性能。希望这篇博客能为你提供关于A*算法启发式函数优化的帮助。