設有n個物體和一個揹包,物體i的重量爲wi價值爲pi ,揹包的載荷爲M, 若將物體i(1<= i <=n)裝入揹包,則有價值爲pi . 目標是找到一個方案, 使得能放入揹包的物體總價值最高.算法
設N=3, W=(16,15,15), P=(45,25,25), C=30(揹包容量)函數
能夠經過畫分支限界法狀態空間樹的搜索圖來理解具體思想和流程spa
每一層按順序對應一個物品放入揹包(1)仍是不放入揹包(0)blog
步驟:隊列
① 用一個隊列存儲活結點表,初始爲空擴展
② A爲當前擴展結點,其兒子結點B和C均爲可行結點,將其按從左到右順序加入活結點隊列,並捨棄A。搜索
③ 按FIFO原則,下一擴展結點爲B,其兒子結點D不可行,捨棄;E可行,加入。捨棄B方法
④ C爲當前擴展結點,兒子結點F、G均爲可行結點,加入活結點表,捨棄Cim
⑤ 擴展結點E的兒子結點J不可行而捨棄;K爲可行的葉結點,是問題的一個可行解,價值爲45總結
⑥ 當前活結點隊列的隊首爲F, 兒子結點L、M爲可行葉結點,價值爲50、25
⑦ G爲最後一個擴展結點,兒子結點N、O均爲可行葉結點,其價值爲25和0
⑧ 活結點隊列爲空,算法結束,其最優值爲50
注:活結點就是不可再進行擴展的節點,也就是兩個兒子尚未所有生成的節點
步驟:
① 用一個極大堆表示活結點表的優先隊列,其優先級定義爲活結點所得到的價值。初始爲空。
② 由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)。
應用貪心法求得近似解爲(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對應的解便是問題的最優解,搜索結束。
總結:
★ 剪枝函數給出每一個可行結點相應的子樹可能得到的最大價值的上界。
★ 如這個上界不會比當前最優值更大,則能夠剪去相應的子樹。
★ 也可將上界函數肯定的每一個結點的上界值做爲優先級,以該優先級的非增序抽取當前擴展結點。由此可快速得到最優解。