抽象模型中的Pyomo约束块

问题描述 投票:0回答:1

为了更好地构造我的约束,我想将多个约束汇总到一个块中,这样就不必滚动浏览代表我的约束的一长串独立函数。

我的问题是我正在使用抽象模型,并且不知道如何为尚未初始化的集合定义该块


M.s = pe.Set(dimen=1)

M.chp_minPower = pe.Param(within=pe.Reals,mutable=True)
M.chp_maxPower = pe.Param(within=pe.Reals,mutable=True)
M.chp_posGrad = pe.Param(within=pe.Reals,mutable=True)
M.chp_negGrad = pe.Param(within=pe.Reals,mutable=True)
M.chp_k = pe.Param(within=pe.Reals,mutable=True)
M.chp_c = pe.Param(within=pe.Reals,mutable=True)
M.chp_f1 = pe.Param(within=pe.Reals,mutable=True)
M.chp_f2 = pe.Param(within=pe.Reals,mutable=True)
M.gasCost = pe.Param(within=pe.Reals,mutable=True)

M.chpOn = pe.Var(M.s, within=pe.Binary)
M.chpSwitchON = pe.Var(M.s,within=pe.Binary)
M.chpPel = pe.Var(M.s,within=pe.NonNegativeReals)
M.chpPth = pe.Var(M.s, within=pe.NonNegativeReals)
M.chpQGas = pe.Var(M.s, within=pe.NonNegativeReals)

def chp_block_rule1(nb,i):
    #Constraints
    nb.chpPelMax = pe.Constraint(expr=M.chpPel[i] <= M.chp_maxPower * M.chpOn[i])
    nb.chpPelMin = pe.Constraint(expr=M.chpPel[i] >= M.chp_minPower * M.chpOn[i])
    #b.sellBin = pe.Constraint(expr=b.sell[i]/M.maxSell <= M.sellBin[i]
    nb.chpCogen = pe.Constraint(expr=M.chpPth[i] == M.chp_f1 * M.chpPel[i] + M.chp_f2 * M.chpOn[i])
    nb.chpConsumption = pe.Constraint(expr=M.chpQGas[i] == M.chp_c * M.chpOn[i] + M.chp_k + M.chpPel[i])
M.chp_block = pe.Block(M.s, rule=chp_block_rule1)

ValueError:检索组件chpPel [1]:该组件具有尚未建造。

有人知道如何在抽象模型中使用块吗?

python-3.x model block abstract pyomo
1个回答
0
投票

我不确定100%,但是我想expr会尝试对表达式求值,并且因为chpPel是变量(因此没有值),所以它会中断。

为了延迟对表达式的求值(即,将表达式作为符号传递到求解器中,可以使用rule而不是expr。您可能知道rule具有功能。如果表达式足够短,则可以使用lambda函数。

nb.chpPelMax = pe.Constraint(rule=lambda M: M.chpPel[i] <= M.chp_maxPower * M.chpOn[i])

旁注:您只能使用list(range(...))而不是列表理解。

© www.soinside.com 2019 - 2024. All rights reserved.