【坚持不能偷懒】
【A*——A Star算法(启发式搜索)】
记起点为 Start 终点为 End
f(n) = g(n) + h(n)
f(n)—— 经由状态 n 到 E 的【预计代价】
g(n)—— S 到 n 的【实际代价】
h(n)—— n 到 E 的 【预计代价】 —— 预计代价自行使用函数
搜索方法:
根据节点的 f(n)
每次选中 f(n) 最小的点加入搜索
搜索到End即可找到最短路
————————————————————
我在想,这样的估计能不能确保最优
百度了没有发现比较肯定的答案
百度百科上有这样的——
-
如果h(n)<= d(n)到目标状态的实际距离,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。
-
如果h(n)=d(n),即距离估计h(n)等于最短距离,那么搜索将严格沿着最短路径进行, 此时的搜索效率是最高的。
-
如果 h(n)>d(n),搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
-
对于1——h(n)<=d(n) 必然最优(以网格图搜索最短路为例)
假设实际最优解为 Ans
如果 f(p) = g(p) + h(p) 是一个非最优解
且 p 的下一个状态就是 End
那么 他的最后一步,因为 h(p)<=d(p)
且最后一步 d(p) 必然为 1
又h(p)>=1 所以 h(p) ==1
有f(p) = g(p) + h(p) = g(p) + d(p) > Ans
如果存在一个事实上的更优解的中间状态f(q)
f(q) = g(q) + h(q) 根据 h(n)<=d(n)
所以 f(q) <= g(q) + d(q) 即 f(q) <= Ans
那么——必然有 f(p) > f(q)
所以任意的f(p)不会在f(q) 之前进入搜索队列
所以这样的A* 能跑出最优解
【IDA*——基于迭代加深的A*算法】
在A*的基础上加入一个【深度的控制】
限制一个深度,不考虑深度外的搜索
如果在深度范围内没有得出结果
再把深度扩大,直到得出结果
可以把一般的搜索题,用A*或者IDA*来练习。
相关参考
http://blog.csdn.net/b2b160/article/details/4057781
IDA*
http://blog.csdn.net/urecvbnkuhbh_54245df/article/details/5856756
八数码的八境界
http://blog.csdn.net/rachelsg/article/details/52717693?locationNum=10&fps=1