揹包問題之分枝界限

問題描述

    揹包的容量爲C,現有N件物品,價格分別爲p[0],p[1]......p[n-1].重量分別爲:w[0],w[1]......w[n-1].從N件物品中選擇任意個放入揹包中,使得物體的價值最大並且總重量不超過揹包的容量C。

       採用數學語言描述如下:

      在  w[0]*x[0] + w[1] *x[1]+....... +w[n-1]*x[n-1]  < C, x[i] = 0 或1 的條件下

      求  p[0]*x[0] + p[1] *x[1]+....... +p[n-1]*x[n-1]   的最大值。

 

 分枝界限介紹

   分枝界限可以說是dfs和bfs的結合,綜合了DFS算法空間複雜度低和BFS時間複雜度低的優點。分枝界限法在回溯法的基礎上更進了一步,在回溯法中,一旦從問題狀態空間樹導出的解不滿足約束函數,我們就將其分枝剪掉。在處理此類問題時,回溯法的思想可以進一步強化。在回溯法的基礎上加上兩個額外的條件就變成了分支界限法

           1.  對於一棵狀態空間樹的每一個結點所代表的部分解, 我們要提供一種算法,計算出通過這個部分解所繁衍也的任何解在目標函數

            上的最佳邊界。

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

   有了這兩個條件,我們可以用當前求得的最佳解和所有結點的最佳邊界比較,如果某結點的最佳邊界不能超越當前最佳解(在求最大化問題

中,該結點的最佳上界不大於當前最佳解,在求最小化問題中,該結點的最佳下界不小於當前最佳解),則將其剪掉。這就是分枝界限的主要相思。

 

 問題分析。

    在揹包問題中,怎樣求最佳邊界呢,最簡單的一種求法是將物品的按價值重量比(p[i]/w[i])排序,將已經選擇好的物品總價值currentValue加上揹包剩餘重量C-currentWeight(currentWeight爲當前揹包中物品的總重量)與剩下物品最價值重量比(p[i]/w[i])的積:

                                   ub = currentValue + (C-currentWeight)*(p[i]/w[i]);

 當然還有更優的求最佳上界的方法。

    下面,舉一個最簡單的例子來說明

揹包的容量爲10,有4個物品,重量分別爲4,5,7,4。價值分別爲40,42,28,20。按價值/重量排序如下

 

  物品              重量                   價值               價值/重量

    1                  4                        40                10

    2                  7                        42                6

    3                  5                        25                5

    4                  3                        12                4

 

用c,v,w,ub分別表示揹包的容量,當前揹包內物品的價值,當前揹包內物品的總重量,結點的最佳上界,用二叉樹來表示

揹包問題求解過程示例

 

 

代碼如下:

 

 

發佈了33 篇原創文章 · 獲贊 21 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章