手记

【九月打卡】第十六天 搜索进阶

学习课程:算法与数据结构高手养成-求职提升特训课

章节名称:第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进行对比,以及新方法之间的优劣对比,分析提取其思想的一致性

多思考,多和已经学过的知识进行比较和联系,这样就有助于搭成一个知识体系和框架,也有助于记忆和理解


打卡截图:


0人推荐
随时随地看视频
慕课网APP