演算法入門(4) 回溯法

2021-07-23 10:48:02 字數 1201 閱讀 6469

**:

1、概念

回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。

回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。

許多複雜的,規模較大的問題都可以使用回溯法,有「通用解題方法」的美稱。

2、基本思想

若用回溯法求問題的所有解時,要回溯到根,且根結點的所有可行的子樹都要已被搜尋遍才結束。

而若使用回溯法求任乙個解時,只要搜尋到問題的乙個解就可以結束。

3、用回溯法解題的一般步驟:

(1)針對所給問題,確定問題的解空間:

首先應明確定義問題的解空間,問題的解空間應至少包含問題的乙個(最優)解。

(2)確定結點的擴充套件搜尋規則

(3)以深度優先方式搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋。

4、演算法框架

(1)問題框架

設問題的解是乙個n維向量(a1,a2,………,an),約束條件是ai(i=1,2,3,…..,n)之間滿足某種條件,記為f(ai)。

(2)非遞迴回溯框架

int a[n],i;  //初始化陣列a;   

i = 1;

while (i>0(有路可走) and (未達到目標)) // 還未回溯到頭

else

// 處理第i個元素

if(a[i]在搜尋空間內)

}}

(3)遞迴的演算法框架

回溯法是對解空間的深度優先搜尋,在一般情況下使用遞迴函式來實現回溯法比較簡單,其中i為搜尋的深度,框架如下:

int a[n];   

try(int i){

if(i>n)

輸出結果;

else{

for(j = 下界; j <= 上界; j=j+1) // 列舉i所有可能的路徑

{

if(fun(j)){ // 滿足限界函式和約束條件

a[i] = j;

... // 其他操作

try(i+1);

演算法實驗4《回溯法》

1.編寫乙個簡單的程式,解決8皇后問題。include using namespace std bool backtrack int list 8 int t return false intmain 2.批處理作業排程問題 問題描述 給定n個作業的集合j j1,j2,jn 每乙個作業ji都有兩項任...

演算法入門經典7 4回溯法

7.4.1八皇后問題 首先,得重新介紹一下遞迴。這是非常必要的,因為事先我沒有在意這個,導致我理解。困難 遞迴就是 乙個過程或函式在其定義或說明中又直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要...

實驗五 回溯法

實驗 五 回溯法 一 實驗目的與要求 1 通過回溯法的示例程式理解回溯法的基本思想 2 運用回溯法解決實際問題進一步加深對回溯法的理解和運用 二 實驗內容 1 分析並掌握 符號三角 問題的回溯法求解方法 2 分析並掌握 n皇后 問題的回溯演算法求解方法 3 練習使用回溯法求解 整數變換 等問題。三 ...