01揹包問題【回溯法求解】通俗易懂,適合小白

本人此時還是一名研一的小菜雞,剛學會了這個算法的基本概念,來總結一下,誰知道今後的我再看到這篇自己寫的博客的時候會不會笑出來,哈哈哈哈哈哈哈哈,所以嗎,錯了的化大佬們評論指正就好了。

還有系列文章動態規劃法解01揹包問題,分支限界法解01揹包問題哈,需要的化以下是鏈接:

動態規劃法:https://blog.csdn.net/qq_29051107/article/details/103394491

分支限界法:https://blog.csdn.net/qq_29051107/article/details/103395841

 

1揹包問題題幹(題目中所給出的條件和問題)

給定n種物品和一揹包。物品i的體積是Si,其價值爲Vi,揹包的容量爲C。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大? 

 

C=50, S=(15,5,25,27,30),W=(30,12,44,46,50)
 

2回溯法求解

回溯法(探索與回溯法)是一種選優搜索法,又稱爲試探法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術爲回溯法,而滿足回溯條件的某個狀態的點稱爲“回溯點”。

粘一段百度百科的內容作爲概念解釋哈,巴拉巴拉巴拉,喋喋以喋倚喋喋。

核心思路:

1.初始化:目標函數置爲0,將物品按價值體積比的非增順序排序
2.搜索:從根節點出發,儘量沿左孩子結點前進,當不能繼續沿左孩子前進時,把搜索轉到右子樹,得到問題的一部分解。
3.估計:由部分解所能得到的最大價值:如果估計價值高於上界,繼續向下搜索,直到找到可行解保存可行解,並用可行解得到的目標函數的值更新目標函數的上界,向上回溯,尋找其他可行解。若估計值小於目標函數的上界,則丟棄當前的部分解,向上回溯。

接下來解釋一下接下來要出現的幾個變量所代表的意思:

Weav:當前節點的估計價值

Wup:當前的最優值(注意,是當前,可能是最終的最優,也可能不是)

注意算法計算從這裏就開始了!!!

第一步:

令Wup=0,將物體的序號按價值體積比,排序結果是(2, 1, 3, 4, 5)也就是此時的S和W需要按照新的物品順序變一下,如下:

S=(5,15,25,27,30)

W=(12,30,44,46,50)

第二步:

生成節點1、 2、 3、 4、 5,(如下圖所示)

得到部分解(1,1,1,0),

(因爲從節點5開始就不在是左孩子了,所以要在這裏估計一下價值,來確定是否還繼續往下搜索,估計價值時認爲物品可以部分放入的)

估計當前部分解的價值爲:Weva=(12+30+44) +(0) +(50-5-15-25) *(50/30) =94.3,

因爲Weva>Wup

所以繼續向下搜索生成結點6,

得到可行解(1,1,1,0,0),

得到價值爲86,

更新Wup=86
 

第三步:

回溯:沿右孩子回溯到左孩子4(即節點4),生成相應右孩子7(即節點7)(如下圖)

得到部分解(1,1,0,1),

此時 估計價值Weva= ( 12+30) +( 46) +( 50-5-15-27)*( 50/30) = 93 > Wup 

因爲Weva>Wup,

繼續生成結點8, 9,
得到可行解(1,1,0,1,0),

價值爲88,

更新Wup=88

第四步:

回溯到8生成10,得到部分解(1,1,0,0), 估計部分解Weva=92>88

繼續生成結點11,得到可行解(1,1,0,0,1), 更新Wup=92

因爲11是左孩子,生成其對應的右孩子結點12,得到另一個可行解(1,1,0,0,0)

第五步:

回溯,沿結點12向上回溯到結點3生成結點13,

得到部分解(1,0),此時Weva= (12) +(44)+(50-5-25) *(46/27) =90.1<92

向上繼續回溯生成結點14,得到部分解(0),

此時得到的Weva=(0) +(30+44) +(50-15-25)*(46/27) = 91.03<92,

因此,回溯到根結點,算法結束,得到最優解(1, 1, 0, 0, 1),最大價值92

 

 

總結:

回溯法不愧稱爲深度優先算法,總是一條路先摸索完成後,再回過頭去看看有沒有更好的路走。與分支限界法正好相反。本人博客中也有分支限界法的介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章