如何证明分数背包展示贪婪策略。?

时间:2015-05-10 13:37:53

标签: algorithm knapsack-problem

我如何证明Fractional Knapsack展示贪婪策略,

我几乎可以做到,但我无法在理论上找到一种方法来证明它。?

请帮忙 在此先感谢

2 个答案:

答案 0 :(得分:1)

(原始)分数背包LP

maximize sum_{i=1}^n v_i x_i
subject to
y: sum_{i=1}^n w_i x_i <= W
z_i: x_i <= 1  (for i=1 to n)
x_i >= 0  (for i=1 to n),

其中v_i是项i的值,w_i是权重。双LP是

minimize W y + sum_{i=1}^n z_i
subject to
x_i: w_i y + z_i >= v_i
y >= 0
z_i >= 0  (for i=1 to n).

通过(弱)LP二元性,如果对原始的贪心解决方案具有与对偶的解决方案相同的目标,那么两者都是最优的。假设所有权重都是正数,它们的总和大于W,并且该项目的排序是v_1/w_1 >= v_2/w_2 >= ... >= v_n/w_n。让j成为枢轴项,以便贪婪的原始解决方案

x_1, x_2, ..., x_{j-1} = 1
x_j = (W - sum_{i=1}^{j-1} w_i) / w_j
x_{j+1}, x_{j+2}, ..., x_n = 0.

通过互补的松弛,我们可以猜测,在双重中,我们应该

z_j, z_{j+1}, ..., z_n = 0.

双重中的x_i约束相当于

y + z_i/w_i >= v_i/w_i,

所以我们需要设置

y >= v_j/w_j >= v_{j+1}/w_{j+1} >= ... >= v_n/w_n

为了满足我们归零z_i的约束。在预感中,我们设置了

y = v_j/w_j,

直观地强制分配

z_i = (v_i/w_i - v_j/w_j) w_i  (for i=1 to j-1).

现在,这个论点的唯一部分需要严格:验证这是双重的可行解决方案(繁琐且因此留作练习)并且目标与贪婪的原始解决方案相匹配。目标是

W y + sum_{i=1}^{j-1} z_i =
W (v_j/w_j) + sum_{i=1}^{j-1} (v_i/w_i - v_j/w_j) w_i =
sum_{i=1}^{j-1} (v_i/w_i) w_i + (v_j/w_j) (W - sum_{i=1}^{j-1} w_i) =
sum_{i=1}^{j-1} v_i + ((W - sum_{i=1}^{j-1} w_i) / w_j) v_j,

这确实是最初的目标。

答案 1 :(得分:1)

我们需要证明这个问题有贪婪的选择属性。为此,我们需要证明,在使用X交换某些选项后,任何不包含贪婪选项a的解决方案a都没有得到更糟糕的解决方案。

对于分数背包,这很容易展示:我们采用X的任何元素,比如b。如果w a &gt; = w' b (其中w a a的权重,w' b 是解b)中的权重X,我们可以将b替换为a的尽可能大的一部分。因为a是具有最大值密度的项目(这是我们贪婪的选择),所以这不会使解决方案变得更糟。如果w a &lt; w' b 我们可以取所有a,并使w' b = w' b - w a 。同样,因为a具有最大的值密度,所以这不会使解决方案变得更糟。

就是这样!我们在技术上也需要显示最佳子结构,但这对于这个问题应该是相当简单的。