Получить значения двойной переменной из задачи оптимизации с ограничениями SOS2 в pyomo - PullRequest
0 голосов
/ 06 октября 2019

Я использую pyomo и gurobi для решения задач оптимизации с ограничениями SOS2.

Однако, когда gurobi сталкивается с ограничениями SOS2, он обрабатывает проблему как MIP и не возвращает двойных значений. Вот MWE:

import pyomo.environ as pyo

breakpoints = {
    1: [0, 5, 10],
    2: [0, 5, 10],
}

c_values = {
    1: [0, 10, 5],
    2: [1, 10, 4],
}

model = pyo.ConcreteModel()
model.x = pyo.Var([1, 2], domain=pyo.NonNegativeReals, bounds=(0, 10))
model.cost = pyo.Var([1, 2])
model.pcws_cost = pyo.Piecewise([1, 2], model.cost, model.x,
                                pw_pts=breakpoints,
                                f_rule=c_values,
                                pw_constr_type='LB')

model.obj = pyo.Objective(expr=model.cost[1] + model.cost[2])
model.constraint = pyo.Constraint(expr=model.x[1] + model.x[2] >= 12)

model.dual = pyo.Suffix(direction=pyo.Suffix.IMPORT)

instance = model
opt = pyo.SolverFactory('gurobi')
results = opt.solve(instance, tee=True)

# should display all duals, but it will raise a KeyError instead
print("Duals")
for c in instance.component_objects(pyo.Constraint, active=True):
    print("   Constraint", c)
    for index in c:
        print("      ", index, instance.dual[c[index]])

Однако, gurobipy позволяет пользователю исправлять целочисленные переменные в модели , и я смог использовать эту функцию, внеся несколько сомнительных изменений вКод pyomo, который сработал хорошо, и теперь у меня есть значения двойной переменной для задачи с фиксированными ограничениями SOS2:

Duals
   Constraint constraint
       None 2.0
   Constraint pcws_cost[1].SOS2_constraint
       1 -2.0
       2 1.0
       3 0.0
   Constraint pcws_cost[2].SOS2_constraint
       1 1.2
       2 1.0
       3 16.0

Предоставляет ли pyomo надлежащий способ «исправить» ограничения SOS2 или все целые числапеременные в модели?

...