首页 > 解决方案 > 抽象模型中的 Pyomo 约束块

问题描述

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

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


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.xmodelblockabstractpyomo

解决方案


我不是 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(...))而不是列表理解。


推荐阅读