【发布时间】:2021-05-25 21:55:12
【问题描述】:
问题如下:
让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 notebook上用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.0 的ObjVal = 17。
这意味着代码没有最小化给定的目标函数。我无法弄清楚代码有什么问题。我是gurobi的初学者,如果你们能提供帮助,那就太好了。 感谢您的任何解决方案。
【问题讨论】:
标签: python optimization gurobi operations-research