A*:BFS+估价函数,普通的BFS是范围性的搜索,对于目标状态吗,没有明确得到方向。A*算法优点就在于估价函数,如果这个函数设计得好,那么效率会大大提升,设计得差的话,其实就和不同BFS一样,A*算法就是处理出每个状态到目标状态的代价,这个代价是估计出来的,不一定准确,但是这个代价只能<=实际代价,为什么?其实可以这样理解,BFS的时候,优先队列排序的关键字是 初始状态到现在状态的代价(准确的)+现在状态到目标状态的代价(估计的),所以为了更早地接近目标状态,应该让估价函数尽量小,这样就能更容易弹出队列。
IDA*:既然估价函数可以配合BFS使用,那么当然也可以配合DFS使用,那么这个就是IDA*算法了。鉴于A*算法需要维护一个优先队列来存储状态,耗费空间大。所以有了IDA*,这个估价 函数为到目标状态的代价,当然和A*算法一样需要满足<=的关系。但是如果我们估计出错了,那么就会离目标状态越来越远。所以为了解决这一问题,可以使用迭代加深去搜索。当前深度+未来估计>深度限制,就可以回溯了。
《算法竞赛进阶指南》上有对这两个算法的讲解,还不错,挺容易理解的,可以去看看
题目:http://poj.org/problem?id=1077