廣度優先搜尋演算法

2021-03-31 08:56:58 字數 1454 閱讀 2439

在深度優先搜尋中,深度越大的結點越先得到擴充套件。如果把它改為深度越小的結點越先得到擴充套件,就是廣度優先搜尋法。

廣度優先搜尋演算法的基本思想:

(1)建立乙個空的狀態佇列ss;

(2)建立乙個空的狀態庫sb;

(3)把初始狀態s(0)存入佇列ss中;

(4)若佇列狀態是目標狀態,則搜尋成功,演算法執行中止。如該狀態的形式為s(path),則解就是(path);

(5)若某種搜尋極限已經達到(如空間用完等),則搜尋失敗,演算法執行結束,沒有解;

(6)按某種原則取乙個可以應用於ss第乙個狀態s(path)並產生合適的新狀態的規則rn,產生新狀態t(path,n),並將其置於ss的最後,轉(4)。若擴充套件失敗,即沒有新狀態產生,則將ss中第乙個狀態從ss中除去,送入sb中,執行下步;

(7)若ss成為空佇列,則搜尋失敗,演算法執行結束,沒有解。否則轉(5)。

注:在實際解題中,演算法可能有許多不同的變型,要視具體情況應變。下給出演算法可供參考:

廣度優先基本演算法如下:

program bfs;

初始化;建立資料庫data;初始狀態存入資料庫;

設佇列首指標closed:=0;佇列尾指標open:=1;

repeat

取下乙個closed所指結點;

for r:=1 to rmax do

begin

if 子結點符合條件 then

begin

open增1,把新結點存入資料庫隊尾;

if 新結點與原有結點重複 then

刪去該結點(open減1)

else

if 新結點即目標 then 輸出並退出;

endend

until closed>=open;

廣度優先搜尋的顯著特點是,在產生新的子結點時,深度越小的越得到優先擴充套件,即先產生它的子結點。當結點到根結點的費用和結點的深度成正比,特別是當每一結點到根結點的費用等於深度值時,用廣度優先得到的解一定是最優解。但只要將上述演算法進行改進也可以求得最優解,這就成了代價優先搜尋。

下面是乙個24點程式的**:

#include 

#include 

#include 

using  namespace  std; 

const  double  precision  =  1e-6; 

const  int  count_of_number    =  4; 

const  int  number_to_be_cal  =  24; 

double  number[count_of_number]; 

string  expression[count_of_number]; 

bool  search(int  n) 

if  (n  ==  1)    else    else  { 

cout  <<  "fail."  <<  endl; 

廣度優先搜尋演算法

廣度優先搜尋 bfs 這個是第乙個研究的課題,廣度優先搜尋也叫寬度優先搜尋,英文為breadth first searth,開始看的時候一頭霧水,基本也能懂大致意思,但是還不是真正的理解,今天又仔細看看,大致理解上又更深了一層吧。下面來總結下,自己的一些體會,以及對它的獨到的理解。大的方面來說它是一...

廣度優先搜尋演算法

看了下廣度優先搜尋演算法得定義為從乙個頂點開始,找到最短路勁,歸結為一種連通圖得遍歷策略 如果我們要求v0到v6的一條最短路 假設走乙個節點按一步來算 注意 此處你可以選擇不看這段文字直接看圖3 1 我們明顯看出這條路徑就是v0 v2 v6,而不是v0 v3 v5 v6。先想想你自己剛剛是怎麼找到這...

廣度優先搜尋演算法

廣度優先搜尋解決兩個問題 第一類問題 從節點a出發,有前往節點b的路徑嗎?第二類問題 從節點a出發,前往節點b的哪條路徑最短?假設你經營著乙個芒果農場,需要尋找芒果銷售商,以便將芒果賣給他。在facebook,你與芒果銷售商有聯絡嗎?為此,你可在朋友中查詢。這樣一來,你不僅在朋友中查詢,還在朋友的朋...