使用 Pyomo Bilevel 解决 maxmin 问题

问题描述

我想使用 Pyomo(双层模块)解决以下简单的 maxmin 问题

enter image description here

我已经使用 KKT 的条件解决了问题,结果是(如预期的)x=y=10

但我想使用 pyomo.bilevel 解决类似的问题

我知道该模块已弃用,但 PAO(指示的模块)仍在开发中。

我尝试了以下代码,但没有成功

from pyomo.environ import *
from pyomo.bilevel import *

M = ConcreteModel()
M.x = Var(bounds=(0,100))
M.s = SubModel(fixed=M.x)
M.s.y = Var(bounds=(0,10))

M.s.o = Objective(expr= M.x,sense=maximize)
M.o = Objective(expr= M.s.o,sense=minimize)
M.s.c1 = Constraint(expr= M.x>=M.s.y)

opt = SolverFactory('gurobi')
opt.solve(M)

M.pprint()

如果我尝试在 M 和 M.s 之间切换 x 和 y,则会出现错误

谢谢。

解决方法

我相信我找到了解决方案

from pyomo.environ import *
from pyomo.bilevel import *

M = ConcreteModel()
M.y = Var(bounds=(0,10))
M.s = SubModel()
M.s.x = Var(bounds=(0,100))

M.s.o = Objective(expr= M.s.x,sense=minimize)
M.o = Objective(expr= M.s.o,sense=maximize)
M.s.c1 = Constraint(expr= M.s.x>=M.y)

opt = SolverFactory('bilevel_blp_global')
opt.options['solver'] = 'gurobi'
result = opt.solve(M)

M.s.x.pprint()
M.y.pprint()

如果您正在寻找 KKT 方法,请检查以下公式: enter image description here