【问题标题】:Variable definition as constraint in pyomo变量定义为 pyomo 中的约束
【发布时间】:2022-11-27 09:10:28
【问题描述】:

这个问题与我之前的问题found here有关。我已经设法解决了这个问题(非常感谢@AirSquid!)我的目标函数是这样的:

所以 avgPrice_n 变量的索引是n.然而,它实际上被定义为

这意味着它被索引n一世.

所以目前我的目标函数非常混乱,因为我有三个总和。它看起来像(我扩展了目标函数中的括号并分别添加了每个组件,所以 avgPrice_n*demand_n 看起来像):

expr += sum(sum(sum((1/12)*model.c[i]*model.allocation[i,n] for i in model.MP[t]) for t in model.M)*model.demand_n[n] for n in model.N)

虽然这可行,但调试非常困难,因为条款很长。因此,我没有使用 avgPrice_n 的实际定义,而是想知道是否可以创建一个 avgPrice_n 变量,在目标函数中使用它,然后在我定义 avgPrice_n 的地方创建一个约束,如上所示。

我遇到的问题是我创建了我的决策变量 x_{i,n} 作为变量,但显然我无法创建 avgPrice_n 作为变量,我通过 x_{i,n} 对其进行索引,因为这导致TypeError: Cannot apply a Set operator to an indexed Var component (allocation) 错误。

所以到目前为止,我的决策变量看起来像:

model.x = Var(model.NP_flat, domain = NonNegativeReals)

我试图创造:

model.avg_Price = Var(model.x, domain = NonNegativeReals)

从而导致上述错误。任何想法或建议将不胜感激!

【问题讨论】:

    标签: python optimization pyomo


    【解决方案1】:

    你有几个选择。意识到你没有需要model.avg_price 变量,因为您可以从其他变量构造它,并且您必须做出一些约束来约束值等,并污染您的模型。

    模型中的基本构建块是 pyomo 表达式,因此您可以放入一个小的“辅助函数”来构建表达式(显示的 cost 函数,它依赖于 n),它没有在模型中定义,但是只是弹出一个表达式......完全合法)。您还可以将大型表达式“分解”为更小的表达式(例如下面的 other_stuff),然后将它们拼凑到目标中(或需要的地方),这让您有机会独立评估它们。我已经制作了几个模型,其目标函数具有“成本”组件和“惩罚”组件,方法是将其分为 2 个表达式……然后在解决后,您可以独立检查它们。

    我的建议(如果您不喜欢当前模型中的三重和)是制作一个 avg_cost(n) 函数来构建类似于下面无意义函数中所做的表达式,并将其用作新变量的替代品.

    注意:这里对变量的初始化一般是不需要的。我只是这样做来“模拟解决”,否则他们将无...

    代码:

    import pyomo.environ as pyo
    
    m = pyo.ConcreteModel()
    
    m.N = pyo.Set(initialize=[0,1,2])
    
    m.x = pyo.Var(m.N, initialize = 2.0)
    
    def cost(n):
        return m.x[n] + 2*m.x[n+1]
    
    m.other_stuff = 3 * m.x[1] + 4 * m.x[2]
    
    m.costs = sum(cost(n) for n in {0,1})
    
    m.obj_expr = m.costs + m.other_stuff
    
    m.obj = pyo.Objective(expr= m.obj_expr)
    
    
    # inspect cost at a particular value of n...
    print(cost(1))
    print(pyo.value(cost(1)))
    
    # inspect the pyomo expressions "other_stuff" and total costs...
    print(m.other_stuff)
    print(pyo.value(m.other_stuff))
    print(m.costs)
    print(pyo.value(m.costs))
    
    # inspect the objective...  which can be accessed by pprint() and display()
    m.obj.pprint()
    m.obj.display()
    

    输出:

    x[1] + 2*x[2]
    6.0
    3*x[1] + 4*x[2]
    14.0
    12.0
    obj : Size=1, Index=None, Active=True
        Key  : Active : Sense    : Expression
        None :   True : minimize : x[0] + 2*x[1] + x[1] + 2*x[2] + 3*x[1] + 4*x[2]
    obj : Size=1, Index=None, Active=True
        Key  : Active : Value
        None :   True :  26.0
    

    【讨论】:

      猜你喜欢
      • 2021-09-12
      • 2018-07-09
      • 2019-02-02
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 2017-12-31
      • 2021-06-28
      相关资源
      最近更新 更多