背包问题个人总结

第一章 一维背包问题

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

posted @ 2019-05-30 16:10  suml  阅读(1379)  评论(0编辑  收藏  举报