【转载】八数码问题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那样为了找到最优解而进行回溯,尽管如此,宽度优先还是很容易扩展那些没有用的节点,因此很容易造成状态的指数增长,甚至“组合爆炸”。

   

(二)优缺点

深度优先搜索:

缺点:

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

优点:

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

宽度优先搜索:

缺点:

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

优点:

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

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
八数码问题的解决方法中,C语言可以使用BFS(广度优先搜索)算法来解决。在C语言中,可以通过实现一个EightDigital类来解决八数码问题。通过BFS算法可以找到从初始状态到目标状态的最短路径。在该算法中,通过队列的方式,一层一层地扩展状态空间,直到找到目标状态。 在该实现中,可以使用一个辅助数组来记录每个状态的前驱状态,以便打印出从初始状态到目标状态的路径。具体实现中,可以使用一个stack来存储路径,从目标状态开始,通过查找前驱状态一直到初始状态,将每个状态压入栈中,最后依次弹出栈顶元素即可得到路径。同时,使用一个变量记录步数,即栈的大小,即可得到解的步数。 除了BFS算法外,还可以使用A*算法来解决八数码问题。A*算法是一种启发式搜索算法,通过评估函数来估计从当前状态到目标状态的代价,并选择代价最小的状态进行扩展。在八数码问题中,可以使用曼哈顿距离作为评估函数,即当前状态到目标状态的每个数字所需的水平和垂直移动的总和。通过A*算法可以更快地找到最优解。 总结起来,八数码问题可以使用C语言中的BFS算法和A*算法来解决。BFS算法可以找到最短路径,A*算法可以更快地找到最优解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [c++八数码难题全家桶(A*算法、双向BFSBFSDFS)](https://blog.csdn.net/qq_54893805/article/details/127440809)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值