背包問題個人總結


第一章 一維背包問題

1.1 01背包問題

拆解:

01表示物品的狀態為0或者1,為0表示未放入背包,為1表示放入背包。

背包問題是考慮如何將物品放入背包的問題。

01背包問題的問題描述:有n個商品,他有重量屬性W,價值屬性V。

背包屬性有重量B,如何放置使得價值最大。

可以轉化為如下規划問題:

max V*P

其中P為n個物品的放置狀態,1/0表示放還是不放,*表示向量內積。

其約束條件如下:

W*P<=B

0<=P<=1

注:狀態轉移方程f[i][j]=max(f[i-1][j],f[i-1][j-W[i]]+V[i])

時間復雜度O(NB),空間復雜度O(NM)可優化到O(B)

 

 

1.2 完全背包問題

拆解:

完全表示物品的狀態為0或者k,為0表示未放入背包,為k表示放入k個物品到背包。k沒有數量限制

背包問題是考慮如何將物品放入背包的問題。

轉化成數學模型,唯一不同的就是約束條件有變化。可以轉化為如下規划問題:

max V*P

其中P為n個物品的放置狀態,1/0表示放還是不放,*表示向量內積。

其約束條件如下:

W*P<=B

0<=P

注:這里表面上看P的限制是大於0,但是仔細考慮可以將上界確定。

狀態轉移方程從01背包的

f[i][j]=max(f[i-1][j],f[i-1][j-W[i]]+V[i])

轉化為完全背包

f[i][j]=max(f[i-1][j-k*W[i]]+k*V[i]),窮舉k的可選范圍

 

優化策略1:利用支配關系去除個體

優化策略2:更高效的轉化方法是:把第i種物品拆成費用為w[i]∗2^k,價值是v[i]*2^k,由此轉化為01背包。

 

1.3 多重背包問題

拆解:

多重表示每個物品的個數有確定的數量上限。

背包問題是考慮如何將物品放入背包的問題。

轉化成數學模型,唯一不同的就是約束條件有變化。可以轉化為如下規划問題:

max V*P

其中P為n個物品的放置狀態,1/0表示放還是不放,*表示向量內積。

其約束條件如下:

W*P<=B

0<=P<=C

注:在完全背包的基礎上修改下范圍

f[i][j]=max(f[i-1][j-k*W[i]]+k*V[i]),其中0<=k<=C[i]

1.4 混合背包問題

拆解:

混合表示每個物品的個數可01可完全可多重。

背包問題是考慮如何將物品放入背包的問題。

可以轉化為多重完全背包。

注:在完全背包的基礎上修改下范圍

f[i][j]=max(f[i-1][j-k*W[i]]+k*V[i]),其中0<=k<=C[i]

1.5 總結

以上問題其實都可以用傳統的遺傳算法取求解,有所不同的可能是,求解01背包的時候可以使用01編碼,而求解其他背包問題的時候需要使用整數編碼方案。

第二章 二維背包問題

2.1 二維單目標背包問題

拆解:

二維費用表示每個物品的屬性除去價值屬性以外,它的另外的屬性不僅僅包括重量,比如還包括體積。

單目標指的就是僅僅考慮價值這個單一目標最大化。

背包問題是考慮如何將物品放入背包的問題。

二維背包問題的問題描述:有n個商品,他有重量屬性W,體積屬性T,價值屬性V。

背包屬性有重量B,和體積D,如何放置使得價值最大。

其實也僅僅是多了約束條件。

轉化成數學模型,唯一不同的就是約束條件有變化。可以轉化為如下規划問題:

max V*P

其中P為n個物品的放置狀態,1/0表示放還是不放,*表示向量內積。

其約束條件如下:

W*P<=B

T*P<=D

0<=P

注:轉移方程在01背包的基礎上增加一維

 

 

同理也會有個數限制的情況,同樣改約束條件。

這個問題也可以用傳統的遺傳算法求解。

2.2 二維多目標背包問題

拆解:

二維費用表示每個物品的屬性除去價值屬性以外,它的另外的屬性不僅僅包括重量,比如還包括體積。

多目標指的是在原有目標的基礎上增加新的目標,比如抽象的好看度(假如可量化)。

背包問題是考慮如何將物品放入背包的問題。

二維背包問題的問題描述:有n個商品,他有重量屬性W,體積屬性T,價值屬性V,好看度屬性E。

背包屬性有重量B,和體積D,如何放置使得價值最大。

其實也僅僅是多了約束條件。

轉化成數學模型,不同的是目標也有變化。可以轉化為如下規划問題:

max V*P

max E*P

其中P為n個物品的放置狀態,1/0表示放還是不放,*表示向量內積。

其約束條件如下:

W*P<=B

T*P<=D

0<=P

注:這個問題是在背包問題的基礎上延申的,能不能用動態規划求解一時半會兒不知道。但是這塊兒屬於多目標領域,可以借助多目標領域的諸多優質算法求解,比如NSGA-2、NSGA-3、MOEA/D等等。

第三章 更復雜的背包問題

3.1 分組背包問題

拆解:

分組背包是在考慮物品的放置的時候並不是隨意放置,而是有沖突關系,所謂的沖突關系即某些物品不能同時放在一個組里面。

背包問題是考慮如何將物品放入背包的問題。

問題描述:有N件物品和一個容量為B的背包。第i件物品的大小是w[i] w[i],價值是v[i]。這些物品被划分為若干組,每組中的物品互相沖突,最多選一件。求解將哪些物品裝入背包可使這些物品的費用總和不超過背包容量,且價值總和最大。

轉化成數學模型,同樣是約束條件需要修改。轉化為如下規划問題:

max V*P

其中P為n個物品的放置狀態,1/0表示放還是不放,*表示向量內積。

其約束條件如下:

W*P<=B

0<=sum(P[k])<=1

0<=sum(P[k])<=1表示第k組的所有物品中至多只能選擇一個。

注:分組背包可采用分治的思想處理,將每一組捆綁為一個單個個體,而后從這個單個個體中取一個個體。

 

3.2 有依賴背包問題

拆解:

有依賴是在考慮物品的時候,要考慮到部分物品之間的依賴關系,比如A物品要放置必須把B物品放置。

背包問題是考慮如何將物品放入背包的問題。

注:可以同樣使用捆綁的方式,將有依賴的物品捆綁在一起,這也就變成了一個一維背包問題。

 

參考:

[1] 背包九講——全篇詳細理解與代碼實現 https://blog.csdn.net/yandaoqiusheng/article/details/84782655#t8

[2] 背包問題九講v1.1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM