分支定界演算法的理解

2021-10-04 03:32:41 字數 1302 閱讀 2723

分支定界法的基本思想是對有約束條件的最優化問題的所有可行解(數目有限)空間進行搜尋

分支定界演算法始終圍繞著一顆搜尋樹進行的,我們將原始問題看出搜尋樹的根節點,從這裡出發,分支的含義就是將大的問題分割成小的問題,大問題可以看成是搜尋樹的父節點,那麼從大問題分割出來的小問題就是父節點的子節點了。分支的過程就是不斷給樹增加子節點的過程。

而定界就是在分支的過程去檢查子問題的上下界,如果子問題不能產生乙個比當前最優解還要優的解,那麼砍掉這一支,直到所有子問題都不能產生乙個最優的解的時候,演算法結束。

分支定界很像列舉的感覺,只不過加上了定界的過程,變成了一種非常有規律的列舉

舉個例子:

首先,對於乙個整數規劃模型

因為求解的是最大化問題,不妨設當前的最優解(函式值)為負無窮

首先從主問題分出兩支子問題:

通過線性鬆弛(規劃)求得兩個子問題的upper bound為z_lp1 = 12.75,z_lp2 = 12.2。由於z_lp1 和z_lp2都大於bestv=-inf,說明這兩支有搞頭。繼續往下。

2.從節點1和節點2兩個子問題再次分支,得到如下結果:

子問題3已經不可行,無需再理。子問題4通過線性鬆弛得到最優解為10,剛好也符合原問題0的所有約束,在該支找到乙個可行解,更新bestv = 10。

子問題5通過線性鬆弛得到upper bound為11.87>當前的bestv = 10,因此子問題5還有戲,待下一次分支。而子問題6得到upper bound為9《當前的bestv = 10,那麼從該支下去找到的解也不會變得更好,所以剪掉!

對節點5進行分支,得到:

子問題7不可行,無需再理。子問題8得到乙個滿足原問題0所有約束的解,但是目標值為4《當前的bestv=10,所以不更新bestv,同時該支下去也不能得到更好的解了。

此時,所有的分支遍歷都完成,我們最終找到了最優解。

將線上的值帶進去,留下來的值就是最優解

分支定界法 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,...

回溯與分支定界

假定演算法已經找到部分解為 x1,x2,xj 然後再考慮向量v x1,x2,xj xj 1 有下面的情況 解向量中每個xi都屬於乙個有限的線序集xi 1.如果v表示問題的最後解,演算法記錄下它作為乙個解,在僅希望獲得乙個解時終止,或者繼續去找出其他解。2.向前步驟 如果v表示乙個部分解,演算法通過選...