python-3.x - 抽象模型中的 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] 时出错:组件尚未构造。
有人知道如何使用抽象模型中的块吗?
解决方案
我不是 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(...))
而不是列表理解。
推荐阅读
- python - 特定单词必须在两个子字符串 regex python 之间的某个位置
- html - 你怎么做
- sql - 每个 ID 和类别的类别进入和退出日期
- react-native - 如何显示带有扫描二维码信息的模式?
- openstack - 配置管理帐户
- java - java的异常Java main ArrayList错误
- node.js - 如何在 Node.js 中将 Open XML 转换为 Excel
- python - How can I remove the number-free strings in a python list and convert it to a list of integers only?
- elasticsearch - Error when I trying to start Elasticsearch
- python - 为什么不能添加多个自定义按钮?