向 Gurobi Python 中的 objective 函数添加多个二次项
Adding multiple quadratic terms to objective function in Gurobi Python
我想在 Gurobi 中设置一个 objective 函数来最小化 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 。非常感谢任何解释语法的帮助!
我假设——在您的示例中——您想要设置 objective 以最小化 x[0]^2 + y[0]^2
。如果您需要不同的objective.
,应该直接调整它
有多种方法可以设置 objective。
可以直接在里面定义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
这是最简单的方法,除非您的 objective 表达式非常长且笨拙,否则我会推荐这种方法。
或者您可以先构建表达式。如果您有很多项,这可以提供性能优势。
# 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)
请注意,在此示例中,带有 add
和 addTerms
的部分执行相同的操作。你只需要一个。
add
方法将第一个参数中的表达式乘以(可选的)第二个参数。您引用的示例首先定义表达式 x^2 + y^2
,然后添加 3z^2
.
我想在 Gurobi 中设置一个 objective 函数来最小化 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 。非常感谢任何解释语法的帮助!
我假设——在您的示例中——您想要设置 objective 以最小化 x[0]^2 + y[0]^2
。如果您需要不同的objective.
有多种方法可以设置 objective。
可以直接在里面定义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
这是最简单的方法,除非您的 objective 表达式非常长且笨拙,否则我会推荐这种方法。
或者您可以先构建表达式。如果您有很多项,这可以提供性能优势。
# 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)
请注意,在此示例中,带有 add
和 addTerms
的部分执行相同的操作。你只需要一个。
add
方法将第一个参数中的表达式乘以(可选的)第二个参数。您引用的示例首先定义表达式 x^2 + y^2
,然后添加 3z^2
.