【学习随笔】IDAStar算法

转自:https://blog.csdn.net/urecvbnkuhbh_54245df/article/details/5856756

黑色和红色是正文...其他颜色我的个人理解

IDA*算法是A*算法和迭代加深算法的结合。//实际上并没有感觉出来...境界不够...感觉IDA*就是利用启发函数给出剪枝条件

迭代加深算法是在dfs搜索算法的基础上逐步加深搜索的深度,它避免了广度优先搜索占用搜索空间太大的缺点,也减少了深度优先搜索的盲目性。//实际上由于不需要保存结点,不需要判重复,也不需要根据 H值对结点排序,确实占用空间小,但是个人感觉还是在盲目的深搜...毫无方向性可言...只不过给出了上界,超出就会剪枝....感觉他的探索范围类似一个圆,剪枝范围内探索一遍它主要是在递归搜索函数的开头判断当前搜索的深度是否大于预定义的最大搜索深度,如果大于,就退出这一层的搜索,如果不大于,就继续进行搜索。//这句话充分说明了IDA*算法思想核心就是剪枝这样最终获得的解必然是最优解。//这句话有待探究和下文矛盾,在阀值范围内是否一定能找出最优解是个问题(矛盾于如果没有找到解,则加大阈值maxH,再重复上述搜索,直到找到一个解。在保证H值的计算满足A*算法的要求下,可以证明找到的这个解一定是最优解

而在A*算法中,我们通过使用合理的估价函数,然后在获得的子节点中选择fCost最小的节点进行扩展,以此完成搜索最优解的目的。但是A*算法中,需要维护关闭列表和开放列表,需要对扩展出来的节点进行检测,忽略已经进入到关闭列表中的节点(也就是所谓的“已经检测过的节点”),另外也要检测是否与待扩展的节点重复,如果重复进行相应的更新操作。所以A*算法主要的代价花在了状态检测和选择代价最小节点的排序上,这个过程中占用的内存是比较大的,一般为了提高效率都是使用hash进行重复状态检测。

综合了A*算法的人工智能性和回溯法对空间的消耗较少的优点,在一些规模很大的搜索问题中会起意想不到的效果。它的具体名称是 Iterative Deepening A*, 1985年由Korf提出。该算法的最初目的是为了利用深度搜索的优势解决广度A*的空间问题,其代价是会产生重复搜索。归纳一下,IDA*的基本思路是:首先将初始状态结点的H值设为阈值maxH,然后进行深度优先搜索,搜索过程中忽略所有H值大于maxH的结点;如果没有找到解,则加大阈值maxH,再重复上述搜索,直到找到一个解。在保证H值的计算满足A*算法的要求下,可以证明找到的这个解一定是最优解。在程序实现上,IDA* 要比 A* 方便,因为不需要保存结点,不需要判重复,也不需要根据 H值对结点排序,占用空间小。 而这里在IDA*算法中也使用合适的估价函数,来评估与目标状态的距离。

在一般的问题中是这样使用IDA*算法的,当前局面的估价函数值+当前的搜索深度 > 预定义的最大搜索深度时,就进行剪枝。这个估计函数的选取没有统一的标准,找到合适的该函数并不容易,但是可以大致按照这个原则:在一定范围内加大各个状态启发函数值的差别。

最近看八数码问题有点小感触.....

思路基础:

BFS+hash 

双向BFS+hash+逆序数对判断

A* + 逆序数对判断+曼哈顿距离

IDA*+逆序数对判断+曼哈顿距离

虽然思想上A*更加漂亮,每一次的探索具有强烈的目的性,但是空间上可能是无法接受的,空间开销巨大

还是要吐槽IDA* 算法的思想.....(马克也许是我对于此算法的理解不够过于深刻)虽然空间开销小,但是思想很烂....完全就是一个剪枝的思想.....因为不能保证在maxH阀值内一定找到最优解(通常下能找到),也就是说剪枝可能会剪掉原来正确的情况.....一旦maxH扩大,其深搜的重复性是灾难的.....之前探索的所有过程都要重新~重新进行....并且在其规模上扩大.....要死的节奏

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值