PYOMO 约束 - 对索引变量设置约束

问题描述

我一直在尝试进入python优化,我发现pyomo可能是要走的路;我在学生时期有一些 GUROBI 的经验,但当然这不再可能,所以我必须研究开源选项。

我基本上想执行一个非线性混合整数问题,在该问题中我将最小化某个比率。问题本身是在可再生能源场景中建立电力购买协议 (PPA)。根据发电量,您必须根据 PPA 购买或出售电力。

唯一的起始数据是世代; PPA 是主要的决策变量,但我需要其他变量。如果没有 PPA 值,“buy”、“sell”、“b1”和“b2”是未知的。这些是等式:

Equations that rule the problem (by hand).

使用 pyomo,我试图将问题设置为:

# Dataframe with my Generation information: 

January = Data['Full_Data'][(Data['Full_Data']['Month'] == 1) & (Data['Full_Data']['Year'] == 2011)]
                                                                  
Gen = January['Producible (MWh)']
Time = len(Generacion)
M=100
# Model variables and deFinition: 

m = ConcreteModel()
m.IDX = range(time)
m.PPA = Var(initialize = 2.0,bounds =(1,7))
m.compra = Var(m.IDX,bounds = (0,None))
m.venta = Var(m.IDX,None))
m.b1 = Var(m.IDX,within = Binary)
m.b2 = Var(m.IDX,within = Binary)

然后是约束;只有第一个,因为我已经收到错误

m.b1_rule = Constraint( 
    expr = (((Gen[i] - PPA)/M for i in m.IDX)  <= m.b1[i])
 )

这给了我错误

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-5d5f5584ebca> in <module>
      1 m.b1_rule = Constraint( 
----> 2     expr = (((Generacion[i] - PPA)/M for i in m.IDX)  <= m.b1[i])
      3  )

pyomo\core\expr\numvalue.pyx in pyomo.core.expr.numvalue.NumericValue.__ge__()

pyomo\core\expr\logical_expr.pyx in pyomo.core.expr.logical_expr._generate_relational_expression()

AttributeError: 'generator' object has no attribute 'is_expression_type'

老实说,我不知道这意味着什么。我觉得这应该是一个简单的问题,但我在语法上挣扎。我基本上必须对“Generation”中的每个单独数据应用约束,不涉及总和;所有约束都是一对一的约束设置,因此物理能量需求是合理的。

如何设置这样的约束?

非常感谢

解决方法

您有几件事需要解决。首先,您得到的错误是因为您在 python 试图转换为 generator 的表达式周围有“额外的括号”。因此,第 1 步是删除外括号,但这并不能解决您的问题。

您说过要为索引的“每个”值生成此约束。任何时候您想为“每个”生成约束的副本时,您都需要通过制作约束列表并使用某种循环添加到它来做到这一点,或者使用函数规则组合。 pyomo 文档中有每个示例,本站点上也有很多示例(如果您查看我的一些帖子,我已经发布了大量内容。) >

def my_constr(m,i):
    return m.Gen[i] - m.PPA <= m.b1[i] * M
m.C1 = Constraint(m.IDX,rule=my_constr)