第一章 一维背包问题
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