不得不叹服,强大算法背后,都是简单得不能再简单的逻辑。普林斯顿的算法课程作业里,要让用A*算法。什么都没接触到过,看到后有种想哭的感觉!于是网上查阅资料,渐渐的明白了怎么回事。
通过对A*算法的学习的个人感悟:计算一个代价函数,评估每一步的代价,并找到代价最小的方向。最终得到的解可能不是最优,但每一步都是最佳的策略,总是会非常接近最优解。即常见寻优算法中,全局最优和局部最优之间的抉择问题。
有的文章写得很透彻,看一遍就能让你理解——今后继续向着这个方向去努力,不光自己懂了,还能让其他人明白。
A*算法,又称为启发式搜索。
假设情况如下有一个当前状态S,期望的目标状态D。我们要做的就是找到从S->D的最佳路径。那么如何破案呢?
搜索策略简单得不能再简单,分为两步走:
- 判断从S迈出一步的代价,记为G
- 从S的某部位到D需要直接步数,记为H
计算并存储各个方向上的F=G+H值,找到F最小的即可。其中当H=0时,为Dijkstra算法(权值为正);
具体计算G和H的方法有很多种。其中,计算H的常见的评估函数有——欧几里得距离、曼哈顿距离、切比雪夫距离等;
A*算法固然强大,但有一定的约束条件,一种具有F=G+H策略的启发式算法能成为A*算法的充分条件是:
1、搜索树上存在着从起始点到终了点的最优路径。
2、问题域是有限的。
3、所有结点的子结点的搜索代价值>0。
4、H(n)=<H*(n) (H*(n)为实际问题的代价值)。
从图中绿点A,到红点B的最优路径搜索就可以使用A*算法。——>见参考的优快云
参考自:
2. A*搜索算法