Pyomo Blocks:关于时间相关问题的索引块与非索引块

Posted

技术标签:

【中文标题】Pyomo Blocks:关于时间相关问题的索引块与非索引块【英文标题】:Pyomo Blocks: indexed vs not-indexed blocks on time-dependent problems 【发布时间】:2018-10-31 07:15:59 【问题描述】:

Pyomo 书中针对时间相关问题提出了这种块结构。

有一个 Pyomo 块“电网模型”,每个时间步都重复,表示按时间序列索引。

model.T = range(120)

def electrical_grid_block(grid, t):
    <containing: bus, transmission line, generator>
model.Grid = Block(model.T,rule=electrical_grid_block)

在我想对必须引用过去时间步长的块进行建模之前,这对我来说完全有意义。例如,存储需要上一个时间步的存储级别的值。我想到的唯一解决方案:跳过索引块的想法并将时间序列传递到存储块中,如下所示:

def storage(s):
    s.storage_level = Var(model.T, bounds=(0,300))
    s.power = Var(model.T, bounds=(-2,2))

    # Constraints
    def constr_rule_speicher(s,t):
        if t >= 2:
            return s.storage_level[t] == - s.power[t] * dt + s.storage_level[t-1]
        elif t == 1:
            return s.storage_level[t] == 150.0
    s.storage_constraints = Constraint(model.T, rule=constr_rule_speicher)

model.storage = Block(rule=storage)

我不太喜欢这种解决方案,因为我相信面向对象的问题建模方式会丢失。

我有什么不同的想法吗?

不幸的是,有关 Pyomo 的文档没有提供任何此类案例的示例。

【问题讨论】:

【参考方案1】:

已经很晚了,但我在一些关于 Pyomo 的讲座中找到了一个例子(来自 2018 年 Pyomo 研讨会的材料,但在问题发布之后)。可以在此处找到示例(pdf 中的幻灯片 187):https://software.sandia.gov/downloads/pub/pyomo/Pyomo-Workshop-Summer-2018.pdf。这个想法大致如下:

model.T = range(120)

def electrical_grid_block(grid, t):
    <containing: bus, transmission line, generator>
model.Grid = Block(model.T,rule=electrical_grid_block)

def past_step_rule(m, t):
    if t == m.T.first():
        return Constraint.Skip
    return m.Grid[t].storage_level == m.Grid[t].power*dt - m.Grid[t-1].storage_level
model.past_step = Constraint(model.T, rule=past_step_rule)

简而言之,需要两个(或更多)时间步长的约束是在块之外定义的。

【讨论】:

以上是关于Pyomo Blocks:关于时间相关问题的索引块与非索引块的主要内容,如果未能解决你的问题,请参考以下文章

皮莫 | Couenne 求解器 |将索引变量域限制为两个整数值

GLEW 库和代码::块

块,线程,warpSize

Drupal 7 Blocks不考虑重量

Windows10关于exe的权限

dd相关命令