#python #optimization #pyomo
Вопрос:
Я использую модуль PAO в Python для работы с двухуровневыми моделями оптимизации. Пакет ПАО поставляется с интегрированными решателями (https://pao.readthedocs.io/en/latest/solvers.html). Я применил pao.pyomo.FA решение следующей проблемы:
import pyomo.environ as pe
from pao.pyomo import *
M = pe.ConcreteModel()
M.x = pe.Var(bounds=(0, None), domain=pe.Reals)
M.L = SubModel(fixed=M.x)
M.L.y = pe.Var(bounds=(0, 10), domain=pe.Reals) #This is the relevant code line
M.L.ymax = 3
M.xmin = 2
def ul_obj_rule(M):
"""upper-level objective"""
mo = M.model()
return(mo.x mo.L.y)
def ll_obj_rule(M):
mo = M.model()
return(mo.x mo.L.y)
def ul_constraint_rule(M):
mod = M.model()
return(M.x >= mod.xmin)
def ll_constraint_rule(M):
mod = M.model()
return(mod.L.y <= mod.x M.ymax)
M.obj = pe.Objective(rule=ul_obj_rule, sense=pe.minimize)
M.L.obj = pe.Objective(rule=ll_obj_rule, sense=pe.maximize)
M.c1 = pe.Constraint(rule=ul_constraint_rule)
M.L.c1 = pe.Constraint(rule=ll_constraint_rule)
solver = Solver('pao.pyomo.FA')
results = solver.solve(M, tee=True)
Поскольку x-переменная верхнего уровня, а y-переменная нижнего уровня, решение должно быть x=2 и y=5 в соответствии с целями и ограничениями (с целевым значением 7).
Тем не менее, решатель устанавливает y в 1e-4 с объективным значением, близким к 2, поэтому верхний уровень, по-видимому, определяет не только x, но и y. Если я установлю верхнюю границу y на «Нет» в «соответствующей строке кода», будет найдено ожидаемое целевое значение 7. Для верхней границы 1e5 значение y равно 1 (вместо 5).
Запуск того же кода с pao.pyomo.Решатель PCCG или пао.pyomo.РЕДЖ, такого поведения не происходит.
Поскольку моя модель содержит только линейные уравнения, реальные переменные верхнего и нижнего уровней и является двухуровневой задачей, я предполагаю, что все требования для применения пао.pyomo.Решатель FA выполнен. Кто-нибудь знает, почему обнаруживаются описанные (неожиданные) результаты?