使用 Pyomo Bilevel 解决最大最小问题

Solve maxmin problems using Pyomo Bilevel

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

我已经使用 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()

如果您正在寻找 KKTs 方法,请查看以下公式: