python - 在 Pyomo 约束中定义循环/周期性边界条件

标签 python optimization constraints pyomo cyclic

我正在尝试定义使用循环条件的 Pyomo 模型的约束。下面是我认为它应该如何工作(来自 GAMS 的循环语法)。

from __future__ import division
from pyomo.environ import *

model = ConcreteModel()

## define sets
model.t                 = Set(initialize = [i for i in range(8760)]) 

## define variables
model.ESS_SOC           = Var(model.t, domain = NonNegativeReals) # battery state of charge
model.ESS_c             = Var(model.t, domain = NonNegativeReals) # battery charging
model.ESS_d             = Var(model.t, domain = NonNegativeReals) # battery discharging

## skip obj for this example

## define constraints
#SOC constraint
model.SOC_const = ConstraintList()
for i in model.t: 
    model.SOC_const.add( model.ESS_SOC[i] == model.ESS_SOC[i--1] + model.ESS_c[i] - model.ESS_d[i] )

但是当我运行上面的示例时,我收到以下错误消息:

KeyError: "Index '8760' is not valid for indexed component 'ESS_SOC'"

我同意给定 model.t 定义的错误,但该错误让我相信它几乎正在做我想要它做的事情,即:

model.ESS_SOC[0] == model.ESS_SOC[8759] + model.ESS_c[0] - model.ESS_d[0]
model.ESS_SOC[1] == model.ESS_SOC[0] + model.ESS_c[1] - model.ESS_d[1]
...
model.ESS_SOC[8759] == model.ESS_SOC[8758] + model.ESS_c[8759] - model.ESS_d[8759] 

有没有办法定义约束,这就是我得到的?

最佳答案

我建议使用索引约束而不是 ConstraintList 来执行此操作:

from __future__ import division
from pyomo.environ import *

model = ConcreteModel()

## define sets
model.t                 = Set(initialize = [i for i in range(8760)], ordered=True) 

## define variables
model.ESS_SOC           = Var(model.t, domain = NonNegativeReals) # battery state of charge
model.ESS_c             = Var(model.t, domain = NonNegativeReals) # battery charging
model.ESS_d             = Var(model.t, domain = NonNegativeReals) # battery discharging

## skip obj for this example

## define constraints
#SOC constraint
def _SOC_const(m, i):
    if i == m.t.first():
        return model.ESS_SOC[i] == model.ESS_SOC[m.t.last()] + model.ESS_c[i] - model.ESS_d[i]
    return model.ESS_SOC[i] == model.ESS_SOC[i-1] + model.ESS_c[i] - model.ESS_d[i]
model.SOC_const = Constraint(model.t, rule=_SOC_const)

请注意,您需要在 Set 上为 first()last() 设置 ordered=True 选项 工作方法。

关于python - 在 Pyomo 约束中定义循环/周期性边界条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59398778/

相关文章:

java - 将 byte[] 字符串转换为其整数值的快速方法

ios - Q :get a view's constrains returns empty array

sql - 只要事务尚未提交,SQL Server 是否允许事务中出现约束违规?

python - 为什么 pandas.groupby.mean 比并行实现快得多

python - 如何更改变量以匹配 pandas 数据类型?

java - 如何在 if else 语句中简化此类重复代码?

python - 优化python编码功能

python - 如何使用 networkx 反转有向图中的箭头?

Python sed 正则表达式匹配

xcode - 向 SpriteNode 添加大小(约束)