【问题标题】:Pyomo: How to use the final data point in an abstract model's objective?Pyomo:如何在抽象模型的目标中使用最终数据点?
【发布时间】:2016-06-11 00:58:23
【问题描述】:

我有一个 Pyomo 模型,其形式如下:

from pyomo.environ import *
from pyomo.dae import *

m      = AbstractModel()
m.t    = ContinuousSet(bounds=(0,120)) 
m.T    = Param(default=120)
m.S    = Var(m.t, bounds=(0,None))
m.Sdot = DerivativeVar(m.S)
m.obj  = Objective(expr=m.S[120],sense=maximize)

请注意,目标 m.obj 依赖于参数 m.T。尝试运行它会出现错误:

TypeError: unhashable type: 'SimpleParam'

使用一个值,例如expr=m.S[120] 会报错:

ValueError: Error retrieving component S[120]: The component has not been constructed.

在这两种情况下,我的目标是相同的:优化S 的最大可能值。

我怎样才能创建一个表达这一点的抽象模型?

【问题讨论】:

    标签: python optimization pyomo


    【解决方案1】:

    您遇到了两个不同的问题:

    TypeError: unhashable type: 'SimpleParam'
    

    由于 Pyomo 4.3 中的一个错误,您不能直接使用简单的Params 作为其他组件的索引。也就是说,此特定问题的修复不会修复您的示例模型。

    修复Objective 声明的技巧是将Objective 表达式封装在规则中:

    def obj_rule(m):
        return m.S[120]
        # or better yet:
        #   return m.S[m.T]
        # or 
        #   return m.S[m.t.last()]
    m.obj  = Objective(rule=obj_rule,sense=maximize)
    

    问题在于,当您编写抽象模型时,每个组件都只是声明,而不是定义。因此,Var S 被声明为存在,但尚未定义(它是一个没有成员的空壳)。这会导致一个问题,因为 Python(不是 Pyomo)会在调用 Objective 构造函数之前立即尝试将 m.S[120] 解析为特定变量。在抽象模型中使用规则(函数)允许您推迟表达式的解析,直到 Pyomo 实际构建模型实例。 Pyomo 以您在 Abstract 模型中声明它们的相同顺序构造实例组件,因此当它触发 obj_rule 时,之前的组件(STt)都被构造和 @987654333 @ 在 ContinuousSet 的已知点(在本例中为边界)具有有效成员。

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 2022-01-21
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2020-10-03
      • 1970-01-01
      • 2021-12-23
      相关资源
      最近更新 更多