搜尋演算法基礎教程

2021-03-31 16:01:38 字數 2451 閱讀 7426

搜尋演算法是利用計算機的高效能來有目的的窮舉乙個問題的部分或所有的可能情況,從而求出問題的解的一種方法。搜尋過程實際上是根據初始條件和擴充套件規則構造一棵解答樹並尋找符合目標狀態的節點的過程。所有的搜尋演算法從其最終的演算法實現上來看,都可以劃分成兩個部分──控制結構和產生系統,而所有的演算法的優化和改進主要都是通過修改其控制結構來完成的。現在主要對其控制結構進行討論,因此對其產生系統作如下約定:

function expendnode(situation:tsituation;expendwayno:integer):tsituation;

表示對給出的節點狀態sitution採用第expendwayno種擴充套件規則進行擴充套件,並且返回擴充套件後的狀態。

(本文所採用的演算法描述語言為類pascal。)

一、回溯演算法

回溯演算法是所有搜尋演算法中最為基本的一種演算法,其採用了一種「走不通就掉頭」思想作為其控制結構,其相當於採用了先根遍歷的方法來構造解答樹,可用於找解或所有解以及最優解。具體的演算法描述如下:

[非遞迴演算法]node(節點型別)=record     situtation:tsituation(當前節點狀態);     way-no:integer(已使用過的擴充套件規則的數目);   endlist(回溯表):array[1..max(最大深度)] of node;   pos(當前擴充套件節點編號):integer;list<-0;   pos<-1;   list[1].situation<-初始狀態;while (pos>0(有路可走)) and ([未達到目標]) dobegin  if pos>=max then (資料溢位,跳出主程式);  list[pos].way-no:=list[pos].way-no+1;  if (list[pos].way-no<=totalexpendmethod) then (如果還有沒用過的擴充套件規則)  begin    if (可以使用當前擴充套件規則) then    begin      (用第way條規則擴充套件當前節點)      list[pos+1].situation:=expendnode(list[pos].situation,                                        list[pos].way-no);      list[pos+1].way-no:=0;      pos:=pos+1;    end-if;  end-if  else begin         pos:=pos-1;       end-elseend-while;

[遞迴演算法]procedure backtrack(situation:tsituation;deepth:integer);var  i    :integer;begin  if deepth>max then (空間達到極限,跳出本過程);  if situation=target then (找到目標);  for i:=1 to totalexpendmethod do  begin    backtrack(expendnode(situation,i),deepth+1);  end-for;end;

範例:乙個m*m的棋盤上某一點上有乙個馬,要求尋找一條從這一點出發不重複的跳完棋盤上所有的點的路線。

評價:回溯演算法對空間的消耗較少,當其與分枝定界法一起使用時,對於所求解在解答樹中層次較深的問題      有較好的效果。但應避免在後繼節點可能與前繼節點相同的問題中使用,以免產生迴圈。

二、深度搜尋與廣度搜尋

深度搜尋與廣度搜尋的控制結構和產生系統很相似,唯一的區別在於對擴充套件節點擊取上。由於其保留了所有的前繼節點,所以在產生後繼節點時可以去掉一部分重複的節點,從而提高了搜尋效率。這兩種演算法每次都擴充套件乙個節點的所有子節點,而不同的是,深度搜尋下一次擴充套件的是本次擴充套件出來的子節點中的乙個,而廣度搜尋擴充套件的則是本次擴充套件的節點的兄弟節點。在具體實現上為了提高效率,所以採用了不同的資料結構.

[廣度搜尋]node(節點型別)=record     situtation:tsituation(當前節點狀態);     level:integer(當前節點深度);     last :integer(父節點);   endlist(節點表):array[1..max(最多節點數)] of node(節點型別);   open(總節點數):integer;  close(待擴充套件節點編號):integer;   new-s:tsituation;(新節點)list<-0;   open<-1;   close<-0;   list[1].situation<- 初始狀態;   list[1].level:=1;   list[1].last:=0;while (closeopen:array[1..max] of node;(待擴充套件節點表)   close:array[1..max] of node;(已擴充套件節點表)   openl,closel:integer;(表的長度)   new-s:tsituation;(新狀態)open<-0; close<-0;   openl<-1;closel<-0;   open[1].situation<- 初始狀態;   open[1].level<-1;   open[1].last<-0;while (openl>0) and (closelhttp://.mydrs.  大榕樹

A 搜尋演算法

啟發式搜尋演算法 要理解 a 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...

A 搜尋演算法

a 演算法是基於bfs的一種入門級啟發式搜尋演算法,就是將bfs的佇列改為基於估價的優先佇列,可以快速地找到答案。優先隊列為小根堆 while 優先佇列不為空 取出隊頭並擴充套件 將擴充套件節點以估價值 當前值為優先順序入隊 endwhile估價函式越接近真實值演算法越優,但一定不能大於真實值,否則...

搜尋演算法小結

搜尋演算法是利用計算機的高效能來有目的的窮舉乙個問題的部分和所有的可能情況,從而求出問題的解的一種方法。常用的搜尋演算法有 一.回溯法 回溯演算法是所有搜尋演算法中最為基本的一種演算法,其採用了一種 走不通就掉頭 思想作為其控制結構,其相當於採用了先根遍歷的方法來構造解答樹,可用於找解或所有解以及最...