A*算法
启发式搜索算法,是一种在平面图形上,有多个结点的路径,求出最低通过成本的算法。
参考
http://www.java3z.com/cwbwebhome/article/article2/2825.html
http://blog.csdn.net/v_JULY_v/article/details/6093380
http://blog.csdn.net/v_JULY_v/article/details/6238029
DFS,深度优先搜索,可以使用stack实现,
BFS,广度优先搜索,可以使用queue实现,这两种都是盲目型搜索。
A*,启发式搜索:在当前搜索结点往下选择下一步结点时,可以通过一个启发函数来选择代价最小的结点作为下一步搜索结点而跳转其上(遇到一个以上最少结点时,不妨选择距离当前搜索结点最近一次展开的搜索点进行下一步搜索)。
关键在于,设计一个好的启发函数,或者称为估值函数:f(n)=g(n)+h(n), 表示每个可能试探结点的估值,由两部分组成:g(n),表示从起始搜索点到当前搜索点的代价,如结点在搜索树中的深度;h(n),表示当前结点到目标结点的估值。一个好的h(n),在h*(n)的下界之下,并且尽量接近h*(n)。这里的h*(n)为当前结点到目标结点的真实值,但一般h*(n)是不知道的。如果h(n)非常接近h*(n),那么最优选择的时候就更接近真实最优选择,保证A*算法的高效性。
平面图形上结点的估值函数,一般可以用距离来表示,如Hamilton距离:|x1-x2|+|y1-y2|,或者Eulid距离:((x1-x2)^2+(y1-y2)^2)^0.5,等等。
在上面提到的几篇参考中,
最后一个链接里面有几张图很好,可以去看看。