Добавление нескольких квадратичных членов к целевой функции в Gurobi Python - PullRequest
0 голосов
/ 26 марта 2019

Я бы хотел настроить целевую функцию в 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 Ответ

1 голос
/ 27 марта 2019

Я предполагаю, что - в вашем примере - вы хотите установить цель, чтобы минимизировать 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)

Обратите внимание, что в этом примере обе части с add и addTerms делают то же самое.Вам понадобится только один.

Метод add добавляет выражение в первый аргумент, умноженный на (необязательный) второй аргумент.Пример, который вы цитируете, сначала определяет выражение x^2 + y^2, затем добавляет 3z^2.

...