演算法 回溯法

2021-09-23 22:43:57 字數 1515 閱讀 9080

用回溯法解問題時,應明確定義問題的解空間。問題的解空間至少包含問題的乙個(最優)解。例如對於有n種可選擇物品的0-1揹包問題,其解空間由長度為n的0-1向量組成。該解空間包含對變數的所有可能的0-1賦值。例如n=3時,其解空間是

定義了問題的解空間後,還應該將解空間很好地組織起來,使得能用回溯法方便地搜尋整個解空間。通常將解空間組織成樹或者圖的形式。

例如,對於n=3時的0-1揹包問題,可用一顆完全的二叉樹表示其解空間,如下圖。

解空間樹的第i層到第i+1層邊上的標號給出了變數的值。從樹根到葉子的任一路徑表示解空間中的乙個元素。例如,從根節點到節點h的路徑相當與解空間中的元素(1,1,1)。

確定了解空間的組織結構後,回溯法從根節點出發,以深度優先搜尋方式搜尋整個解空間。回溯法以這種工作方式遞迴地在解空間中搜尋,直到找到所要求的解或解空間所有解都被遍歷過為止。

回溯法搜尋解空間樹時,通常採用兩種策略避免無效搜尋,提高回溯法的搜尋效率。其一是用約束函式在當前節點(擴充套件節點)處剪去不滿足約束的子樹;其二是用限界函式剪去得不到最優解的子樹。這兩類函式統稱為剪枝函式。

回溯法解題通常包含以下三個步驟:

1.針對所給問題,定義問題的解空間;

2.確定易於搜尋的解空間結構;

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

回溯法對解空間作深度優先搜尋,因此在一般情況下可用遞迴函式來實現回溯法。一般函式結構如下:

void bcktrack(int t) //引數t表示當前遞迴深度}}

採用樹的非遞迴深度優先演算法遍歷演算法,也可以將回溯法表示為乙個非遞迴的迭代過程。一般函式形式如下:

void iterativebacktrack(void)}}

else t--;}}

用回溯法解體的乙個顯著特徵是在搜尋過程中動態產生問題的解空間。在任何時刻,演算法只儲存從根節點到當前節點(擴充套件節點)的路徑。如果解空間樹從根節點到葉節點的最長路徑的長度為h(n),則回溯法所需的計算空間通常為o(h(n))。而顯式地儲存整個解空間則需要o(2^h(n))或o(h(n)!)記憶體空間。

八皇后問題是乙個以西洋棋為背景的問題:如何能夠在 8×8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題:這時棋盤的大小變為n×n,而皇后個數也變成n。當且僅當 n = 1 或 n ≥ 4 時問題有解。

以下是n後問題的例子**:

測試結果:帶入引數8,得到92種解,這個符合答案。

維基百科:八皇后問題

計算機演算法設計與分析/王曉東編著。-3版。-北京:電子工業出版社,2007.5

演算法 回溯法

0.0 回溯法核心 go depth begin from go 0 1.0 八皇后問題 問題描述 將八位皇后放在一張8x8的棋盤上,使得即任意兩個皇后都不在同一條橫線,豎線和斜線上,問一共有多少種擺法?暴力窮舉 step 1 先不考慮對稱性和可行性,一共是c 8 64 c tbinom c 648...

演算法 回溯法

用回溯法解問題時,應明確定義問題的解空間。問題的解空間至少包含問題的乙個 最優 解。例如對於有n種可選擇物品的0 1揹包問題,其解空間由長度為n的0 1向量組成。該解空間包含對變數的所有可能的0 1賦值。例如n 3時,其解空間是 定義了問題的解空間後,還應該將解空間很好地組織起來,使得能用回溯法方便...

ACM演算法 回溯法

回溯法 為了避免生成那些不可能產生最佳解的問題狀態,要不斷地利用限界函式 bounding function 來處死那些實際上不可能產生所需解的活結點,以減少問題的計算量。具有限界函式的深度優先生成法稱為回溯法!回溯法基本思想 1 針對所給問題,定義問題的解空間 2 確定易於搜尋的解空間結構 3 以...