我正在用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表达式生成器,因此不再起作用。我也不知道怎么用。
关于如何改善模型生成性能的任何建议?
答案 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。