0

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

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

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

解决问题的方程式(手动)。

使用 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, bounds = (0, 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”中的每个单独数据应用约束,不涉及总和;所有约束都是一对一的约束设置,因此物理能量需求是有意义的。

如何设置这样的约束?

非常感谢

4

1 回答 1

0

你有几件事要解决。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)
于 2021-06-30T14:37:24.903 回答