Я использую 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 или все целые числапеременные в модели?