背包:一个约束,每个项目只能选择一次,具有大量项目

时间:2016-12-30 03:54:24

标签: algorithm optimization knapsack-problem

我正在编写一个采用背包问题形式的算法。我试图在给定最大重量(W)的情况下最大化背包的值(V)。捕获量是每个项目(I)只能选择一次,背包无论重量如何只能容纳10个项目,并且有非常多的项目(500+)。

到目前为止,我的想法是生成一个超重的背包,并递归地向后工作,一次更换一个项目,直到它<=最大重量。这不是产生最佳背包的问题,​​但是,我真的想生成以下100个左右的背包。我想我可以通过继续我的递归过程来做到这一点,但是,我不觉得这是完全准确的,因为可能会错过稍微更优化的背包。

1 个答案:

答案 0 :(得分:0)

此问题可以表示为整数程序。

maximize sum_{i in items} v_i * x_i
subject to
sum_{i in items} x_i <= 10       [u]
sum_{i in items} w_i * x_i <= W  [z]
for all i in items, x_i in {0, 1}  [y_i]

有很多解决方案库可以为您解决此程序;或者,你可以自己做branch and bound。这是双线性程序,可以求解整数程序的目标值的上界,这是分支和绑定所需的。

minimize 10 * u + W * z + sum_{i in items} y_i
subject to
for all i in items, u + w_i * z + y_i >= v_i  [x_i]
u >= 0
z >= 0
for all i in items, y_i >= 0

给定z的值,设置其他变量的问题是y_iv_i - w_i * z分配给九个顶级项目,同时将u指定为第十项最大的价值。应该可以在z中及时搜索O(n log n)