文章目录
📌 适合对象:希望深入理解基础搜索算法原理的学习者
⏱️ 预计阅读时间:50-60分钟
🎯 学习目标:学会怎么把实际问题转换成可搜索的形式,怎么根据有没有线索选择搜索方法
📚 核心结论(塔尖)
想象一下,你想解决一个搜索问题,比如找路、拼图。首先你得把实际问题转换成计算机能理解的形式,然后系统化地找答案,不管有没有额外信息。就像在迷宫里找出口,可能你什么线索都没有(无信息搜索),只能瞎摸索;也可能你有地图指引(启发式搜索),知道大致方向。
基础搜索策略解决搜索问题的核心思路是分两步走:
- 问题形式化用五个核心要素(你现在在哪、你能做什么、你想达到什么、做了动作会变成什么样、做这个动作要花多少代价)把实际问题转换成可搜索的形式,就像把现实问题画成一张搜索地图;
- 搜索算法根据有没有额外信息选择搜索方法。没线索时用无信息搜索(按层、按代价、按深度系统化地探索),有线索时用启发式搜索(利用线索引导,就像有地图指引)。
怎么选方法?看有没有线索:没线索时用无信息搜索,有线索时用启发式搜索。
那么,怎么用五个核心要素把实际问题转换成可搜索的形式?不同的扩展策略怎么在找全解、找最优解、找得快之间权衡?当有额外信息时,怎么利用线索引导搜索?这些正是本文要解决的核心。
一、问题形式化:通过五个核心要素定义问题
这五个要素是:
- 你现在在哪(状态空间,定义所有可能的位置)、
- 你能做什么(动作,定义状态之间的转换,比如能往哪走)、
- 你想达到什么(目标测试,判断是否达到目标)、
- 做了动作会变成什么样(状态转移函数,描述状态如何变化)、
- 做这个动作要花多少代价(路径代价,评估解的质量,比如走这条路要花多少时间)。
好的形式化是高效搜索的前提,就像画地图,要标出起点、终点、能走的路、每条路的距离。
这五个要素是相互依赖的:
- 状态空间设计是基础,定义了所有可能的状态,就像画地图要先标出所有可能的位置;
- 动作定义依赖于状态空间,定义状态之间的转换,就像知道你在哪,才能知道你能往哪走;
- 目标测试设计依赖于状态空间,判断状态是否是目标,就像知道所有位置,才能判断哪个是终点;
- 状态转移函数设计依赖于状态空间和动作定义,描述状态如何变化,就像知道你在哪、能做什么,才能知道做了动作后会变成什么样;
- 路径代价设计依赖于状态转移函数,评估解的质量,就像知道状态怎么变化,才能知道走这条路要花多少代价。
在实际应用中,你需要在几个方面权衡:状态表示需要包含解决问题所需的所有信息,但也要简洁,避免冗余信息,就像画地图要标出所有重要信息,但不能太复杂;状态表示需要便于执行动作和状态转移,但形式化后的搜索空间也要足够小,便于搜索,就像地图要清晰易读,但也不能太详细导致搜索太慢。
二、搜索算法:根据信息可用性选择策略
想象一下,你想搜索问题的解。可能你什么线索都没有(无信息搜索),只能系统化地探索;也可能有地图指引(启发式搜索),可以利用额外信息更高效地找到解。就像在迷宫里找出口,没线索时只能瞎摸索,有地图时知道大致方向。
搜索算法根据有没有线索选择策略。没线索时用无信息搜索,通过不同的扩展策略(按层、按代价、按深度)和优化技术(双向搜索、图搜索)在找全解、找最优解、找得快之间权衡;有线索时用启发式搜索,通过线索提供信息引导,结合实际代价和估计代价在有信息情况下搜索。
无信息搜索:通过扩展策略系统化探索
想象一下,你什么线索都没有,只能系统化地探索。不同的扩展策略有不同的特点:按层扩展保证找到最短路径但内存消耗大,按深度扩展节省内存但可能找不到解,按代价扩展保证代价最小但需要计算路径代价。
无信息搜索通过不同的扩展策略(按层、按代价、按深度)系统化探索解空间,不同的扩展策略在找全解、找最优解、找得快之间权衡。按层扩展(BFS,广度优先搜索) 像水波扩散一样,一层一层向外扩展,保证找到最短路径,但内存消耗大,就像从起点开始,先探索距离为1的所有位置,再探索距离为2的所有位置。**按代价扩展(UCS,一致代价搜索)**按路径代价选择,优先探索代价小的路径,保证找到代价最小的路径,就像优先走距离短的路。**按深度扩展(DFS,深度优先搜索)**像走迷宫一样,一条路走到底,内存消耗小,但可能找不到解或不是最短路径,就像一直往前走,直到走不通再回头。
**限制深度(DLS,深度有限搜索)**在DFS基础上设置最大深度限制,避免无限路径问题,就像走迷宫时设置最多走多少步,走不到就回头。**迭代深入(IDDFS,迭代深入深度优先搜索)**先尝试深度1,找不到就尝试深度2,逐步加深,兼顾BFS和DFS的优点,就像先浅尝辄止,找不到再深入。
双向搜索从起点和终点同时搜索,在中间相遇,大幅减少搜索节点数,就像两个人从两端同时找,在中间碰头。图搜索记住已经走过的位置,避免重复探索,特别适用于有大量重复状态的问题,就像走迷宫时记住已经走过的路,不走回头路。
启发式搜索:利用信息引导搜索
想象一下,你有额外信息(比如知道大概方向),可以利用这些信息引导搜索,减少搜索空间,提高搜索效率。但怎么利用这些信息?只考虑估计代价快速但不一定最优,综合考虑实际代价和估计代价既能利用信息又能保证最优性。
当有额外信息时,可以利用这些信息引导搜索,减少搜索空间,提高搜索效率。贪婪最佳优先搜索只考虑启发函数 h ( n ) h(n) h(n)(估计代价),总是选择离目标最近的节点扩展,快速但不一定最优,就像看到目标就直奔过去,但可能走错路。A*搜索结合实际代价 g ( n ) g(n) g(n)(已经走过的路)和估计代价 h ( n ) h(n) h(n)(估计还要走多远), f ( n ) = g ( n ) + h ( n ) f(n)=g(n)+h(n) f(n)=g(n)+h(n)(总代价),优先扩展总代价最小的节点,既能利用信息提高效率,又能保证最优性,就像既考虑已经走了多远,又考虑还要走多远,选总路程最短的路。
可采纳性(启发函数 h ( n ) ≤ h ∗ ( n ) h(n) \leq h^*(n) h(n)≤h∗(n),估计值不超过真实值)保证A能找到最优解,就像估计距离不能比实际距离还远,否则可能走错路。一致性(启发函数满足三角不等式)保证A图搜索的最优性,就像从A到B再到C的距离,不能比直接从A到C的距离还短。启发函数的质量直接影响搜索效率,好的启发函数可以显著提高搜索效率,就像有准确的地图指引,能更快找到目标。
三、方法选择:根据信息可用性权衡
想象一下,你在实际应用中需要在问题形式化、搜索策略、信息利用之间做出选择。问题形式化是搜索的前提,但不同的搜索策略有不同的特点,信息可用性也影响方法选择。
问题形式化是搜索的前提,就像画地图是找路的前提。没线索时用无信息搜索,有线索时用启发式搜索。怎么选方法?看有没有线索:没线索时用无信息搜索,有线索时用启发式搜索。
问题形式化(定义你现在在哪、你能做什么、你想达到什么等)是搜索的前提,只有把问题形式化后,才能应用搜索算法。好的形式化是高效搜索的前提,就像画好地图才能找路,状态空间、动作、目标测试、状态转移函数、路径代价五个要素共同构成搜索问题的形式化。
从无信息搜索(盲目探索)到启发式搜索(利用信息),从没有任何额外信息,只能系统化探索,到利用额外信息引导搜索,提高效率。从基础策略(BFS、UCS、DFS)到改进策略(DLS、IDDFS),在找全解、找最优解、找得快之间权衡。从快速到最优,贪婪策略(快速但不一定最优)到A*策略(完备且最优),从只考虑估计代价快速搜索,到综合考虑实际代价和估计代价保证最优性。
在实际选择时,你需要在几个方面权衡:问题形式化在完整性、简洁性、可操作性和效率之间权衡,就像画地图要详细但不能太复杂;无信息搜索通过不同的扩展策略和优化技术在找全解、找最优解、找得快之间权衡;启发式搜索通过利用额外信息提高效率,同时保证最优性。设计搜索算法的核心就是在这些维度之间找到平衡点。没有完美的算法,只有适合不同场景的算法。
📝 核心结论总结
基础搜索策略解决搜索问题的两个步骤:问题形式化(将实际问题转化为可搜索的形式化问题)和搜索算法(系统化地搜索问题的解)。形式化通过五个核心要素(状态空间、动作、目标测试、状态转移函数、路径代价)定义问题;搜索算法根据信息可用性选择无信息搜索(按层/按代价/按深度扩展)或启发式搜索(利用启发函数引导)。方法选择取决于信息可用性:无信息时用无信息搜索,有信息时用启发式搜索。
附:术语小词典(Glossary)
状态空间(State Space)
定义所有可能的状态集合,包括初始状态、目标状态和中间状态。状态表示需要完整描述问题的当前状态,同时保持简洁和可操作。就像绘制地图,需要标明所有可能的位置,同时保持地图的清晰和易读。很多人以为"状态空间"就是所有状态的列表,实际上它是搜索问题的基础,定义了搜索的所有可能状态,就像画地图要先标出所有可能的位置。
广度优先搜索(BFS)
按层扩展,一层一层向外扩展,保证找到最短路径,但内存消耗大。就像水波扩散一样,从起点开始,逐层向外扩展,先探索距离为1的所有位置,再探索距离为2的所有位置。很多人以为"广度优先"就是横向搜索,实际上它是按层扩展,保证找到最短路径,但需要存储所有已访问的节点,就像要记住所有已经探索过的位置。
深度优先搜索(DFS)
按深度扩展,一条路走到底,内存消耗小,但可能找不到解或不是最短路径。就像走迷宫一样,一直往前走,直到走不通再回头,不需要记住所有走过的路,只需要记住当前路径。很多人以为"深度优先"就是纵向搜索,实际上它是按深度扩展,节省内存但可能失去完备性和最优性,就像可能走到死胡同,或者找到的不是最短路径。
A搜索(A Search)
结合实际代价 g ( n ) g(n) g(n)(已经走过的路)和估计代价 h ( n ) h(n) h(n)(估计还要走多远), f ( n ) = g ( n ) + h ( n ) f(n)=g(n)+h(n) f(n)=g(n)+h(n)(总代价),优先扩展总代价最小的节点,既能利用信息提高效率,又能保证最优性。就像既考虑已经走了多远,又考虑还要走多远,选总路程最短的路。很多人以为"A*"就是选择最小代价的节点,实际上它是综合考虑实际代价和估计代价,既能利用信息又能保证最优性。
可采纳性(Admissibility)
启发函数 h ( n ) ≤ h ∗ ( n ) h(n) \leq h^*(n) h(n)≤h∗(n),估计值不超过真实值,保证A能找到最优解。就像估计距离不能比实际距离还远,否则可能走错路。很多人以为"可采纳性"就是启发函数要准确,实际上它是要求估计值不超过真实值,这是A算法最优性保证的基础。
1487

被折叠的 条评论
为什么被折叠?



