通用解題方法—回溯法

來源:互聯網
上載者:User

標籤:回溯   規模   img   方法   hive   col   []   不包含   class   

轉自:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html

1、概念

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

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

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

2、基本思想

  在包含問題的所有解的解空間樹中,按照深度優先搜尋的策略,從根結點出發深度探索解空間樹。當探索到某一結點時,要先判斷該結點是否包含問題的解,如果包含,就從該結點出發繼續探索下去,如果該結點不包含問題的解,則逐層向其祖先結點回溯。(其實回溯法就是對隱式圖的深度優先搜尋演算法)。

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

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

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

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

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

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

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

4、演算法架構

     (1)問題架構

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

     (2)非遞迴回溯架構

   1: int a[n],i;   2: 初始化數組a[];   3: i = 1;   4: while (i>0(有路可走)   and  (未達到目標))  // 還未回溯到頭   5: {   6:     if(i > n)                                              // 搜尋到葉結點   7:     {      8:           搜尋到一個解,輸出;   9:     }  10:     else                                                   // 處理第i個元素  11:     {   12:           a[i]第一個可能的值;  13:           while(a[i]在不滿足約束條件且在搜尋空間內)  14:           {  15:               a[i]下一個可能的值;  16:           }  17:           if(a[i]在搜尋空間內)  18:          {  19:               標識佔用的資源;  20:               i = i+1;                              // 擴充下一個結點  21:          }  22:          else   23:         {  24:               清理所佔的狀態空間;            // 回溯  25:               i = i –1;   26:          }  27: }
View Code

  (3)遞迴的演算法架構

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

   1: int a[n];   2: try(int i)   3: {   4:     if(i>n)   5:        輸出結果;   6:      else   7:     {   8:        for(j = 下界; j <= 上界; j=j+1)  // 枚舉i所有可能的路徑   9:        {  10:            if(fun(j))                 // 滿足限界函數和約束條件  11:              {  12:                 a[i] = j;  13:               ...                         // 其他動作  14:                 try(i+1);  15:               回溯前的清理工作(如a[i]置空值等);  16:               }  17:          }  18:      }  19: }
View Code

通用解題方法—回溯法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.