【问题标题】:Variation on 0/1 Knapsack Algorithm0/1 背包算法的变体
【发布时间】:2016-06-16 19:45:22
【问题描述】:

我对编程很陌生,我被要求解决一个工作程序。现在我们正在处理一个典型的 0/1 背包问题,其中在给定质量和体积约束的情况下,收益/价值最大化。

我的任务是基本上扭转这种情况,并在给定值约束的情况下最小化体积或质量。换句话说,我希望我的收益分数大于或等于一个设定值,然后看看在给定阈值的情况下我能得到多小的背包。

我已尝试在其他地方研究此问题,并确定它可能有一个正式名称,但我无法找到它。如果有人有任何信息,我将不胜感激。我对如何解决这种类型的算法有点茫然,因为你不能使用相同的递归公式。

【问题讨论】:

  • 您在寻找名称或解决方法吗? (程序/算法)?
  • 两者都有!任何一个!非常感谢您提供的任何和所有信息
  • 值约束是等式约束,还是大于(或等于)约束?
  • 大于等于约束
  • 最后一个问题:权重/值是整数还是浮点数?

标签: algorithm matlab logic dynamic-programming knapsack-problem


【解决方案1】:

我们称项目 i 的重量为 w(i),其价值为 v(i)。任意排序物品,并将 f(i, j) 定义为一个背包的最小可能容量,该背包可容纳前 i 个物品的子集,总价值至少为 j。

要计算f(i, j),我们可以把第i个物品放在背包里,也可以不放在背包里,所以

f(i>0, j>0) = min(g(i, j), h(i, j))      # Can include or exclude ith item; pick the best
f(_, 0) = 0                              # Don't need any capacity to reach value of 0
f(i<=0, j>0) = infinity                  # Can't get a positive value with <= 0 items

g(i, j) = f(i-1, j)                      # Capacity needed if we exclude ith item
h(i, j) = f(i-1, max(0, j-v(i))) + w(i)  # Capacity needed if we include ith item

在最后一行中,max(0, j-v(i)) 只是确保在 v(i) &gt; j 的情况下递归调用 f() 的第二个参数不会变为负数。

记住这给出了一个伪多项式 O(nc)-时间、O(nc)-空间算法,其中 n 是项目数,c 是值阈值。您可以通过以自下而上的方式计算空间(可能还有时间,尽管不是渐近意义上的)——这会将空间复杂度降低到 O(c),因为在计算 f(i, ...) 时,您只需要访问到f(i-1, ...),所以你只需要保留DP矩阵的前一个和当前“行”。

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您希望解决的问题在表格中:

    let mass_i be the mass of item i, let vol_i the volume, and let val_i be its value.
    Let x_i be a binary variable, where x_i is one if and only if the item is in the knapsack.
    
    minimize (mass_1 * x_1 + ... + mass_n * x_n) //The case where you are minimizing mass
    s.t.  mass_1 * x_1 + ... + mass_n * x_n >= MinMass
          vol_1 * x_1 + ... + vol_n * x_n   >= MinVolume
          val_1 * x_1 + ... + val_n * x_n   >= MinValue
          x_i in {0,1} for all i
    

    一个你可以用来让它更“背包”的技巧是用1-y_i代替x_i,其中y_i是1,当且仅当项目i是不是 em> 在背包里。然后你会在表单上遇到一个等价的问题:

    let mass_i be the mass of item i, let vol_i the volume, and let val_i be its value.
    Let y_i be a binary variable, where y_i is one if and only if the item is NOT in the knapsack.
    
    maximize mass_1 * y_1 + ... + mass_n * y_n) //The case where you are minimizing mass
    s.t.  mass_1 * y_1 - ... + mass_n * y_n <= mass_1 + ... + mass_n - MinMass
           vol_1 * y_1 - ... +  vol_n * y_n <= vol_1 + ... + vol_n - MinVolume
           val_1 * y_1 - ... +  val_n * y_n <= val_1 + ... + val_n - MinValue
          y_i in {0,1} for all i
    

    这是一个有 3 个约束的背包问题。通过设置x_i = 1 - y_i,解决方案 y 可以很容易地转换为原始问题的等效解决方案。

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 2014-01-06
      • 1970-01-01
      相关资源
      最近更新 更多