1. 程式人生 > >演算法-廣度優先、深度優先和等代價搜尋

演算法-廣度優先、深度優先和等代價搜尋

0.摘要

本文主要介紹三種盲目搜尋演算法:廣度優先、深度優先和等代價搜尋。

首先,介紹幾個之後會用到的概念:

OPEN表:存放未擴充套件節點的表格

CLOSE表:存放以擴充套件節點的表格

1.寬度優先搜尋

寬度優先搜尋(BFS,Breadth First Search。 )又稱廣度優先搜尋,是最簡便的圖的搜尋演算法之一。

定義:如果搜尋是以接近初始節點的程度一次擴充套件節點的,那麼這種搜尋就叫做寬度優先搜尋。

演算法流程:

step1:把起始節點放到OPEN表中。如果起始節點為目標節點,找到一個解,結束;否則,轉step2。

step2:如果OPEN表是空表,則無解,結束;如果不為空,轉step3。

step3:把第一個節點(節點n)從OPEN表中移除,並存放到CLOSE表中,轉step4。

step4:如果節點n存在後續節點,擴充套件節點n,轉step5;否則,轉step2。

step5:把節點n的所有後續節點存放到OPEN表末端,並提供這些後續節點返回到節點n的指標,轉step6。

step6:如果節點n的任一後續節點為目標節點,求解完成,結束;否則,轉step2。

2.深度優先搜尋

深度優先搜尋(DFS,depth-first search)。在深度優先搜尋中,首先擴充套件的是最新生成的節點(即最深的節點)。

深度優先搜尋節點深度:

  1. 起始節點(即根節點)的深度為0
  2. 任何其他節點的深度等於其父輩節點深度+1

演算法流程:

step1:把起始節點S放到未拓展節點OPEN表。如果此節點為目標節點,則得到一個解,結束;否則,轉step2

step2:如果OPEN表為空,則未找到解,結束;否則,轉step3

step3::把第一個節點(節點n)從OPEN表移到CLOSE表中,轉step4

step4:如果節點n的深度達到最大的深度,轉step2

step5:擴充套件節點n,產生器全部後裔,並把它們放到OPEN表的前端,轉step6;如果沒有後裔,轉step2

step6:如果後繼節點有任何一個為目標節點,則求得一個解,結束;否則,轉step2

3.等代價搜尋

等代價搜尋(UCS,uniform cost search),又稱一致性代價搜尋。

在前面的闡述中,我們都假設搜尋樹的連線的代價是相同的。

但假設問題中的樹做一些改變,使得每條連線上都有一定的代價引數,並在問題中給定了起始狀態和目標狀態。這時候,若我們使用寬度優先搜尋,並解決尋找從起始狀態到目標狀態具有最小代價的路徑問題,那麼,這種被推廣了的寬度優先搜尋就稱作等代價搜尋。

演算法流程:

為表述方便,我們做以下規定:

  • 把從節點i到它的後繼節點j的連線狐仙代價記為c(i,j);
  • 把從起始節點S到任一節點i的路徑代價記為g(i)

step1:把起始節點S放到未擴充套件節點表OPEN中。如果起始節點為一目標節點,則求得一個解,結束;否則,令g(s) = 0,轉step2

step2:如果OPEN表為空,則表示沒有解,結束;否則,轉step3

step3:從OPEN表中選擇一個節點,使得g(i)最小。如果有幾個節點都符合,若存再目標節點,則選擇一個目標節點,結束;否則選擇一個作為節點i。並把節點i從OPEN表移至CLOSE表中,轉step4

step4:如果節點i為目標節點,則求得一個解,結束;否則,轉step5

step5:擴充套件節點i。如果沒有後繼節點,轉step2;否則,轉step6

step6:對於節點i的每個後繼節點,計算g(i) = g(i) + c(i,j),並把所有後繼節點j放在OPEN表中,提供返回到節點i的指標,轉step2