首先理解什麼幾個概念問題
1.原理:回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發
現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為
回溯法2.問題的解向量:回溯法希望乙個問題的解能夠表示成乙個n元式(x1,x2,…,xn)的形式。
顯約束:對分量xi的取值限定。
隱約束:為滿足問題的解而對不同分量之間施加的約束。
解空間:對於問題的乙個例項,解向量滿足顯式約束條件的所有多元組,構成了該例項的乙個解空間
3.理解什麼是拓展節點 活節點 死節點
擴充套件結點:乙個正在產生兒子的結點稱為擴充套件結點。
活結點:乙個自身已生成但其兒子還沒有全部生成的節點稱做活結點。
死結點:乙個所有兒子已經產生的結點稱做死結點。
例子:例1:n=3的0——1 揹包問題的回溯法搜尋過程。w=[16,15,15] p=[45,25,25] c=30
在0-1揹包問題中;a先成為活節點和拓展節點,下面有兩種選擇b,c是拓展節點,假設先選擇b作為拓展節點,此時b成為活節點,那麼d和e成為拓展節點,由於d不可行,選擇e作為拓展節點,e作為活節點,之後是k,由於k作為葉子節點,成為死節點,之後返回到節點e,e也沒有拓展節點,成為死節點,依次是b,a有拓展節點,拓展節點為c。。。。。
4理解深度優先,寬度優先
深度優先
寬度優先
的問題狀態生成法:在乙個擴充套件結點變成死結點之前,它一直是擴充套件結點。
回溯法:為了避免生成那些不可能產生最佳解的問題狀態,要不斷地利用限界函式(bounding function)來處死那些實際上不可能產生所需解的活結點,以減少問題的計算量。
具有限界函式的深度優先生成法稱為回溯法。
解題步驟:
用回溯法解題的乙個顯著特徵是在搜尋過程中動態產生問題的解空間。在任何時刻,演算法只儲存從根結點到當前擴充套件結點的路徑。如果解空間樹中從根結點到葉結點的最長路徑的長度為h(n),則回溯法所需的計算空間通常為o(h(n))。而顯式地儲存整個解空間則需要o(2h(n))或o(h(n)!)記憶體空間。
解題步驟:
1)針對所給問題,定義問題的
解空間
;2)確定易於搜尋的解空間結構;
3)以深度優先方式搜尋解空間,並在搜尋過程中用
剪枝函式
避免無效搜尋。
常用剪枝函式:用
約束函式
在擴充套件結點處剪去不滿足約束的子樹;用
限界函式
剪去得不到最優解的子樹。
回溯法解解空間:
回溯法在問題的解空間樹中,按深度優先策略,從根結點出發搜尋解空間樹。演算法搜尋至解空間樹的任意一點時,先判斷該結點是否包含問題的解。如果肯定不包含,則跳過對該結點為根的子樹的搜尋,逐層向其祖
先結點回溯;否則,進入該子樹,繼續按深度優先策略搜尋。
例子:例1:n=3的0——1 揹包問題的回溯法搜尋過程。w=[16,15,15] p=[45,25,25] c=30
1.當所給問題是從n個元素的集合s中找出s滿足某種性質的子集時,相應的解空間稱為子集樹。例如:n個物品的0-1揹包問題所相應的解空間是一棵子集樹,這類子集樹通常有2^n個葉結點,其結點總數為(2^(n+1))-1。遍歷子集樹的演算法通常需奧秘加(2^n)計算時間。回溯法搜尋子集樹的演算法一般可以描述如下:
void backtrack(int t) }
例2:旅行售貨員問題。某售貨員要到若干城市去推銷商品,已知各城市之間的路程(旅費),他要選定一條從駐地出發,經過每個城市一遍,最後回到駐地的路線,使總的路程(總旅費)最小。
2.當所給問題的確定n個元素滿足某種性質的排列時,相應的解空間樹稱為排列樹。排列樹通常有n!個葉結點。因此遍歷排列樹需要奧秘加(n!)計算時間。旅行售貨員問題的解空間是一棵排列樹。回溯法搜尋排列樹的演算法一般可以描述如下:
void backtrack(int t) }
遞迴回溯:
回溯法對解空間作深度優先搜尋,因此,在一般情況下用遞迴方法實現回溯法。
[cpp]view plain
copy
void
backtrack (
intt)
} f(n,t) ,g(n,t) :表示當前擴充套件結點處未搜尋過的子樹的起始編號和終止編號。
h(i):表示在當前擴充套件結點處x[t]的第i個可選值
迭代回溯:
採用樹的非遞迴深度優先遍歷演算法,可將回溯法表示為乙個非遞迴迭代過程。
[cpp]view plain
copy
void
iterativebacktrack ()
演算法之回溯思想
回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,...
演算法思想 回溯法
很多經典的數學問題都可以用回溯演算法解決,比如數獨 八皇后 0 1 揹包 圖的著色 旅行商問題 全排列等等。籠統地講,回溯演算法很多時候都應用在 搜尋 這類問題上。不過這裡說的搜尋,並不是狹義的指我們前面講過的圖的搜尋演算法,而是在一組可能的解中,搜尋滿足期望的解。回溯演算法的理論知識很容易弄懂。不...
回溯法思想
回溯法是一種試探求解的方法,通過對問題的歸納分析,找出求解問題的乙個線索,沿著這一線索往前試 探,若試探成功,即得到解 若試探失敗,就逐步往回退,換其他路線再往前試探。因此,回溯法可以形象地概 況為 向前走,碰壁就回頭 回溯法從開始結點 根結點 出發,以深度優先的方式搜尋整個解空間 一般為樹結構空間...