无信息搜索算法 Uninformed Search
特别说明:下文的 b 代表宽度,d代表深度,ε 表示每个行动的代价
一、广度优先搜索 Breadth-First Search
广度优先搜索,即是从最原始的节点开始,依次扩展起始节点的后继(跟当前节点挨着的下面的所有节点)。
1. 算法图解
A点为起始节点,也即当前节点:
按照广度优先策略,即扩展当前节点A的所有后继,那么接下来应扩展 B 节点:
此时,当前节点依然是A点,扩展完B点后,应继续扩展A的其他后继节点,即C点:
此时,当前节点A的所有后继均扩展,接下来当前节点变为B节点,继续按照扩展所有后继节点的策略扩展节点D:
同理,讲按顺序扩展 E,F,G节点,那么总的扩展顺序为:
A
→
\rightarrow
→ B
→
\rightarrow
→ C
→
\rightarrow
→ D
→
\rightarrow
→ E
→
\rightarrow
→ F
→
\rightarrow
→ G
2. 算法性能
广度优先搜索的性能表:
完成情况 | 时间复杂度 | 空间复杂度 | 评价 |
---|---|---|---|
可完成(如果横向节点数b有限) | O(bd) | O(bd) | 空间复杂度是个问题,可以轻易的达到10MB/s的节点产生速度 |
二、一致代价搜索 Uniform-Cost Search
该算法只扩展对于当前节点来说,代价(成本)最小的节点。
1. 算法图解
以上图为例,Sibiu为起点,Bucharest为终点。Sibiu的后继为Rimnicu和Fagaras,代价分别为80和99,那么算法选择扩展代价更小的Rimnicu,若是继续扩展Rimnicu的后继Ritesti,则Sibiu到Pitesti的总代价为 80 + 97 = 177。
此时,总代价只有99的Fagaras为最小代价节点,然后扩展Fagaras的后继Bucharest,该路线的总代价为 99 + 211 = 310. 虽然已经到达了终点Bucharest,但是算法还在继续。
此时,Sibiu到Pitesti的总代价最小,开始扩展Pitesti的后继Buchrest, 这个路径的总代价为 80 + 97 + 101 = 278 < 310
那么最终路线为: Sibiu → \rightarrow → Rimnicu → \rightarrow → Pitesti → \rightarrow → Bucharest
总的扩展顺序为:Sibiu → \rightarrow → Rimnicu → \rightarrow → Fagaras → \rightarrow → Petesti → \rightarrow → Bucharest
2.算法性能
一致代价搜索的性能表:
完成情况 | 时间复杂度 | 空间复杂度 | 评价 |
---|---|---|---|
可完成(具有最优性) | O(b[1+ C*/ε]) | O(b[1+ C*/ε]) | 具有最优解 |
三、深度优先搜索
扩展最深的为扩展的节点
1. 算法图解
由于节点过多,就不一一贴图了。
从上图看,扩展顺序为 A → \rightarrow → B → \rightarrow → D → \rightarrow → H → \rightarrow → I → \rightarrow → E → \rightarrow → J → \rightarrow → K → \rightarrow → C → \rightarrow → F → \rightarrow → L → \rightarrow → M → \rightarrow → G → \rightarrow → N → \rightarrow → O
另外,遍历后不是结果的部分将被从内存删除,如下图的黑色部分:
2.算法性能
深度优先搜索的性能表:
完成情况 | 时间复杂度 | 空间复杂度 | 评价 |
---|---|---|---|
当没有最深节点时不能完成 | O(bm) | O(bm) | 没有最优解,但删除无用节点会降低空间复杂度 |
注:m代表任一节点的最大深度。
四、深度受限搜索 Depth-limited search
深度优先搜索算法的缺点是,如果深度无限,该算法就废了,或者深度特别深,而目标相对来说没有那么深,那么该算法性能也不好。深度受限搜索在一定程度上解决了这个问题,即设定一个深度的限制,每次在限制深度内采用深度优先搜索。
1.算法图解
如上图,限制 limit = 2,在限制深度内采用深度优先搜索。
2.算法性能
深度受限搜索的性能表:
完成情况 | 时间复杂度 | 空间复杂度 | 评价 |
---|---|---|---|
当 l < d 时不能完成 | O(bl) | O(bl) | 当 l > d 时没有最优解 |
注:l代表限制深度。
五、迭代深度搜索 Iterative Deepening Search
深度限制搜索的性能很大程度上依赖 限制深度 l,所以,为了解决 l 的不确定性,采用迭代深度搜索,每次递增 l,知道搜索到目标节点
1.算法图解
如上图,每次递增 l,知道找到目标。
2.算法性能
迭代深度搜索的性能表:
完成情况 | 时间复杂度 | 空间复杂度 | 评价 |
---|---|---|---|
可以找到目标节点 | O(bd) | O(bd) | 可以找到最优解 |
3.小例题
d = 10, d = 5时,迭代深度搜索 IDS 和 广度搜索 BFS 生成节点数目:
N(IDS) = 50+400+3000+20000+100000 = 123450
这里,理解为 第一层10个节点重复生成了5次,第二层 10*10个节点被生成了4次,以此类推。
N(BFS) = 10+100+1000+10000+100000 = 111110
这里理解为 第一层生成10个节点,第二层 10*10,以此类推。
可以看出迭代深度算法的性能并不比广度优先搜索差太多。
六、双向搜索
如果同时从正向和反向搜索,最后两个方向的算法遍历的节点能遇见。
但反向搜索难以实现,甚至在一些问题中无法实现。
若能实现,则空间和时间复杂度均为 O(bd/2),能否找到解和最优解,就取决于选择的搜索策略。