5. 回溯與分支

What is backtracking algorithm?

Backtraking is a general algorithm for finding all (or some) solutions to some computational problems, notably(尤其是) constraint satisfaction problems, that incrementally builds candidates (申請者)to the solutions, and abandons each partial candidate("backtracks") as soon as it determines that the candidate cannot passibly be completed to a valid solution.
This is a search algorithm in graph and tree.

Feature

  1. 可求搜索問題和優化問題,搜索問題可定義如下。
    一個搜索問題π有是立即,低于π中的任務實例I,有一個有窮的解集合Sπ[I]。
    如果存在算法A,對于任何實例I屬于,A都停止,并且如果Sπ[I] = 空集,則回答無解,否則給出Sπ[I]中的一個解,那么稱A解搜索問題π
  2. 搜索空間是一棵樹,每個節點對飲了部分向量,瞞住約束條件的葉子節點對應了相應的解,但是不一定是最優解。
  3. 搜索過程一般采用深度優先廣度優先,函數有限或者深寬結合等策略,去裁剪分支,以便于優化。
  4. 判斷條件:滿足約束條件則可以擴張解向量,不滿足約束條件回溯到該節點的父節點。

When 什么時候做

要是回溯算法得到正確的應用,必須滿足多米諾性質

多米諾性質

已有x1, x2...xk的k維向量
對于P來說x1, x2...xk滿足條件,那么就可以推斷出x1, x2...xk+1也滿足條件。(十分形象的比喻)
反之,如果不滿足條件,那么x1, x2...xk+1也不滿足條件

How 怎樣做

  1. 定義搜索問題的解向量和每個分量的取值范圍。
  2. 確定子結點的排列規則。
  3. 判斷是否滿足多米諾性質。
  4. 確定使用的搜索策略。
  5. 確定每個節點能夠分支的約束條件。
  6. 確定存儲搜索路徑的數據結構。

Sample

reback(k)
if  k > n then < x1, x2,...,xn>是解
else while Sk != null
    xk = Sk 中的最小值
    Sk = Sk - {xk}
    計算Sk+1
    reback(k+1)
    
reBacktraking(n)
for i to n
    計算xk
S1 = x1
reback(1)

backtraking(n)
k = 1
計算sk
while sk != null
    xk = Sk的最小值
    Sk = Sk - xk
    if k < n
        k++
        計算Sk
    else 
        <x1,x2,...xn>就是解

Why 為什么這么做

在高維度的計算中,夾雜這大量數據。我們通過分支優化可以大大減少數據計算量。分支界限優化就要確定相應的代價函數來優化。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容