A* &&IDA*

A*:BFS+估价函数,普通的BFS是范围性的搜索,对于目标状态吗,没有明确得到方向。A*算法优点就在于估价函数,如果这个函数设计得好,那么效率会大大提升,设计得差的话,其实就和不同BFS一样,A*算法就是处理出每个状态到目标状态的代价,这个代价是估计出来的,不一定准确,但是这个代价只能<=实际代价,为什么?其实可以这样理解,BFS的时候,优先队列排序的关键字是 初始状态到现在状态的代价(准确的)+现在状态到目标状态的代价(估计的),所以为了更早地接近目标状态,应该让估价函数尽量小,这样就能更容易弹出队列。

IDA*:既然估价函数可以配合BFS使用,那么当然也可以配合DFS使用,那么这个就是IDA*算法了。鉴于A*算法需要维护一个优先队列来存储状态,耗费空间大。所以有了IDA*,这个估价 函数为到目标状态的代价,当然和A*算法一样需要满足<=的关系。但是如果我们估计出错了,那么就会离目标状态越来越远。所以为了解决这一问题,可以使用迭代加深去搜索。当前深度+未来估计>深度限制,就可以回溯了。

《算法竞赛进阶指南》上有对这两个算法的讲解,还不错,挺容易理解的,可以去看看

题目:http://poj.org/problem?id=1077       

代码:https://github.com/lydrainbowcat/tedukuri/blob/master/%E9%85%8D%E5%A5%97%E5%85%89%E7%9B%98/%E4%BE%8B%E9%A2%98/0x20%20%E6%90%9C%E7%B4%A2/0x27%20A_star/%E5%85%AB%E6%95%B0%E7%A0%81/POJ1077_%E4%BC%98%E5%8C%96%E5%81%9A%E6%B3%95_%E5%B8%A6%E5%BA%B7%E6%89%98%E5%B1%95%E5%BC%80.cpp

题目:http://poj.org/problem?id=3460

代码:https://github.com/lydrainbowcat/tedukuri/blob/master/%E9%85%8D%E5%A5%97%E5%85%89%E7%9B%98/%E4%BE%8B%E9%A2%98/0x20%20%E6%90%9C%E7%B4%A2/0x28%20ID_A_star/Booksort/POJ3460%20Booksort.cpp

发布了70 篇原创文章 · 获赞 5 · 访问量 7185

猜你喜欢

转载自blog.csdn.net/xiaonanxinyi/article/details/97896085