古罗比并不是在最小化目标函数

2024-07-03 06:29:35 发布

您现在位置:Python中文网/ 问答频道 /正文

问题如下:

predict = [15, 15, 17, 16, 14, 15, 16, 14, 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笔记本上用python3编写了如下代码:


original = [16, 15, 16, 15, 15, 14, 14, 15, 15, 15]
predict = [17, 15, 17, 16, 14, 13, 15, 14, 16, 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, vtype = GRB.INTEGER, 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, 16, 17, 18, 19, 20, 21, 22, 23, 24]

36.0

但是x = original = [16, 15, 16, 15, 15, 14, 14, 15, 15, 15]满足所有约束,并给出小于36.0ObjVal = 17

这意味着代码没有最小化给定的目标函数。我想不出代码出了什么问题。我是古洛比的支持者,如果你们能帮忙,那就太好了。 谢谢你的帮助


Tags: 代码informodellenrangeoutpredict
1条回答
网友
1楼 · 发布于 2024-07-03 06:29:35

注意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, lb=-1*GRB.INFINITY, vtype = GRB.INTEGER, name = "y")
z = model.addVars(I, lb=-1*GRB.INFINITY, vtype = GRB.INTEGER, name = "z")

您将获得目标值为11的解决方案

相关问题 更多 >