【问题标题】:Pyomo creating a variable time indexPyomo 创建可变时间索引
【发布时间】:2020-09-26 14:57:38
【问题描述】:

我正在尝试在我的 pyomo 模型中引入这个约束 [1

我定义了一个随时间变化的索引集,我想优化下面的相应能量变量

model.grid_time = Set(initialize=range(0, 23)))
model.charging_energy = Var(model.grid_time, initialize=0)

我的约束定义如下:

model.limits = ConstraintList()
for t in model.grid_time:
    model.limits.add(sum(model.charging_energy[t] for t in model.grid >= energy_demand.at[t,"total_energy_demand"])

这些代码行的问题在于,我正在对整个索引集 model.grid_time 进行求和,而不仅仅是 t。我想我需要第二个变量索引集(替换for t in model.grid),但是在如何创建变量索引集之后我搜索不成功..

如果有任何帮助或评论,我将不胜感激!

【问题讨论】:

  • 总和在数学上是荒谬的。你不能将tt=0 加到t=t (????)。
  • 同意。所写的约束没有意义。
  • 你说得对,正确的公式是:∑_(????=0)^????▒????_????^????ℎ ≥? ???_(????,??????)^????????????

标签: python variables optimization indexing pyomo


【解决方案1】:

这样的东西有用吗?

def Sum_rule(model, v, t):
    return sum(model.Ech[t2] for t2 in model.grid_time if t2 <= t) <= model.Edem[v,t]

model.Sum_constraint = Constraint(model.grid_time, model.V, rule=Sum_rule)

基本上,发生的事情是Sum_rule(model, v, t) 中的t 确保为model.grid_times 中的每个t 调用约束。总和中的t2 也是model.grid_times 的一部分,但它只会采用小于调用约束的t 的值。

我不确定我的约束是否与您的符号完全匹配,因为您没有提供所需的所有信息(例如,关于 E^dem 变量的下标 v,但它基本上会用总和做您想要的.

【讨论】:

  • 是的,它有效!万分感谢!!!在您回答之前,我已经找到了一个使用第二个索引通过时间步长列表的解决方案,但您的解决方案更有效,风格更好。最后它不是很复杂,但我没有考虑过 if-extension..
  • 在很多情况下,解决 Python/Pyomo 问题的方法不止一种,所以我很高兴您发现我的回答很有帮助。
猜你喜欢
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
相关资源
最近更新 更多