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
- 可求搜索問題和優化問題,搜索問題可定義如下。
一個搜索問題π
有是立即Dπ
,低于π中的任務實例I,有一個有窮的解集合Sπ[I]
。
如果存在算法A,對于任何實例I
屬于Dπ
,A都停止,并且如果Sπ[I] = 空集
,則回答無解,否則給出Sπ[I]
中的一個解,那么稱A解搜索問題π - 搜索空間是一棵樹,每個節點對飲了部分向量,瞞住約束條件的葉子節點對應了相應的解,但是不一定是最優解。
- 搜索過程一般采用深度優先,廣度優先,函數有限或者深寬結合等策略,去裁剪分支,以便于優化。
- 判斷條件:滿足約束條件則可以擴張解向量,不滿足約束條件回溯到該節點的父節點。
When 什么時候做
要是回溯算法得到正確的應用,必須滿足多米諾性質
多米諾性質
已有x1, x2...xk
的k維向量
對于P來說x1, x2...xk
滿足條件,那么就可以推斷出x1, x2...xk+1
也滿足條件。(十分形象的比喻)
反之,如果不滿足條件,那么x1, x2...xk+1
也不滿足條件
How 怎樣做
- 定義搜索問題的解向量和每個分量的取值范圍。
- 確定子結點的排列規則。
- 判斷是否滿足多米諾性質。
- 確定使用的搜索策略。
- 確定每個節點能夠分支的約束條件。
- 確定存儲搜索路徑的數據結構。
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 為什么這么做
在高維度的計算中,夾雜這大量數據。我們通過分支優化可以大大減少數據計算量。分支界限優化就要確定相應的代價函數來優化。