如何在Pyomo中添加标志约束?

2024-04-19 21:55:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图模拟一个带有充电和放电约束的电池调度模型。BESS通过太阳能光伏系统充电。当我当前运行模型时,有一些时间段BESS同时充电和放电。如何添加标志,以便在充电时>;,放电=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)

Tags: 模型modelreturndefrulemarketchargeconstraint
2条回答

约束

x >= 0 or y >= 0

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

x * y = 0   

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

  • 互补求解器。某些解算器直接支持此类约束。数学规划模型中的互补约束称为MPEC(带平衡约束的数学规划)。因此,这些解算器有时称为MPEC解算器
  • 非线性公式。约束x*y=0不是很容易,但是全局解算器应该能够可靠地处理这个问题。但是,这些解算器仅处理相对较小的模型(与局部解算器相比)
  • 离散公式。使用二进制变量或SOS1构造来表示OR条件。如果模型的其余部分是线性的,这一点尤其有用

您可能需要查看pyomo.mpec。有关更多信息,请参见link

如果您想坚持使用(混合整数)线性公式,还可以查找指示符约束,这通常在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的正确值对于保持模型公式的“严密性”非常重要,在您的情况下,您可能会将其直接与BES的额定功率联系起来

相关问题 更多 >