学习课程:算法与数据结构高手养成-求职提升特训课
章节名称:第4章 搜索进阶 Advanced Searching
讲师:吉他熊
课程内容:
双向广度优先搜索
BFS的缺陷
占用空间太多
需要保存搜索树一整层的节点(很多时候≈一整棵树)
双向BFS的限制
有明确的起始和目标状态
状态变化过程可以反推
起始和目标之间确定有通路
迭代加深搜索——每一次都深一点
英文Iterative Deepening Search,因为是DFS的变体,常简写为DFS-ID(Iterative Deepening)
在普通DFS的基础上,加入搜索深度限制limit
从1开始,如果当前深度限制搜不到解,就放宽到下一层限制
能够保证找到的第一个解,一定是离起点最近的(与BFS特性相同),同时空间消耗和DFS一样
BFS:占用空间多,空间换时间
DFS的改进思路:保留空间优势,同时不要一条路走到黑
改进:限制搜索深度
启发式搜索A*的缺点:空间消耗巨大
IDA*之于A*,就好像DFS-ID之于BFS,效率略逊,但空间消耗明显降低
IDA*的实际应用很广,DFS-ID是IDA*的基础
改进盲目搜索
按照状态扩展选项的重要程度(优先级)进行搜索——启发式
尽可能少扩展一些选项——迭代加宽&剪枝
启发式搜索
核心——启发函数(Heuristic Function)
作用:估计当前状态的价值,决定状态扩展的优先级
启发函数的特点
启发函数的准确度越高,逼近最优解的速度越快
启发函数没有通用公式,需要根据问题来确定
启发函数的复杂度不能太高,否则会影响搜索性能
A*算法:最经典的启发式搜索
相比BFS,只有一点核心改动
队列-->按状态估价函数值排序的优先队列
队列每次取出的,不是最早插入的元素,而是优先级最高的元素
IDA*与DFS-ID的区别
深度限制-->估价函数的值的限制
剪枝
搜索树中,对状态进行判断,拿掉没有用的状态
看似减掉一个状态,实际上是减掉了1颗子树
大量削减状态,优化性能
剪枝的特点
本质上是对后续搜索结果的预期,灵活度高,堪比启发函数
剪枝的精度要求要不启发式的要高,启发式搜索精度低就是多搜一下,剪枝不能将正确值减掉
剪枝的预期往往是极端情况(不同于启发函数需要尽可能贴近实际情况)
一个剪枝往往不够,需要多个剪枝策略叠加使用
剪枝的分类
可行性剪枝
如果从当前状态出发,后续无论怎么搜索,都不可能找到解,就把他减掉
最优性剪枝
如果从当前出发,后续即便有解,也不比当前解要好,就把他减掉
学习收获:
了解了一系列进阶搜索方法,新学了IDA*,将新方法与DFS\BFS进行对比,以及新方法之间的优劣对比,分析提取其思想的一致性多思考,多和已经学过的知识进行比较和联系,这样就有助于搭成一个知识体系和框架,也有助于记忆和理解
打卡截图: