微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Gurobi 没有最小化目标函数

如何解决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 = 1736.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 举报,一经查实,本站将立刻删除。