拆解:算法
01表示物品的狀態爲0或者1,爲0表示未放入揹包,爲1表示放入揹包。優化
揹包問題是考慮如何將物品放入揹包的問題。編碼
01揹包問題的問題描述:有n個商品,他有重量屬性W,價值屬性V。.net
揹包屬性有重量B,如何放置使得價值最大。blog
能夠轉化爲以下規劃問題:get
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)
拆解:
徹底表示物品的狀態爲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揹包。
拆解:
多重表示每一個物品的個數有肯定的數量上限。
揹包問題是考慮如何將物品放入揹包的問題。
轉化成數學模型,惟一不一樣的就是約束條件有變化。能夠轉化爲以下規劃問題:
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]
拆解:
混合表示每一個物品的個數可01可徹底可多重。
揹包問題是考慮如何將物品放入揹包的問題。
能夠轉化爲多重徹底揹包。
注:在徹底揹包的基礎上修改下範圍
f[i][j]=max(f[i-1][j-k*W[i]]+k*V[i]),其中0<=k<=C[i]
以上問題其實均可以用傳統的遺傳算法取求解,有所不一樣的多是,求解01揹包的時候可使用01編碼,而求解其餘揹包問題的時候須要使用整數編碼方案。
拆解:
二維費用表示每一個物品的屬性除去價值屬性之外,它的另外的屬性不單單包括重量,好比還包括體積。
單目標指的就是僅僅考慮價值這個單一目標最大化。
揹包問題是考慮如何將物品放入揹包的問題。
二維揹包問題的問題描述:有n個商品,他有重量屬性W,體積屬性T,價值屬性V。
揹包屬性有重量B,和體積D,如何放置使得價值最大。
其實也僅僅是多了約束條件。
轉化成數學模型,惟一不一樣的就是約束條件有變化。能夠轉化爲以下規劃問題:
max V*P
其中P爲n個物品的放置狀態,1/0表示放仍是不放,*表示向量內積。
其約束條件以下:
W*P<=B
T*P<=D
0<=P
注:轉移方程在01揹包的基礎上增長一維
同理也會有個數限制的狀況,一樣改約束條件。
這個問題也能夠用傳統的遺傳算法求解。
拆解:
二維費用表示每一個物品的屬性除去價值屬性之外,它的另外的屬性不單單包括重量,好比還包括體積。
多目標指的是在原有目標的基礎上增長新的目標,好比抽象的好看度(假如可量化)。
揹包問題是考慮如何將物品放入揹包的問題。
二維揹包問題的問題描述:有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-二、NSGA-三、MOEA/D等等。
拆解:
分組揹包是在考慮物品的放置的時候並非隨意放置,而是有衝突關係,所謂的衝突關係即某些物品不能同時放在一個組裏面。
揹包問題是考慮如何將物品放入揹包的問題。
問題描述:有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組的全部物品中至多隻能選擇一個。
注:分組揹包可採用分治的思想處理,將每一組捆綁爲一個單個個體,然後從這個單個個體中取一個個體。
拆解:
有依賴是在考慮物品的時候,要考慮到部分物品之間的依賴關係,好比A物品要放置必須把B物品放置。
揹包問題是考慮如何將物品放入揹包的問題。
注:能夠一樣使用捆綁的方式,將有依賴的物品捆綁在一塊兒,這也就變成了一個一維揹包問題。
參考:
[1] 揹包九講——全篇詳細理解與代碼實現 http://www.javashuo.com/article/p-gjjqcyhy-bs.html
[2] 揹包問題九講v1.1