Алгоритм двухуровневой оптимизации ==> реализация в Pyomo

#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 , соответственно.