回溯與分支定界

2022-01-31 17:06:57 字數 3285 閱讀 1355

•假定演算法已經找到部分解為(x1, x2, …, xj), 然後再考慮向量v=(x1, x2, …, xj ,xj+1), 有下面的情況:

(解向量中每個xi都屬於乙個有限的線序集xi)

1.如果v表示問題的最後解,演算法記錄下它作為乙個解,在僅希望獲得乙個解時終止,或者繼續去找出其他解。

2.(向前步驟)。如果v表示乙個部分解,演算法通過選擇集合xj+2中的第乙個元素向前。

3.如果v既不是最終的解,也不是部分解,則有兩種子情況。

a.如果從集合xj+1中還有其他的元素可選擇,演算法將xj+1置為xj+1中的下乙個元素。

b.(回溯步驟)。如果從集合xj+1中沒有更多的元素可選擇,演算法通過將xj置為xj中的下乙個元素回溯;如果從集合xj中仍然沒有其他的元素可以選擇,演算法通過將xj-1置為xj-1中的下乙個元素回溯,依次類推。

演算法 backtrackrec

輸入:集合x1,x2,…, xn 的清楚的或隱含的描述。

輸出:解向量v=(x1, x2, …, xi), i≤n。

v←φflag←

false

backrec(1)

ifflag then output v

else

output 「no solution」

procedure backrec (k)

for每個x∈xk

xk←x; 將xk加入v

if v 為最終解then set flag←true

and exit

else

if v 是部分解then backrec (k+1

)end

for

演算法backtrackiter

輸入:集合x1,x2,…, xn 的清楚的或隱含的描述。

輸出:解向量v=(x1, x2, …, xi), i≤n。

v←φflag←

falsek←1

while k≥1

while

xk 沒有被窮舉

xk←xk 中的下乙個元素;將xk加入v

if v 為最終解then set flag←true

, 且從兩個while迴圈退出

else

if v 是部分解then k←k+1

end

while

重置xk, 使得排在第一位的元素為下乙個元素

k←k-1

end

while

ifflag then output v

else output 「no solution」

遞迴實現:

演算法 3-colorrec

輸入:無向圖g=(v,e)。

輸出:g的頂點的3著色c[

1…n], 其中每個c[j]為1,2或3。

for k←1

to n

c[k] ←

0end

forflag←

false

graphcolor(1)

ifflag then output c

else

output 「no solution」

procedure graphcolor(k)

for color = 1 to 3

c[k] ←color

if c 為原問題的合法解 then flag←true

and exit

else

if c 是部分解 then graphcolor(k + 1

)end

for非遞迴實現:

演算法 3-coloriter

輸入:無向圖g=(v,e)。

輸出:g的頂點的3著色c[

1…n], 其中每個c[j]為1,2或3。

for k←1

to n

c[k] ←

0end

forflag←

falsek←1

while k≥1

//點、層、分量

while c[k] ≤2

//色、分量取值

c[k] ←c[k]+1

if c 為原問題的合法解 then flag←true

;從兩個while 迴圈退出

else

if c 是部分解 then k←k + 1

end

while

c[k] ←

0k←k-1

end

while

ifflag then oupput c

else output 「no solution

演算法 4-queens

輸入:空。

輸出:對應於4皇后問題的解的向量x[

1…4]。

1for k←1 to 4

2 x[k] ←0

3 end for

4 flag←false

5 k←1

6while k≥1

7while x [k] ≤3

8 x [k] ←x [k]+1

9if x 為原問題的合法解 then flag←true

且從兩個while 迴圈退出

10else

if x 是部分解 then k←k + 1

11 end while

12 x [k] ←0

13 k←k-1

14 end while

15if

flag then oupput x

else output 「no solution」

•最優化問題是根據某些約束尋求目標函式的最大或最小值。

•可以利用回溯的思想。

•且回溯的思想得到進一步的強化。

•和回溯法相比,分支定界法需要兩個額外的條件:

1.  對於一棵狀態空間樹的每乙個節點所代表的部分解,我們要提供一種方法,計算出通過這個部分解繁衍出的任何解在目標函式上的最佳值邊界。

2.  目前求得的最佳解的值。

•若能得到1,2兩資訊,即可拿某個階段的邊界值和目前求得的最佳解值比較:

如果邊界值不能超越(也就是說,在最小化問題中不小於,在最大化問題中不大於)目前的最佳解,這個節點就是乙個沒有希望的節點,需要立即關閉(剪枝),因為從這個節點生成的解,沒有乙個能比目前已經得到的解更好。

這就是分支界限技術的主要思想。

一般來說,對於乙個分支定界演算法的狀態空間樹來說,只要符合下面任一條件,我們就會中止它的在當前節點上的查詢路徑:

分支定界法 python 分支定界法

分支定界法 branch and bound 是一種求解離散資料組合的最優化問題。該演算法執行的效率取決於你所找的問題解空間的上下界,如果找到乙個很緊湊的上下界進行剪枝操作,該演算法的執行效率會非常高,因此它是最有可能在多項式時間內求解np問題的演算法。使用分支定界演算法的一般步驟為 構造一棵搜尋樹...

分支定界法

cpp view plain copy print pragma once include include include include include include include using namespace std struct node node int i,int c,node p,...

回溯與分支限界

代價函式 當前取得的價值 後面可以取得的最大價值 如果這個價值比之前得到的路徑的價值的最大值都小的話,那麼這個分支不再需要繼續延伸 分支策略 分支較少的結點先展開 預計可以得到較多解的結點先展開 對稱性 比如n皇后問題,可以又中線縱軸分成等價的兩部分的搜尋空間 裝箱問題中,可以以箱子的角度來回溯,也...