圖搜尋演算法(一):圖搜尋的一般演算法
一、引言
圖搜尋技術時人工智慧中的核心技術之一,並且在其他場合也有著非常廣泛的應用。這裡的圖稱為狀態圖,指由節點和有向(帶權)邊所做成的網路,每個節點即狀態。按照搜尋的方式不同,圖搜尋一般分為樹式搜尋和線式搜尋。兩者最大的區別就在於搜尋過程中所記錄的軌跡不同,顧名思義,樹式搜尋記錄的是一顆搜尋樹,而線式搜尋是一條折線。我們一般用一個Closed表的資料結構來記錄搜尋節點,對於樹式搜尋來說,Closed表儲存的正是一顆不斷成長的搜尋樹,而線式搜尋儲存的則是一條不斷伸長的折線,如果能找到目標節點的話,它本身就是搜尋的路徑。而樹式搜尋需要通過目標節點進行回溯,直至初始節點,從而找到路徑。
二、樹式搜尋的一般演算法
對於樹式搜尋演算法,我們需要將待考察的節點放在一起,並做某種排列,以控制搜尋順序,實現某種策略。因此,使用一個Open表的資料結構來記錄當前待考察的節點。(這是可回溯線式搜尋和深度優先搜尋的區別)。
下面給出Open表和Closed表的資料結構:
節點 | 父節點編號 |
編號 | 節點 | 父節點編號 |
GRAPHSEARCH:
(1)建立一個只含有起始節點S的搜尋圖G,圖中每個節點有一個指向其父節點的指標, S的這一指標為一特殊值(如0), 並把S放入未擴充套件節點表OPEN中.
(2)建立已擴充套件的節點表CLOSED,初始時該表為空.
(3)LOOP:若OPEN表為空,則失敗退出.
(4)把OPEN表中的第一個節點移出,放入CLOSED表中, 稱其為n節點.
(5)若n為目標節點,則成功退出. 問題的解是沿指標 追蹤G中從n到S的路徑而得到的.
(6)擴充套件節點n, 生成不是n的祖先的那些後繼節點的集合M.如果沒有後繼節點,則轉LOOP.
(7)把那些不在G中的M的成員作為n的後繼節點加入G,並設定一個通向n的指標,把它們加入OPEN表. 對已在G中的M的成員,調整有關指標.
(8)按某種方式, 重排OPEN表.
(9)轉LOOP.
三、基於一般圖搜尋演算法的搜尋策略根據搜尋策略的不同,圖搜尋演算法一般分為兩大類:盲目搜尋和啟發式搜尋。顧名思義,盲目搜尋是一種無嚮導的搜尋,窮舉所有可能的狀態,這種演算法實現簡單,但效率很低;啟發式搜尋是根據具體的問題,在搜尋的過程中產生啟發性的資訊,指導搜尋過程,啟發式搜尋能極大提高搜尋效率,並且有可能得到問題的最優解。
之所以有這樣的搜尋策略的區分,是因為在圖搜尋一般演算法中的Open表設計造成的,Open表是待考察的節點狀態,那麼考察Open表中節點的順序,便指導了整個搜尋的順序,從而產生了不同的搜尋策略。以常見的盲目搜尋演算法:廣度優先演算法和深度優先演算法為例,不難想象,廣度優先演算法中的Open表是一個佇列,即先進先出,那麼後加入的節點永遠都是後擴充套件的節點,即深度小的節點永遠都是優先擴充套件的,因為他們是先加入Open表的。而深度優先演算法的Open表是一個棧結構,即後進先出,擴充套件總是沿著一條線縱深擴充套件,再回溯的。
對啟發式搜尋,又根據所依據的估價值不同,分為基於代價函式g(x)的搜尋,基於啟發函式h(x)的搜尋,和基於估價函式f(x) = g(x)+h(x)的搜尋(A演算法和A*演算法)。