【发布时间】:2021-06-04 18:23:31
【问题描述】:
我的问题是关于 PAO 包的,我希望这是问的地方。
我想知道是否可以使用“规则”函数在双层 pao 模型中创建较低级别的目标或约束。
我想创建一个较低级别的目标并尝试了以下操作:
import pyomo.environ as pe
import pyomo.opt as po
from pao.pyomo import *
M = pe.ConcreteModel()
M.S = pe.RangeSet(1, 10)
M.x = pe.Var(M.S, bounds=(0, None))
M.L = SubModel(fixed=M.x)
M.L.y = pe.Var(M.S, bounds=(0, None))
def ul_obj_rule(M):
"""upper-level objective"""
return(sum(M.x[i] + M.L.y[i] for i in M.S))
M.obj = pe.Objective(rule=ul_obj_rule, sense=pe.minimize)
def ll_obj_rule(M):
return(sum(M.L.y[i] for i in M.S))
M.L.obj = pe.Objective(rule=ll_obj_rule, sense=pe.maximize)
这导致了一个错误:
AttributeError: 'SubModel' object has no attribute 'S'
我尝试将与 M.S 相同的 Set 添加到子模型:
import pyomo.environ as pe
import pyomo.opt as po
from pao.pyomo import *
M = pe.ConcreteModel()
M.S = pe.RangeSet(1, 10)
M.x = pe.Var(M.S, bounds=(0, None))
M.L = SubModel(fixed=M.x)
M.L.y = pe.Var(M.S, bounds=(0, None))
M.L.S = pe.RangeSet(1, 10)
def ul_obj_rule(M):
"""upper-level objective"""
return(sum(M.x[i] + M.L.y[i] for i in M.S))
M.obj = pe.Objective(rule=ul_obj_rule, sense=pe.minimize)
def ll_obj_rule(M):
return(sum(M.L.y[i] for i in M.S))
M.L.obj = pe.Objective(rule=ll_obj_rule, sense=pe.maximize)
导致:
AttributeError: 'SubModel' object has no attribute 'L'
创建相同的目标但使用“expr”而不是“rule”可以正常工作:
import pyomo.environ as pe
import pyomo.opt as po
from pao.pyomo import *
M = pe.ConcreteModel()
M.S = pe.RangeSet(1, 10)
M.x = pe.Var(M.S, bounds=(0, None))
M.L = SubModel(fixed=M.x)
M.L.y = pe.Var(M.S, bounds=(0, None))
M.obj = pe.Objective(expr=sum(M.x[i] + M.L.y[i] for i in M.S), sense=pe.minimize)
M.L.obj = pe.Objective(expr=sum(M.L.y[i] for i in M.S), sense=pe.maximize)
我在尝试初始化约束时遇到了同样的问题。有谁知道我是否以及如何在 PAO 中为双层模型设置目标或约束规则而不会遇到所描述的问题?
非常感谢您!
编辑:使用 M.model() 解决了它。该脚本有效:
import pyomo.environ as pe
import pyomo.opt as po
from pao.pyomo import *
M = pe.ConcreteModel()
M.S = pe.RangeSet(1, 10)
M.x = pe.Var(M.S, bounds=(0, None))
M.L = SubModel(fixed=M.x)
M.L.y = pe.Var(M.S, bounds=(0, None))
def ul_obj_rule(M):
"""upper-level objective"""
mo = M.model()
return(sum(mo.x[i] + mo.L.y[i] for i in M.S))
M.obj = pe.Objective(rule=ul_obj_rule, sense=pe.minimize)
def ll_obj_rule(M):
mo = M.model()
return(sum(mo.L.y[i] for i in mo.S))
M.L.obj = pe.Objective(rule=ll_obj_rule, sense=pe.maximize)
【问题讨论】:
标签: pyomo