【问题标题】:How to add a flag constraint in Pyomo?如何在 Pyomo 中添加标志约束?
【发布时间】:2019-12-12 03:52:20
【问题描述】:

我正在尝试模拟具有充电和放电约束的电池调度模型。 BESS 正在从太阳能光伏系统充电。当我当前运行模型时,BESS 有时会同时充电和放电。如何添加一个标志,使得当 Charge >、Discharge =0 时,反之亦然。

 def market_constraintx0(model, t):

        return (model.Charge[t] <= df.loc[t,'PVGeneration']*stripeff)

    model.market_rulex0 = Constraint(model.T, rule=market_constraintx0)

    def market_constraintx1(model, t):

        return (model.Charge[t] + model.RegDown[t]  <= model.ChargeMax)

    model.market_rulex1 = Constraint(model.T, rule=market_constraintx1)

    def market_constraintx2(model, t):

        return ( model.Discharge[t] + model.RegUp[t]  <= model.DischargeMax)

    model.market_rulex2 = Constraint(model.T, rule=market_constraintx2)


    def charge_soc(model, t):

        return model.RegUp[t] + model.Discharge[t]  <= model.SoC[t] * stripeff     ###Battery discharge and regup capacity is limited by SOC

    model.charge_soc = Constraint(model.T, rule=charge_soc)

    def discharge_soc(model, t):

        return model.RegDown[t] + model.Charge[t] <= (model.SoCmax - model.SoC[t])/stripeff        ### Battery can be charged by the amount of capacity left to charge.

    model.discharge_soc = Constraint(model.T, rule=discharge_soc)

【问题讨论】:

    标签: python optimization pyomo battery


    【解决方案1】:

    约束

    x >= 0 or y >= 0
    

    有时称为互补条件。也可以写成:

    x * y = 0   
    

    (我假设 x 和 y 是非负变量)。有不同的方法可以解决这个问题:

    • 互补求解器。一些求解器直接支持这种约束。数学编程模型中的互补性约束称为 MPEC(具有平衡约束的数学编程)。所以这些求解器有时被称为 MPEC 求解器。
    • 非线性公式。约束 x*y=0 不是很容易,但全局求解器应该能够可靠地处理这个问题。然而,这些求解器只处理相对较小的模型(与本地求解器相比)。
    • 离散公式。使用二元变量或 SOS1 构造制定 OR 条件。如果模型的其余部分是线性的,这尤其有用。

    您可能需要查看 pyomo.mpec。如需更多信息,请参阅link

    【讨论】:

      【解决方案2】:

      如果你想坚持(混合整数)线性公式,你也可以寻找指标约束,一般讨论in this question。 CPLEX 和 Gurobi 等一些求解器似乎具有针对指标约束的特定约束类型,但我不熟悉如何在 Pyomo 中使用它们。

      通常,您可以使用“大 M”公式获得类似的功能。在您的情况下,类似于:

      model.Indicator = Var(model.T, within=Binary)
      model.M = Param(initialize=1000)
      
      def charge_indicator_constraint(model, t):
          return model.M * model.Indicator[t] >= model.Charge[t]
      ...
      
      def discharge_indicator_constraint(model, t):
          return (1 - model.M) * model.Indicator >= model.Discharge[t]
      ...
      
      

      正如我在链接到的问题中所讨论的,选择正确的 model.M 值对于保持模型公式“紧密”很重要,在您的情况下,您可能会将其直接与 BESS 的额定功率联系起来.

      【讨论】:

        猜你喜欢
        • 2021-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-15
        • 2020-07-03
        • 2018-05-29
        • 2018-07-09
        • 1970-01-01
        相关资源
        最近更新 更多