创建Pyomo约束的性能

时间:2019-09-09 07:24:48

标签: python pyomo

我正在用pyomo设置一个巨大的能源优化问题。如其他questions中所述,该设置花费了不合理的时间,但是我设法加快了大多数有问题的线路的运行,除了能量流约束。

与所有其他约束相对,该流程包括所有元素的总和。因此,我决定重写流变量的创建方式,以使它们包括所有元素的索引,希望这会改善情况。我的代码现在看起来像这样:

def flows(model, et, t):
return pyo.quicksum(model.in_flow[:, et, t], 
                    linear=True,
                    start=pyo.quicksum(model.out_flow[:, et, t], 
                                       linear=True)
                    ) == 0

model.add_component("flows", 
                    pyo.Constraint(model.energy_type, 
                                   model.t, 
                                   rule=flows)
                   )

但是,这仍然需要我的模型设置时间的65%。

我把它分解成一个嵌套的for循环,只是看谁花时间:

for t in model.t:
    for et in model.energy_type:
        e = model.in_flow[:, et, t]
        f = model.out_flow[:, et, t]
        es = pyo.quicksum(e)
        fs = pyo.quicksum(f)

这大约需要相同的运行时间,并且“全部”花费在最后两行中。链接快速求和并设置线性标志可以进行一些小的改进,但实际上没有任何改进。来自PyPSA的shared code仍使用旧的coopr3表达式生成器,因此不再起作用。我也不知道怎么用。

关于如何改善模型生成性能的任何建议?

1 个答案:

答案 0 :(得分:1)

好吧,事实证明问题出在切片上。

def flows(model, et, t):
    vars = [model.in_flow[obj, et, t] for obj in model.objects_index]
    vars.extend([model.out_flow[obj, et, t] for obj in model.objects_index])
    return pyo.quicksum(vars) == 0

对约束规则的重新约束使我的模型创建速度提高了约60%。我在另外两个地方做了类似的改写。我现在已经从优化前的120s降到了7s。