盲目搜索算法指的是不使用领域知识的不知情搜索算法。主要包括三种算法:深度优先搜索(DFS)、广度优先搜索(BFS)和迭代加深(DFS-ID)的深度优先搜索。
深度优先搜索:1->2->3 1->2->4->5 1->6->7 1->6->8
广度优先搜索:1->2 1->6 1->2->3 1->2->4 1->6->7 1->6->8 1->2->4->5
每种搜索算法都有一个共同属性,即维护两个列表:开放列表(OPEN)和封闭列表(CLOSE)。
开放列表:包含树中所有等待搜索(或扩展)的节点 。
封闭列表:包含所有已经探索过的节点和不再考虑的节点。
深度优先搜索是用栈表示开放列表,栈是先进后出的数据结构。
广度优先搜索是用队列表示开放列表,队列是先进先出的数据结构。
以上图为例,假设5是终点
深度优先搜索:
Open=[1]; Closed=[]
Open=[2,6]; Closed=[1]
Open=[3,4,6]; Closed=[2,1]
Open=[4,6]; Closed=[3,2,1]
Open=[5,6]; Closed=[4,3,2,1]
广度优先搜索:
Open=[1]; Closed=[]
Open=[2,6]; Closed=[1]
Open=[6,3,4]; Closed=[2,1]
Open=[3,4,7,8]; Closed=[6,2,1]
Open=[4,7,8]; Closed=[3,6,2,1]
Open=[7,8,5]; Closed=[4,3,6,2,1]
Open=[8,5]; Closed=[7,4,3,6,2,1]
Open=[5]; Closed=[8,7,4,3,6,2,1]
选深度优先搜索还是广度优先搜索?
当树很深、分支因子不大、在树中解出现的位置相对较深时,选择深度优先搜索。
当搜索树的分支因子不太大、在树中解出现的位置在合理的深度级别、路径不是非常深的时候,选择广度优先搜索。
迭代加深的深度优先搜索(DFS-ID)
DFS-ID使用深度界限零,执行DFS的状态空间。
以上图为例:
DFS-ID:1->2 1->6 2->3 2->4->5 6->7 6->8 4->5
使用DFS-ID若没有找到目标,就会执行另一个DFS,深度界限为1,每次迭代深度界限加1,搜索都要重新开始。
总结
BFS是完备和优选的(在各种约束下),但过量的空间需求使其在应用上受到阻碍。
DFS既不是完备也不是优选的,DFS可能变得非常长或迷失在无限的路径中,但是空间需求合理。
DFS-ID同时具备DFS和BFS的有利性,即DFS的合理空间以及BFS的完备和优选。