问题描述
我一直在尝试进入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)