【问题标题】:PYOMO Constraints - setting constraints over indexed variablesPYOMO 约束 - 对索引变量设置约束
【发布时间】:2021-09-12 15:43:32
【问题描述】:

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

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

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

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

如何设置这样的约束?

非常感谢

【问题讨论】:

    标签: python optimization constraints pyomo non-linear


    【解决方案1】:

    你有几件事要解决。首先,您得到的错误是因为您在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)
    

    【讨论】:

    • 您好 AirSquid,感谢您的回答!我实际上也在尝试类似的事情,但我感到困惑。当你写“def my_constr(m, i)”然后你传递“Constraint(m.IDX, rule = my_constr)”时,我不知何故觉得这个函数需要什么作为输入,而你给它的却不是马赫;该语法的逻辑如何?我看过,但不是很明白。
    • Okey 我已经尝试过你的函数,现在它引发了以下错误:错误:为索引为 0 的约束 C1 生成表达式时规则失败:TypeError:不支持的操作数类型 -:'float'和“NoneType”错误:从 data=None 构造组件“C1”失败:TypeError:不支持的操作数类型 -:“float”和“NoneType”
    • 你读过关于约束制定的 dox 吗? pyomo.readthedocs.io/en/stable/pyomo_modeling_components/…
    • 您正在创建一个在运行程序时由 pyomo 内部调用的类函数,因此您看不到实际的“调用”。上面的结构是正确的。您的数据或公式有问题,从您发布的内容中无法辨别。也许是Gen[i],您已将其发布为Gen[i]Generacion[i],但在您的模型变量中都没有定义?
    • 不,我有一份文件,但我会读一读。你提到的 Gen 是真的,我昨天检查并补充说,但我一定做错了什么。我在与工作相关的事情之间挤出时间来做这件事;我会尽快更新并发表评论(可能是下周)。感谢您抽出时间回答到目前为止@AirSquid
    猜你喜欢
    • 2018-07-22
    • 1970-01-01
    • 2022-08-15
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2019-02-02
    相关资源
    最近更新 更多