Algorithm 如何证明分数背包具有贪婪策略。?

Algorithm 如何证明分数背包具有贪婪策略。?,algorithm,knapsack-problem,Algorithm,Knapsack Problem,如何证明分数背包具有贪婪策略 我实际上可以做到,但我找不到一种方法从理论上证明它 请帮忙 提前感谢(原始)分数背包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), 通过(弱)LP对偶,如果原始的贪婪解与对偶的解具有相同的目标,则两者都是最优的。假设所有权重均为正,它们的总和大

如何证明分数背包具有贪婪策略

我实际上可以做到,但我找不到一种方法从理论上证明它

请帮忙 提前感谢

(原始)分数背包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),
通过(弱)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,

这确实是首要目标。

我们需要证明这个问题具有贪婪选择性质。要做到这一点,我们需要证明,任何不包含贪婪选择
a
的解决方案
X
在与
a
交换一些选择后,都不会得到更差的解决方案

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


就这样!从技术上讲,我们也需要展示最优子结构,但这对于这个问题来说应该相当简单。

你希望得到什么样的答案?我可以写一个理论上的答案来证明这个问题。这个问题很有趣,但看起来像一个家庭作业!没有任何努力去解决它!
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,