背包问题我的总结

第一章 一维背包问题

1.1 01背包问题

拆解:算法

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)

 

 

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-二、NSGA-三、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] 背包九讲——全篇详细理解与代码实现 http://www.javashuo.com/article/p-gjjqcyhy-bs.html

[2] 背包问题九讲v1.1

相关文章
相关标签/搜索