吃透算法,搞清原理,終有所得
深度優先及寬度優先算法比較
預備知識:
人工智能問題廣義地說,都可以看作是一個問題求解過程,因此問題求解是人工智能的核心問題,它通常是通過在某個可能的解答空間中尋找一個解來進行的。在問題求解過程中,人們所面臨的大多數現實問題往往沒有確定性的算法,通常需要用搜索算法來解決。目標和達到目標的一組方法稱為問題,搜索就是研究這些方法能夠做什么的過程。問題求解一般需要考慮兩個基本問題:首先是使用合適的狀態空間表示問題,其次是測試該狀態空間中目標狀態是否出現。
搜索包括兩個方面:
--- 找到從初始事實到問題最終答案的一條推理路徑
--- 找到的這條路徑在時間和空間上復雜度最小
搜索包括兩大類:
一般的搜索算法采用無信息指導的搜索策略(盲目搜索),如深度優先搜索(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/
