我正在编写一个采用背包问题形式的算法。我试图在给定最大重量(W)的情况下最大化背包的值(V)。捕获量是每个项目(I)只能选择一次,背包无论重量如何只能容纳10个项目,并且有非常多的项目(500+)。
到目前为止,我的想法是生成一个超重的背包,并递归地向后工作,一次更换一个项目,直到它<=最大重量。这不是产生最佳背包的问题,但是,我真的想生成以下100个左右的背包。我想我可以通过继续我的递归过程来做到这一点,但是,我不觉得这是完全准确的,因为可能会错过稍微更优化的背包。
答案 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_i
将v_i - w_i * z
分配给九个顶级项目,同时将u
指定为第十项最大的价值。应该可以在z
中及时搜索O(n log n)
。