背包问题

背包问题有些类似很多年以前的购物的综艺节目:如何装满购物车使得物品总价值最大,注意到物品除了价值以外,还有体积属性。

背包(判定)问题询问是否能从一堆物体中找一个子集,使得物品的总体积小于某值,总价值大于某值。


实例: 有限集合 U,U, 每个元素 uU,u \in U, 都有相立的长度(体积) S(u)Z+S(u) \in Z^{+} 和价值 V(u)Z+,V(u) \in Z^{+}, 并且有常数 BZ+B \in Z^{+}KZ+K \in Z^{+}

询问: 是否存在子集 UU,U^{\prime} \subseteq U, 满足 uUS(u)B,uUV(u)K\sum_{u \in U} S(u) \leqslant B, \quad \sum_{u \in U} V(u) \geqslant K_{\circ}


该问题可以通过划分问题多项式归约证明为 NPC

NPC 证明

对背包问题的实例施加限制:对任意 uU,u \in U,S(u)=V(u)S(u)=V(u)uUS(u)\sum_{u \in U} S(u) 为偶数, 取 B=K=12uUS(u)B=K=\frac{1}{2} \sum_{u \in U} S(u)

如此限制的实例为划分问题实例。

这里的逻辑有必要重新叙述一遍:对背包问题的实例施加限制后转变为了划分实例,表示的意思是,所有的划分实例都可以看成是背包问题施加了限制后的实例,也即划分实例可以被转换为背包问题实例的一个子集。

近似算法性能比


  1. nn 个元素排序得到 L={(P1,W1),(P2,W2),,(Pn,Wn)},L=\left\{\left(P_{1}, W_{1}\right),\left(P_{2}, W_{2}\right), \cdots,\left(P_{n}, W_{n}\right)\right\}, 满足:

P1W1P2W2PnWn\frac{P_{1}}{W_{1}} \geqslant \frac{P_{2}}{W_{2}} \geqslant \cdots \geqslant \frac{P_{n}}{W_{n}}

  1. 采用贪心算法 GA,GA, 在主次表 LL 中,自标号为 1 的元素到标号为 nn 的 元素,逐个试装入背包,若标号 ii 的元素能装入背包,则取 xi=1,x_{i}=1, 否 则取 xi=0x_{i}=0 。直到不能装入为止,得到一个可行解,其解值为 GA(I)G A(I)
  2. A(I)=max{GA(I),max1inPi}A(I)=\max \left\{G A(I), \max _{1 \leqslant i \leqslant n} P_{i}\right\} 所对应的元素装入背包,得实例 II 的可行解。

背包问题有多项式时间近似算法 A,A, 其绝对性能比 RA<2R_{A}<2

证明:

因为背包问题重量上限为 B,令最优解为 OPT(I)OPT(I),则设正整数 rr,满足 i=1rWiB,i=1r+1Wi>B\sum_{i=1}^{r} W_{i} \leqslant B, \sum_{i=1}^{r+1} W_{i}>B

易得

OPT(I)<i=1r+1Pii=1rPi+max1inPi2A(I)O P T(I)<\sum_{i=1}^{r+1} P_{i} \leqslant \sum_{i=1}^{r} P_{i}+\max _{1 \leqslant i \leqslant n} P_{i} \leqslant 2 A(I)

其中因为 A(I)=max{GA(I),max1inPi}A(I)=\max \left\{G A(I), \max _{1 \leqslant i \leqslant n} P_{i}\right\},所以

i=1rPi+max1inPi2A(I)\sum_{i=1}^{r} P_{i}+\max _{1 \leqslant i \leqslant n} P_{i} \leqslant 2 A(I)

所以

RA(I)=OPT(I)A(I)<2R_{A}(I)=\frac{O P T(I)}{A(I)}<2

RA=inf{RA(I)I为背包问题任意实例}<2R_{A}=\inf \{R_{A}(I) \mid I 为背包问题任意实例 \}<2

背包问题无多项式时间绝对近似算法的证明

暂略