如何解决Gurobi 没有最小化目标函数
问题如下:
让 predict = [15,15,17,16,14,22]
是一个数字列表。我想要一个数字序列 x = [x0,x2,x3,....,x9]
使得
|x[0] - predict[0]| + |x[1] - predict[1]| + ...+ |x[9]-predict[9]|
是最小值。约束是 |x[i]-x[i+1]| <= 1 for i = 0 to 9
。我在jupyter notebook上用python3写了一段代码如下:
original = [16,15]
predict = [17,13,24]
varlen = len(original)
import gurobipy as gp
from gurobipy import GRB
model = gp.Model()
I = range(varlen)
x = model.addVars(I,vtype = GRB.INTEGER,name = "x")
y = model.addVars(I,name = "y")
z = model.addVars(I,vtype=GRB.INTEGER,name="z")
#Adding objective function sum of z[i] = sum|y[i]| = sum |x[i]-predict[i]|
model.setobjective(gp.quicksum(z[i] for i in I),GRB.MINIMIZE)
model.addConstrs(z[i] == gp.abs_(y[i]) for i in I)
model.addConstrs(y[i] == (x[i]-predict[i]) for i in I)
#constraint |x[i] - x[i+1]| <= diff
model.addConstrs(x[i]-x[i+1] <= diff for i in range(varlen-1))
model.addConstrs(x[i]-x[i+1] >= -diff for i in range(varlen-1))
model.params.outputflag = 0
model.optimize()
temp = model.x
out = [0]*len(x)
for i in range(len(out)):
out[i] = int(temp[i])
print(out)
print(model.ObjVal)
输出:
[17,18,19,20,21,22,23,24]
36.0
但是 x = original = [16,15]
满足所有约束并给出小于 ObjVal = 17
的 36.0
。
这意味着代码没有最小化给定的目标函数。我无法弄清楚代码有什么问题。我是 gurobi 的初学者,如果你们能提供帮助,那就太好了。 感谢您提供任何解决方案。
解决方法
注意 addVars
方法的签名:
model.addVars(*indexes,lb=0.0,ub=GRB.INFINITY,obj=0.0,vtype=GRB.CONTINUOUS,name="")
即每个变量的默认下限是 0
。因此,我们有 y[i] == x[i] - predict[i] >= 0
,这意味着 x[i]
不允许小于 predict[i]
。
通过删除变量的下限通过
x = model.addVars(I,lb=-1*GRB.INFINITY,vtype = GRB.INTEGER,name = "x")
y = model.addVars(I,name = "y")
z = model.addVars(I,name = "z")
您将获得目标值为 11 的解。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。