问题描述
我正在尝试解决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 (将#修改为@)