【説明する】深度优先及宽度优先算法比较
吃透算法,搞清原理,终有所得
深度优先及宽度优先算法比较
预备知识:
人工智能问题广义地说,都可以看作是一个问题求解过程,因此问题求解是人工智能的核心问题,它通常是通过在某个可能的解答空间中寻找一个解来进行的。在问题求解过程中,人们所面临的大多数现实问题往往没有确定性的算法,通常需要用搜索算法来解决。目标和达到目标的一组方法称为问题,搜索就是研究这些方法能够做什么的过程。问题求解一般需要考虑两个基本问题:首先是使用合适的状态空间表示问题,其次是测试该状态空间中目标状态是否出现。
搜索包括两个方面:
--- 找到从初始事实到问题最终答案的一条推理路径
--- 找到的这条路径在时间和空间上复杂度最小
搜索包括两大类:
一般的搜索算法采用无信息指导的搜索策略(盲目搜索),如深度优先搜索(DFS)和宽度优先搜索(BFS),还有一些搜索算法采用了启发式信息指导的搜索策略,如A*算法。
深度优先算法:
Procedure Depth First Search
Begin
1.把初始节点压入栈(后进先出),并设置栈顶指针;
2.While 栈不空do
Begin
弹出栈顶元素;
If 栈顶元素=goal,成功返回并结束;
Else 以任意次序把栈顶元素的子女压入栈中;
End While
End
宽度优先算法:
Procedure Breath-first-search
Begin
1.把初始节点放入队列(先进先出);
2.Repeat
取得队列最前面的元素为current;
If current=goal
成功返回并结束;
Else do
Begin
如果current有子女,把current的子女
以任意次序添加到队列的尾部;
End
Until 队列为空
End.
例题.
八数码难题:
解决八数码问题的两种搜索策略:
假设初始状态和目标状态分别是:
深度优先搜索:
可见,深度优先搜索,在设定深度界限为4层的前提下,要到达目标,最快需要14步。
宽度优先搜索:
可见,宽度优先搜索,要达到目标,最快需要16步。
两种策略的比较:
(一)复杂度
深度优先搜索:
时间复杂度O(bm): 如果 m比d大很多则比较严重
空间复杂度O(bm), 线性空间
宽度优先搜索:
时间复杂度1+b+b2+b3+… +bd + b(bd-1) = O(bd+1)
空间复杂度O(bd+1)
空间是大问题(和时间相比)
也就是说,宽度优先搜索的优势在于当问题有解时,一定能找到解,当问题为单位耗散值,且当问题有解时,一定能找到最优解。
在进行宽度优先搜索时需要创建一个队列以保存所有的待扩展节点,而不是像深度优先搜索那样只需要保存当前状态即可,这样就使BFS比DFS需要占用更多的空间,常常是指数级增长的,但由于BFS是按层次遍历的,一般来说能比DFS更快地找到解,因为它找到的第一个可行解一般来说都是最优解,而无需像DFS那样为了找到最优解而进行回溯,尽管如此,宽度优先还是很容易扩展那些没有用的节点,因此很容易造成状态的指数增长,甚至“组合爆炸”。
(二)优缺点
深度优先搜索:
缺点:
如果目标节点不在搜索所进入的分支上,而该分支又是一个无穷分支,则就得不到解.因此该算法是不完备的。
优点:
如果目标节点不在搜索所进入的分支上,则可以较快地得到解。
宽度优先搜索:
缺点:
当目标节点距离初始节点较远时会产生许多无用的节点,搜索效率低。
优点:
只要问题有解,则总可以得到解,而且是最短路径的解。
orz http://zhiluoxuepiao.blog.163.com/blog/static/171866065201162010423600/