1. 問題描述
設有n個物體和一個背包,物體i的重量為wi價值為pi ,背包的載荷為M, 若將物體i(1<= i <=n)裝入背包,則有價值為pi . 目標是找到一個方案, 使得能放入背包的物體總價值最高.
設N=3, W=(16,15,15), P=(45,25,25), C=30(背包容量)
2. 隊列式分支限界法
可以通過畫分支限界法狀態空間樹的搜索圖來理解具體思想和流程
每一層按順序對應一個物品放入背包(1)還是不放入背包(0)

步驟:
① 用一個隊列存儲活結點表,初始為空
② A為當前擴展結點,其兒子結點B和C均為可行結點,將其按從左到右順序加入活結點隊列,並舍棄A。
③ 按FIFO原則,下一擴展結點為B,其兒子結點D不可行,舍棄;E可行,加入。舍棄B
④ C為當前擴展結點,兒子結點F、G均為可行結點,加入活結點表,舍棄C
⑤ 擴展結點E的兒子結點J不可行而舍棄;K為可行的葉結點,是問題的一個可行解,價值為45
⑥ 當前活結點隊列的隊首為F, 兒子結點L、M為可行葉結點,價值為50、25
⑦ G為最后一個擴展結點,兒子結點N、O均為可行葉結點,其價值為25和0
⑧ 活結點隊列為空,算法結束,其最優值為50
注:活結點就是不可再進行擴展的節點,也就是兩個兒子還沒有全部生成的節點
3. 優先隊列式分支限界法
3.1 以活結點價值為優先級准則

步驟:
① 用一個極大堆表示活結點表的優先隊列,其優先級定義為活結點所獲得的價值。初始為空。
② 由A開始搜索解空間樹,其兒子結點B、C為可行結點,加入堆中,舍棄A。
③ B獲得價值45,C為0. B為堆中價值最大元素,並成為下一擴展結點。
④ B的兒子結點D是不可行結點,舍棄。E是可行結點,加入到堆中。舍棄B。
⑤ E的價值為45,是堆中最大元素,為當前擴展結點。
⑥ E的兒子J是不可行葉結點,舍棄。K是可行葉結點,為問題的一個可行解價值為45。
⑦ 繼續擴展堆中唯一活結點C,直至存儲活結點的堆為空,算法結束。
⑧ 算法搜索得到最優值為50,最優解為從根結點A到葉結點L的路徑(0,1,1)。
3.2 以限界函數為優先級准則

應用貪心法求得近似解為(1, 0, 0, 0),獲得的價值為40,這可以作為0/1背包問題的下界。
如何求得0/1背包問題的一個合理的上界呢?考慮最好情況,背包中裝入的全部是第1個物品且可以將背包裝滿,則可以得到一個非常簡單的上界的計算方法:
b=W×(v1/w1)=10×10=100。於是,得到了目標函數的界[40, 100]。
所以我們定義限界函數為:
![]()
再來畫狀態空間樹的搜索圖:

步驟:
① 在根結點1,沒有將任何物品裝入背包,因此,背包的重量和獲得的價值均為0,根據限界函數計算結點1的目標函數值為10×10=100;
② 在結點2,將物品1裝入背包,因此,背包的重量為4,獲得的價值為40,目標函數值為40 + (10-4)×6=76,將結點2加入待處理結點表PT中;在結點3,沒有將物品1裝入背包,因此,背包的重量和獲得的價值仍為0,目標函數值為10×6=60,將結點3加入表PT中;
③ 在表PT中選取目標函數值取得極大的結點2優先進行搜索;
④ 在結點4,將物品2裝入背包,因此,背包的重量為11,不滿足約束條件,將結點4丟棄;在結點5,沒有將物品2裝入背包,因此,背包的重量和獲得的價值與結點2相同,目標函數值為40 + (10-4)×5=70,將結點5加入表PT中;
⑤ 在表PT中選取目標函數值取得極大的結點5優先進行搜索;
⑥ 在結點6,將物品3裝入背包,因此,背包的重量為9,獲得的價值為65,目標函數值為65 + (10-9)×4=69,將結點6加入表PT中;在結點7,沒有將物品3裝入背包,因此,背包的重量和獲得的價值與結點5相同,目標函數值為40 + (10-4)×4=64,將結點6加入表PT中;
⑦ 在表PT中選取目標函數值取得極大的結點6優先進行搜索;
⑧ 在結點8,將物品4裝入背包,因此,背包的重量為12,不滿足約束條件,將結點8丟棄;在結點9,沒有將物品4裝入背包,因此,背包的重量和獲得的價值與結點6相同,目標函數值為65;
⑨ 由於結點9是葉子結點,同時結點9的目標函數值是表PT中的極大值,所以,結點9對應的解即是問題的最優解,搜索結束。
總結:
★ 剪枝函數給出每個可行結點相應的子樹可能獲得的最大價值的上界。
★ 如這個上界不會比當前最優值更大,則可以剪去相應的子樹。
★ 也可將上界函數確定的每個結點的上界值作為優先級,以該優先級的非增序抽取當前擴展結點。由此可快速獲得最優解。
