深度優先搜索

深度優先搜索

開發爬蟲早期使用的方法
深度優先搜索是一種在開發爬蟲早期使用較多的方法。它的目的是要達到被搜索結構的葉結點(即那些不包含任何超鍊的HTML文件)。在一個HTML文件中,當一個超鍊被選擇後,被鍊接的HTML文件将執行深度優先搜索。即在搜索其餘的超鍊結果之前必須先完整地搜索單獨的一條鍊。深度優先搜索沿着HTML文件上的超鍊走到不能再深入為止,然後返回到某一個HTML文件,再繼續選擇該HTML文件中的其他超鍊。當不再有其他超鍊可選擇時,說明搜索已經結束。
    中文名:深度優先搜索 外文名: 所屬學科: 英文名:Depth-First-Search 提出者:霍普克洛夫特與羅伯特·塔揚 應用學科:計算機 适用:開發爬蟲早期使用較多的方法

定義

事實上,深度優先搜索屬于圖算法的一種,英文縮寫為DFS即Depth First Search.其過程簡要來說是對每一個可能的分支路徑深入到不能再深入為止,而且每個節點隻能訪問一次。

舉例說明:下圖是一個無向圖,如果我們從A點發起深度優先搜索(以下的訪問次序并不是唯一的,第二個點既可以是B也可以是C,D)。

則我們可能得到如下的一個訪問過程:A->B->E(沒有路了!回溯到A)->C->F->H->G->D(沒有路,最終回溯到A,A也沒有未訪問的相鄰節點,本次搜索結束)。

簡要說明深度優先搜索的特點:每次深度優先搜索的結果必然是圖的一個連通分量。

深度優先搜索可以從多點發起.如果将每個節點在深度優先搜索過程中的"結束時間"排序(具體做法是創建一個list,然後在每個節點的相鄰節點都已被訪問的情況下,将該節點加入list結尾,然後逆轉整個鍊表)。

則我們可以得到所謂的"拓撲排序",即topological sort。

思路

深度優先遍曆圖的方法是,從圖中某頂點v出發,訪問頂點v。

依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍曆;直至圖中和v有路徑相通的頂點都被訪問。

若此時圖中尚有頂點未被訪問,則從一個未被訪問的頂點出發,重新進行深度優先遍曆,直到圖中所有頂點均被訪問過為止。

當然,當人們剛剛掌握深度優先搜索的時候常常用它來走迷宮.事實上我們還有别的方法,那就是廣度優先搜索(BFS)。

窮舉

在遇到的一些問題當中,有些問題我們不能夠确切的找出數學模型,即找不出一種直接求解的方法,解決這一類問題,我們一般采用搜索的方法解決。

搜索就是用問題的所有可能去試探,按照一定的順序、規則,不斷去試探,直到找到問題的解,試完了也沒有找到解,那就是無解,試探時一定要試探完所有的情況(實際上就是窮舉)。

對于問題的第一個狀态,叫初始狀态,要求的狀态叫目标狀态。

搜索就是把規則應用于實始狀态,在其産生的狀态中,直到得到一個目标狀态為止。

産生新的狀态的過程叫擴展(由一個狀态,應用規則,産生新狀态的過程)。

搜索的要點:初始狀态。

重複産生新狀态。

檢查新狀态是否為目标,是結束,否轉。

如果搜索是以接近起始狀态的程序依次擴展狀态的,叫寬度優先搜索。

如果擴展是首先擴展新産生的狀态,則叫深度優先搜索。

解釋

深度優先搜索用一個數組存放産生的所有狀态。

把初始狀态放入數組中,設為當前狀态。

擴展當前的狀态,産生一個新的狀态放入數組中,同時把新産生的狀态設為當前狀态。

判斷當前狀态是否和前面的重複,如果重複則回到上一個狀态,産生它的另一狀态。

判斷當前狀态是否為目标狀态,如果是目标,則找到一個解答,結束算法。

如果數組為空,說明無解。

對于pascal語言來講,它支持遞歸,在遞歸時可以自動實現回溯(利用局部變量)所以使用遞歸編寫深度優先搜索程序相對簡單,當然也有非遞歸實現的算法。

搜索是人工智能中的一種基本方法,是一項非常普遍使用的算法策略,能夠解決許許多多的常見問題,在某些情況下我們很難想到高效的解法時,搜索往往是可選的唯一選擇。

按照标準的話來講:搜索算法是利用計算機的高性能來有目的的窮舉一個問題的部分或所有的可能情況,從而求出問題的解的一種方法。

搜索雖然簡單易學易于理解,但要掌握好并寫出速度快效率高優化好的程序卻又相當困難,總而言之,搜索算法靈活多變,一般的框架很容易寫出,但合适的優化卻要根據實際情況來确定。

在搜索算法中,深度優先搜索(也可以稱為回溯法)是搜索算法裡最簡單也最常見的,今天我們就從這裡講起,下面的内容假設讀者已經知道最基本的程序設計和簡單的遞歸算法

系統算法

所有的搜索算法從其最終的算法實現上來看,都可以劃分成兩個部分──控制結構和産生系統。

正如前面所說的,搜索算法簡而言之就是窮舉所有可能情況并找到合适的答案,所以最基本的問題就是羅列出所有可能的情況,這其實就是一種産生式系統。

我們将所要解答的問題劃分成若幹個階段或者步驟,當一個階段計算完畢,下面往往有多種可選選擇,所有的選擇共同組成了問題的解空間,對搜索算法而言,将所有的階段或步驟畫出來就類似是樹的結構。

從根開始計算,到找到位于某個節點的解,回溯法(深度優先搜索)作為最基本的搜索算法,其采用了一種“一隻向下走,走不通就掉頭”的思想(體會“回溯”二字),相當于采用了先根遍曆的方法來構造搜索樹。

上面的話可能難于理解,沒關系,我們通過基本框架和例子來闡述這個算法,你會發現其中的原理非常簡單自然。

基本框架

·dfs(狀态)

–if狀态是目标狀态then

·dosomething

–else

·for每個新狀态

–if新狀态合法

»dfs(新狀态)

·主程序:

·dfs(初始狀态)

相關

評價指标

多目标進化算法根據性能評價指标衡量其優劣,主要從算法所求解集的質量、算法求解效率以及算法魯棒性三方面來評價,并側重于解集的質量,現有的相關工作缺乏對評價指标數學性質的分析。

優化設計

針對差分進化算法“早熟"問題,提出一種自适應變異率的雙策略差分進化(AD-DE)算法。在叠代前期取較小變異率,并采用全局變異策略,快速鎖定較優開采區間。

在叠代後期取較大變異率,同時采用改進的局部變異策略,提高算法局部開采能力及加快收斂速度。

相關詞條

相關搜索

其它詞條