【问题标题】:Objective and Constraint rules for SubModels in PAOPAO 中子模型的目标和约束规则
【发布时间】: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


    【解决方案1】:

    这是因为在最后一行调用函数 ll_obj_rule 时传入的“参数”是 M.L(而不是您期望的 M。){并且 M.L(子模型)没有属性 L。 }

    一个简单的解决方法是在 ll_obj_rule 中省略 L:

    def ll_obj_rule(M):
        return(sum(M.y[i] for i in M.S))
    

    在一个无关的注释上,我一直试图在 google colab 上运行 pao 失败,经常遇到这个错误。 “ImportError:无法从 'pyomo.core' 导入名称 'SimpleBlock'。”你以前遇到过这个错误吗?任何帮助将不胜感激

    【讨论】:

    • 谢谢!我需要通过添加代码行M.L.S = pe.RangeSet(1, 10) 将 RangeSet 复制到子模型,但现在它可以工作了。不过,如果通过了 M.L,我怎么能在较低级别的约束中处理上层变量?我还没有遇到你描述的错误信息。
    • 这是一个很好的问题。我怀疑这可能是开发过程中的疏忽。我很想知道您用来成功运行 pao 的依赖项。我的是:(pao 版本:1.0.1)(scipy 版本:1.4.1)(pyomo 版本:6.0.1)(munch 版本:2.5.0)(参数化版本:0.8.1)
    • 我正在为您列出的依赖项使用以下版本:pao - 1.0.1,scipy - 1.6.0,pyomo - 5.7.3,munch - 2.5.0,未安装参数化。
    • 我终于用我遇到的 M.model() 功能解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多