第一次接触A*,感觉好神奇。。
启发函数:f(x) = g(x) + h(x);
比如初始状态为s,目标状态为t
g(x)表示从s到达状态x所消耗的代价
h(x)表示从x到达t所估算的代价
g'(x)表示s -> x可能出现的最小代价
h'(x)表示x -> t可能出现的最小代价
g(x) >= g'(x);h(x) <= h'(x);
好吧,上面全是概念。。。
当g(x) 为0时,A*就成了bfs,当h(x)为0时,A*就成了dfs。所以。。。启发函数的选择直接影响到A*算法的性能。
大概的说说我对A*算法运算过程的理解吧:
基本就是bfs形式,不过要用到优先队列。
如在求第k短路问题上:f(x)越小优先级越高。dis[x]表示x到t的最短路,这里可以用spfa预处理出来(把图逆向,求t到每个点的距离就ok了)。bfs过程中每次更新f(x)和g(x)
f(x) = [pre]g(x) + curent.value + dis[curnet.node];
[new]g*(x) = [pre]g(x) + curent.value.
比如:
模板如下:
#include #include #include #include #include #include #include #include #include #include #include
参考:
http://blog.csdn.net/airarts_/article/details/7600419
这个很全。。。