第一章 一維背包問題
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