在Gurobi Python中向目标函数添加多个二次项

时间:2019-03-26 16:57:10

标签: python gurobi

我想在Gurobi中建立一个目标函数以最小化x^2 + y^2。我已尽力在下面提供示例:

import gurobipy as gbPy

model = gbPy.Model()

A = [1, 2, 3, 4, 5]
B = [1, 2, 3]
x = model.addVars(5, lb = 0)
y = model.addVars(3, lb = 0)

for i in range(len(x)):
    model.addConstr(x[i] >= A[i])

for i in range(len(y)):
    model.addConstr(y[i] >= B[i])

objExp = gbPy.QuadExpr()

objExp.addTerms(???)
model.setObjective(objExp, gbPy.GRB.MINIMIZE)

但是我不确定如何在objExp.addTerms行中指示所需的表达式。 http://www.gurobi.com/documentation/8.1/refman/py_quadexpr_add.html提供了一个示例:

expr = x * x + 2 * y * y
expr.add(z * z, 3.0)

但是我不知道是在表达式中添加3 * z ^ 2还是z ^ 2 + 3。感谢您对语法的任何帮助!

1 个答案:

答案 0 :(得分:1)

在您的示例中,我假设您要设定目标以最小化x[0]^2 + y[0]^2。如果您需要其他目标,则应该很简单地加以调整。

设置目标有多种方法。

您可以直接在setObjective中定义它:

model.setObjective(x[0] * x[0] + y[0] * y[0])

model.setObjective(x[0] * x[0] + y[0] * y[0], gbPy.GRB.MINIZE) # minimize is the default; so it is optional

这是最简单的方法,除非您的目标表达很长而且很笨拙,否则我建议这样做。

或者您可以先构建表达式。如果您有很多条款,可以提高性能。

# define the quadratic expression object
objExp = gbPy.QuadExpr()

# add single terms using add
objExp.add(x[0] * x[0]) 
objExp.add(y[0] * y[0])
# you could also do this in one line adding x[0]*x[0] + y[0]*y[0]

# or add multiple terms at once using addTerms
#objExp.addTerms([1, 1], [x[0], y[0]], [x[0], y[0]])

# set the objective
model.setObjective(objExp, gbPy.GRB.MINIMIZE)

请注意,在此示例中,带有addaddTerms的部分都相同。您只需要一个。

add方法将表达式添加到第一个参数中,再乘以(可选)第二个参数。您引用的示例首先定义表达式x^2 + y^2,然后添加3z^2