如何解决背包问题的一种变体,其中必须包含一些项目,但不计入目标
我正在尝试解决0/1背包问题的一种变体,其中必须选择n个项目,但只有k个 我的想法是建立两个二进制变量向量x和y-x表示选择了n个项目,y表示将k个项目计入了目标-但是我的问题是确保y是以下项的子集x。 我正在使用python mip库,这是我到目前为止的代码(mip文档中背包示例的稍作修改的版本): 任何帮助都会很棒,谢谢。 编辑:对于以后发现此问题的任何人,只需添加 工作完美。from mip import Model,xsum,maximize,BINARY
values = [10,13,18,31,7,15,8,11,3,9,12,6,11]
weights = [11,20,24,16,17,32,14,19,13]
max_weight = 200
I = range(len(weights))
m = Model("knapsack")
x = [m.add_var(var_type=BINARY) for i in I]
y = [m.add_var(var_type=BINARY) for i in I]
m += xsum(x[i] for i in I) == 15 # n
m += xsum(y[i] for i in I) == 11 # k
m += xsum(weights[i] * x[i] for i in I) <= max_weight
m.objective = maximize(xsum(values[i] * y[i] for i in I))
# `m += xsum(x[i] * y[i] for i in I) == 11` doesn't work
m.optimize()
selected_x = [i for i in I if x[i].x >= 0.99]
selected_y = [i for i in I if y[i].x >= 0.99]
print("selected items: {}".format(selected_x))
print("selected items: {}".format(selected_y))
#Output:
# selected items: [0,1,2,4,19]
# selected items: [1,5,10,19]
for i in I:
m += x[i] >= y[i]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。