杂谈
狄杰斯特拉算法(以下简称为D 算法)和A* 算法,网上的学习资料很多,在此不在赘述。以下做出几点总结:
1、D 算法 是可以可以获取一个全局最优解。
2、但是A* 算法 只有在 启发代价h <= 当前位置到终点的实际代价的时候 ,才能获得全局最优解。3、当h(n)的值越小,算法将遍历越多的节点,也就导致算法越慢。并且 当启发代价h =0的时候,算法会退化成D 算法。如果h(n)完全等于节点n到终点的代价,则A算法将找到最佳路径,并且速度很快。可惜的是,并非所有场景下都能做到这一点。因为在没有达到终点之前,我们很难确切算出距离终点还有多远。
4、如果h(n)的值比节点n到终点的代价要大,则A*算法不能保证找到最短路径,不过此时会很快,类似BFS。
算法流程
两者流程很相似,伪代码如下:
1、定义 openlist,和closelist
2、将start 点加入到openlist
3、if openlist 不为空
从openlist 中选择总代价最小的节点,作为cur节点
if cur 节点 = 目标节点,则退出算法,回溯生成路径。
将cur 从openlist 中删除,加入closelist
遍历cur的周边节点
if 该节点在closelist 中,或者是障碍物,则 跳过该节点
if 该节点 不在openlist中,或者该节点算出的代价,比openlist中原本的代价小
更新openlist中的节点
可运行的c++ 代码,参考如下:
效果对比:
1、D 算法
2、 A*
结论:两者都可以计算出最优结果,但是A* 比D快很多。
参考:
Introduction to the A* Algorithm