综述
关于A*算法的具体内容和实现,网上已经很多了,发现一篇比较好的
http://www.cnblogs.com/technology/archive/2011/05/26/2058842.html
我写一些自己对A*算法的体会
内容
本质
本质上A*就是一种启发式的最短路搜索。何为启发?就是猜测这样走可能会更快,于是尝试去找了。
就像两个男生在河这边,看到河对岸有个漂亮妹纸小芳,不会游泳但是又想过去搭讪,咋办呢?首先他俩研究了这附近的地形,知道有哪些路,每条路通向哪里。于是小明和小华分别找路了。两人只有笔记本(纸质本)和笔,只能手算,谁找路更快,就会先勾搭上小芳。如果你是小明,你会如何找呢?
显然,在所有方向的路里面,你不能盲目的选,这样就成了无头苍蝇。从概率上来讲,应该先找距离你近同时在直线上距离小芳又比较近的那个节点作为第一站,这就是小明择点的主观猜测。当然如果周围条件复杂,比如周围有些路上有很多出租车(车只能在固定一条路上跑),那有可能你首先会挑那些离你近同时路上有车的地方先算。这就是A*里面的估值函数思想:即根据图的条件,自己选取合适的估值函数来寻路。A*中常见的公式:
f(n) = g(n) + h(n),g(n)是当前n点到原点的路径长度,熟悉Dijkstra的朋友可以认为g(n)就是Dijkstra里面维护的那个取值函数。而h(n)是n点到目标节点的估算路径长度,这个估值函数是可以根据条件自己选取的,而取n到目标点之间的绝对距离是相当常用的。
与Dijkstra的关系
上文提到了f(n) = g(n) + h(n),如果h(n)取常数0,那就退化成了Dijkstra。
有数学可以证明,如果h(n)是小于等于n节点到目标节点的实际路径距离,那么首次得到的f(dest)就是最短路径值。
如果h(n)大于实际值,有可能会提高搜索速度,因为粒度变大了,但是这样就不能保证得到全局最优解,甚至得到一个很差的解。