#python #pyomo
Вопрос:
Я пытаюсь реализовать двухуровневую модель для pyomo. В частности, когда я получаю результаты с верхнего уровня, я хочу, чтобы модель нижнего уровня наследовала значения из решения переменных верхнего уровня. И я хочу реализовать цикл for между моделями, чтобы повторять их до тех пор, пока их целевые функции не сойдутся.
Как модели верхнего, так и нижнего уровня являются MILP и будут решаться с помощью CPLEX.
Мой вопрос в том, как модель нижнего уровня может наследовать значения верхнего уровня в качестве параметров. Это моя реализация, но она неверна. Как я могу это сформулировать?
Модель верхнего уровня
up = AbstractModel()
up.c = Set()
up.h = Set()
up.p = Set()
up.t = RangeSet(50)
up.INH = Var(up.p, up.h, up.t, within=NonNegativeIntegers)
Модель более низкого уровня
lp = AbstractModel()
lp.c = Set()
lp.h = Set()
lp.p = Set()
lp.t = RangeSet(50)
lp.INH2 = Param(lp.p, lp.h, lp.t, default=instance.INH)
Ответ №1:
У Pyomo раньше была двухуровневая структура для моделирования двухуровневых проблем, но с тех пор pyomo 6.0.1
, как она была перенесена в ПАО
В среде ПАО вы можете создать полный блок, в котором будет задача оптимизации верхнего и нижнего уровней. Верхний уровень моделируется как обычно, в то время как нижний уровень использует pao.SubModel()
класс. Этот класс подмодели все еще должен находиться внутри модели верхнего уровня, и вам нужно исправить переменные верхнего уровня, используя аргумент fix= x
в классе SubModel
PAO
import pyomo.environ as pe
from pao.pyomo import *
#Create a model object
M = pe.ConcreteModel()
#Define decision variables
M.x = pe.Var(bounds=(0,None))
M.y = pe.Var(bounds=(0,None))
#using submodel to modeling lower lovel problem
#Fixing x and not fixing y indicate that x is a upper-var and y is a lower-var
M.L = SubModel(fixed=M.x)
...
with Solver('pao.pyomo.FA') as solver:
results = solver.solve(M)
Теперь вы можете добавлять цели и ограничения на верхнем и нижнем уровнях , используя M
и M.L
, соответственно.