演算法導論12 分支限界法 01揹包問題

2021-10-24 17:21:36 字數 1193 閱讀 3554

12分支限界法—01揹包問題

問題描述:

乙個揹包有固定體積和容量兩個引數,針對n件商品,商品包含體積和價值兩個引數,如何選擇商品的裝入,使得揹包所裝入的總價值最大。

問題分析:

乙個商品有裝和不裝兩種狀態,因此此問題的解可以用一顆二叉樹來表示,二叉樹根節點到葉節點的路徑窮舉就是所有的選擇。在此基礎上,再刪去不符合條件的結點路線即可。下面對此演算法進行優化:

考慮三個問題:

1、如何確定某個結點選還是不選。

2、如何設計演算法實現當某個結點已經不符合限制或最優解時,對結點進行剪枝。

3、如何設計演算法實現從某乙個結點的計算快速跳到另乙個結點繼續計算。

針對問題一:通過計算當前選擇下揹包的價值上限,將該結點加入優先佇列,優先選擇價值上限最大的結點(使用貪心演算法,對剩餘結點進行排序,不考慮不可分割,盡量多的選擇單位價值最大的商品),來確定選擇哪個分支。

針對問題二:設計左剪枝函式,如果當前結點選擇時(該節點左分支),所選物品的總體積已經超過揹包體積,則剪枝該結點。 此步驟需要獲取每個結點下當前總體積。 設計右剪枝函式,當當前結點不選擇時,此時價值上限《當前最大已選最大價值(隨著結點的選擇不斷向上更新,數值變大),則對右分支進行剪枝。

針對問題三:使用優先佇列,按照價值上限進行優先選擇,實現從某個結點快速跳到其他結點的選擇。

01揹包分支限界法偽**:

//偽**

intmaxknapsack()

bound

();//計算上限

if(上限》最大價值)

heapnode n;//堆排序

h->

deletemax

(n);

//從優先佇列中取下乙個活結點。}}

//計算上限

intbound

(int i)

if(i<=n)

return b;

}

20201202更新:

分支限界法思路分析:(以01揹包為例子)

1 首先考慮暴力法,對所有情況進行窮舉,由於每件物品有選和不選兩種情況,所以解空間是二叉樹

2 對所有窮舉出的情況進行篩選:首先刪除容量超過揹包的情況,其次在剩下的情況中選擇價值最大的情況。

3 對該過程進行優化:

0 1揹包(分支限界法)

分支限界法 分支限界法 branch and bound method 是求解純整數規劃或混合整數規劃問題的經典方法,在上世紀六十年代由land doig和dakin等人提出。這種方法靈活且便於用計算機求解,目前已經成功運用於求解生產進度問題 旅行推銷員問題 工廠選址問題 揹包問題及分配問題等。演算...

0 1揹包問題 分支限界法

0 1揹包問題可描述為 n個物體和乙個揹包。對物體i,其價值為value,重量為weight,揹包的容量為w 如何選取物品裝入揹包,使揹包中所裝入的物品總價值最大?2.1 用到的資料結構 class goods 定義貨物資料型別 class knapsack 揹包 2.2 演算法步驟1 定 空間。x...

分支限界法 0 1揹包問題

分支限界法類似於回溯法,也是在問題的解空間上搜尋問題解的演算法。一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出解空間中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種意義下的最優解...