为什么想到写这个了呢,因为实在是太好用了。
文章其实是转载来的
IDA*算法:迭代加深的+评估函数
A算法的本质时带评估函数的优先队列BFS,其最关键的部分在于评估函数的选取。那么可以考虑在DFS中也采用相同的优化。IDA就是这部一种算法,IDA*=迭代加深DFS+评估函数(迭代加深:限定深度搜索,如果当前深度找不到,再增大深度限制)。
由于迭代加深DFS和优先队列BFS的特性不同,此时评估函数评估的内容应该是当前状态到目标状态的步数,并且估计数不超过实际数,那么判断是否过深度限制时,可以用当前步数+估计步数,如果该值超过深度限制,则不需要继续搜索,可以立即回溯。
IDA*算法实现简单,效率高,通过不搜索当前步数+估计步数超过深度限制的状态,减少了很多搜索量,是一种良好的优化方式。
例题
排书(POJ3460/AcWing180)
题目大意
N本书,编号1~n
,给出初始排列顺序,每次抽取连续的一段书插到另一个位置,求让书按1~n排列最少的操作数。(n<=15,若干组数据)超过5次搜索,直接输出5 or more。
解析
采用IDA*。目标状态为书本按顺序排列,因此第i本书后应该是第i+1本书,即i+1是i的正确后继。对任意状态,若整个排列中书的错误后继数量为t,那么一次操作最多改变3本书的后继,那么即便是理想状态要进行的操作也至少为t//3(向上取整)。可以用t//3(向上取整)作为评估函数。
采用迭代加深,从1~4依次限制深度,从起始状态出发DFS,枚举各种抽书排书的可能;进入一个状态后,如果当前操作数+评估函数超过深度限制,就直接回溯。
总结:
可以看到,IDA的实现相对比较简单,只需要确定对应的评估函数,就可以在原本的迭代加深DFS代码上修改判断依据即可,在代码量上不会增加多少难度。它的关键在于如何确定一个合适的评估函数,既要不超过实际剩余步数,又要尽可能贴近实际剩余步数,展示一定剩余步数的趋势(和A一样)