旧的和着名的背包问题要求给定容量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。
可以使用哪种动态编程实现来处理其他约束?
如何开始,我们将非常感谢一些建议。谢谢!
答案 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(更完整)