演算法首先根據基於可行結點相應的子樹最大價值上界優先順序
,從堆中選擇乙個節點(根節點)作為當前可擴充套件結點。
檢查當前擴充套件結點的左兒子結點的可行性。
如果左兒子結點是可行結點,則將它加入到子集樹和活結點優先佇列中。
當前擴充套件結點的右兒子結點一定是可行結點,僅當右兒子結點滿足上界函式約束時,才將它加入子集樹和活結點優先佇列。
當擴充套件到葉節點時,演算法結束,葉子節點對應的解即為問題的最優值。
假設有4個物品,其重量分別為(4, 7, 5, 3),價值分別為(40, 42, 25, 12),揹包容量w=10。將給定物品按單位重量價值從大到小排序,結果如下:
物品重量(w)
價值(v)
價值/重量(v/w)14
401027
42635
25543
124上界計算
先裝入物品1,剩餘的揹包容量為6,只能裝入物品2的6/7(即42*(6/7)=36
)。 即上界為40+6*6=76
已第乙個up為例:40+6*(10-4)=76打x的部分因為up值已經小於等於bestp了,所以沒必要繼續遞迴了。
上界函式
0-1揹包問題優先佇列分支限界搜尋演算法template<
class
typew
,class
typep
>
typep knap::
bound
(int i)
// 裝滿揹包
if(i <= n) b += p[i]
/w[i]
* cleft;
return b;
}
up = bound(i + 1); //注意這裡 up != up - obj[i].price而且 up >= up - obj[i].price
if(up >= bestp) //注意這裡必須是大於等於
e = q.top();
q.pop();
cw = e->weight;
cp = e->profit;
up = e->upprofit;
i = e->lev;
}for(int j = n; j > 0; --j)
}void output()
int main()
輸入4 10
40 4
42 7
25 5
12 3
輸出
最優裝入量為 65
裝入的物品為
分支限界法 0 1揹包問題 佇列式
一.分支限界法概述 1 分支限界法就是採用廣度優先的策略,依次搜尋活結點所有的分枝,也就額是所有的相鄰結點。在求最優解時採用乙個限界函式,計算限界函式值,選擇乙個最有利的子節點作為擴充套件結點,使搜尋樹朝著解空間樹上有最優解的分支推進,以便盡快找出乙個最優解。2 常見的兩種分支限界法 先進先出 fi...
0 1揹包問題 分支限界法
0 1揹包問題可描述為 n個物體和乙個揹包。對物體i,其價值為value,重量為weight,揹包的容量為w 如何選取物品裝入揹包,使揹包中所裝入的物品總價值最大?2.1 用到的資料結構 class goods 定義貨物資料型別 class knapsack 揹包 2.2 演算法步驟1 定 空間。x...
分支限界法 0 1揹包問題
分支限界法類似於回溯法,也是在問題的解空間上搜尋問題解的演算法。一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出解空間中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種意義下的最優解...