使用额外约束最大化背包

时间:2013-07-01 22:34:49

标签: dynamic dynamic-programming maximize knapsack-problem

旧的和着名的背包问题要求给定容量C和n个项{I_1,I_2,...,I_n}的列表,每个I_j =(weight_j,value_j),在填充时尝试最大化该值背包。

但是如果我们添加

的约束会发生什么

1)选择特定项目的次数必须为0或必须为奇数(例如:只能采用10lb哑铃或1,3,5,......数量)。 2)对于所有j,C = n ^ 2且n <= weight_j <= n ^ 2。

可以使用哪种动态编程实现来处理其他约束?

如何开始,我们将非常感谢一些建议。谢谢!

2 个答案:

答案 0 :(得分:1)

您可以将背包问题的变体表示为整数程序

标准背包问题:

 Maximize sum(j) Value_j x X_j
 subject to
         sum(j) Wt_j x X_j <= C
         X_j is integer

在您的变体中,X_j只能采用不同的值:{0,1,3,5,...}

制定约束以限制X采用奇数值

每当变量可以采用这些类型的限制时,引入0/1变量来处理这些条件。

对于每个项目j,让我们介绍一堆二进制 Y 变量,以及一些新约束。

X_j - 1 Y_j1 - 3 Y_j3 - 5 Y_j5 ... - M Y_jm = 0 

m是Xj可以采用的最大值(奇数)。

为了限制X_j采用其中一个值,我们添加

Y_j0 + Y_j1 + Y_j3 + ... + Y_jm = 1 for each item j
Y_j0, Y_j1, Y_j3 ..., Y_jm are {0,1} (binary)

变量Y_j0允许X_j取值0.

事实C = n^2确保我们可以为每个约束提出合理的上限m

您现在可以使用整数编程解算器解决此修改后的背包。它仍将以“值密度”(每千克值)的降序查找项目,而将限制为奇数值的约束将在某些边界条件下启动。

希望有所帮助。

答案 1 :(得分:0)

背包问题是整数规划问题,其最简单的形式可以通过动态编程来解决。即使看似微小的问题变化也会使其变得更加困难,并且更适合其他方法。最直接的方法是将其放宽到许多线性程序,同时使用分支并通过可行的解决方案开始工作。也可以使用切割平面 - 但人们通常会发现更容易理解和实现分支和绑定。看看http://mat.gsia.cmu.edu/orclass/integer/integer.html(更简单,更易于访问)http://web.mit.edu/15.053/www/AMP-Chapter-09.pdf(更完整)