【转载】八数码问题BFS与DFS的比较

吃透算法,搞清原理,终有所得

八数码问题的深度优先及宽度优先算法比较

济南第六职业中等专业学校    王宇    2011年7月17日 16:46

预备知识:

人工智能问题广义地说,都可以看作是一个问题求解过程,因此问题求解是人工智能的核心问题,它通常是通过在某个可能的解答空间中寻找一个解来进行的。在问题求解过程中,人们所面临的大多数现实问题往往没有确定性的算法,通常需要用搜索算法来解决。目标和达到目标的一组方法称为问题,搜索就是研究这些方法能够做什么的过程。问题求解一般需要考虑两个基本问题:首先是使用合适的状态空间表示问题,其次是测试该状态空间中目标状态是否出现。

n        搜索包括两个方面:

--- 找到从初始事实到问题最终答案的一条推理路径

--- 找到的这条路径在时间和空间上复杂度最小

n        搜索包括两大类:

一般的搜索算法采用无信息指导的搜索策略(盲目搜索),如深度优先搜索(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): 如果 md大很多则比较严重

空间复杂度O(bm), 线性空间

宽度优先搜索:

时间复杂度1+b+b2+b3+… +bd + b(bd-1) = O(bd+1)

空间复杂度O(bd+1)

空间是大问题(和时间相比)

也就是说,宽度优先搜索的优势在于当问题有解时,一定能找到解,当问题为单位耗散值,且当问题有解时,一定能找到最优解。在进行宽度优先搜索时需要创建一个队列以保存所有的待扩展节点,而不是像深度优先搜索那样只需要保存当前状态即可,这样就使BFSDFS需要占用更多的空间,常常是指数级增长的,但由于BFS是按层次遍历的,一般来说能比DFS更快地找到解,因为它找到的第一个可行解一般来说都是最优解,而无需像DFS那样为了找到最优解而进行回溯,尽管如此,宽度优先还是很容易扩展那些没有用的节点,因此很容易造成状态的指数增长,甚至“组合爆炸”。

   

(二)优缺点

深度优先搜索:

缺点:

如果目标节点不在搜索所进入的分支上,而该分支又是一个无穷分支,则就得不到解.因此该算法是不完备的。

优点:

如果目标节点在搜索所进入的分支上,则可以较快地得到解。

宽度优先搜索:

缺点:

当目标节点距离初始节点较远时会产生许多无用的节点,搜索效率低。

优点:

只要问题有解,则总可以得到解,而且是最短路径的解。

你可能感兴趣的:(算法-例题)