为了账号安全,请及时绑定邮箱和手机立即绑定
首页 手记 【九月打卡】第十六天 搜索进阶

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

2022.09.21 21:22 41浏览

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

章节名称:第4章 搜索进阶 Advanced Searching

讲师:吉他熊

课程内容:

双向广度优先搜索

https://img2.sycdn.imooc.com/632afc610001733014390868.jpg

BFS的缺陷

占用空间太多

需要保存搜索树一整层的节点(很多时候≈一整棵树)

https://img2.sycdn.imooc.com/632afcd300012c1215530866.jpg

https://img3.sycdn.imooc.com/632afcea00019a5e14880854.jpg

https://img2.sycdn.imooc.com/632afd3800010c4914920857.jpg

双向BFS的限制

有明确的起始和目标状态

状态变化过程可以反推

起始和目标之间确定有通路

https://img4.sycdn.imooc.com/632afde00001bc1015300864.jpg

迭代加深搜索——每一次都深一点

英文Iterative Deepening Search,因为是DFS的变体,常简写为DFS-ID(Iterative Deepening)

在普通DFS的基础上,加入搜索深度限制limit

从1开始,如果当前深度限制搜不到解,就放宽到下一层限制

能够保证找到的第一个解,一定是离起点最近的(与BFS特性相同),同时空间消耗和DFS一样

BFS:占用空间多,空间换时间

DFS的改进思路:保留空间优势,同时不要一条路走到黑

改进:限制搜索深度

https://img3.sycdn.imooc.com/632b04930001f52114900840.jpg

https://img4.sycdn.imooc.com/632b04b40001c7ff15130861.jpg


启发式搜索A*的缺点:空间消耗巨大

IDA*之于A*,就好像DFS-ID之于BFS,效率略逊,但空间消耗明显降低

IDA*的实际应用很广,DFS-ID是IDA*的基础


改进盲目搜索

按照状态扩展选项的重要程度(优先级)进行搜索——启发式

尽可能少扩展一些选项——迭代加宽&剪枝


启发式搜索

核心——启发函数(Heuristic Function)

作用:估计当前状态的价值,决定状态扩展的优先级


启发函数的特点

启发函数的准确度越高,逼近最优解的速度越快

启发函数没有通用公式,需要根据问题来确定

启发函数的复杂度不能太高,否则会影响搜索性能


A*算法:最经典的启发式搜索

相比BFS,只有一点核心改动

队列-->按状态估价函数值排序的优先队列

队列每次取出的,不是最早插入的元素,而是优先级最高的元素

https://img1.sycdn.imooc.com/632b08cb0001417c14920857.jpg

https://img1.sycdn.imooc.com/632b0ad10001e33414430864.jpg

IDA*与DFS-ID的区别

深度限制-->估价函数的值的限制


剪枝

搜索树中,对状态进行判断,拿掉没有用的状态

看似减掉一个状态,实际上是减掉了1颗子树

大量削减状态,优化性能


剪枝的特点

本质上是对后续搜索结果的预期,灵活度高,堪比启发函数

剪枝的精度要求要不启发式的要高,启发式搜索精度低就是多搜一下,剪枝不能将正确值减掉

剪枝的预期往往是极端情况(不同于启发函数需要尽可能贴近实际情况)

一个剪枝往往不够,需要多个剪枝策略叠加使用


剪枝的分类

可行性剪枝

如果从当前状态出发,后续无论怎么搜索,都不可能找到解,就把他减掉

最优性剪枝

如果从当前出发,后续即便有解,也不比当前解要好,就把他减掉


https://img2.sycdn.imooc.com/632b0e0c000182ef14640849.jpg

https://img3.sycdn.imooc.com/632b0f020001049113900845.jpg

https://img3.sycdn.imooc.com/632b0f460001edef14500846.jpg

https://img3.sycdn.imooc.com/632b0f8c0001a3d414540846.jpg


学习收获:

了解了一系列进阶搜索方法,新学了IDA*,将新方法与DFS\BFS进行对比,以及新方法之间的优劣对比,分析提取其思想的一致性

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


打卡截图:

https://img4.sycdn.imooc.com/632afc450001387d14990860.jpg

https://img2.sycdn.imooc.com/632afcfe000146e215310856.jpg

https://img1.sycdn.imooc.com/632b0537000138b414780859.jpg


点击查看更多内容
0人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
交互设计师
手记
粉丝
0
获赞与收藏
0

关注TA,一起探索更多经验知识

同主题相似文章浏览排行榜

风间影月说签约讲师

50篇手记,涉及Java、MySQL、Redis、Spring等方向

进入讨论

Tony Bai 说签约讲师

146篇手记,涉及Go、C、Java、Python等方向

进入讨论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消