python - 创建 Pyomo 约束的性能
问题描述
我正在用 pyomo 设置一个很大的能量优化问题。正如其他问题中提到的那样,设置花费了不合理的时间,但是我设法加快了大多数有问题的线路,除了能量流限制。
与所有其他约束相反,该流程包括所有元素的总和。所以我决定重写流变量的创建方式,使它们包含所有元素的索引,希望这会改善这种情况。我的代码现在看起来像这样:
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的共享代码仍然使用旧的 coopr3 表达式生成器,因此它不再工作了。我也无法弄清楚它会如何使用。
关于如何提高模型生成性能的任何建议?
解决方案
好吧,事实证明问题出在切片上。
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 左右。
推荐阅读
- extjs - 如何在 extjs3 中创建动态菜单?
- algorithm - 找到最大分数满足约束的子集
- python - 合并数据框中的行
- android - 无法从 android 应用程序登录 facebook。收到此错误:应用程序的设置不允许一个或多个给定的 url
- makefile - 如何从 Makefile 中的环境变量在 URL 中设置用户名和密码
- docker - 将容器存储在路径中
- javascript - 使用 Cloud Function 在 Firestore 上写入数据突然失败
- c - Apple Hypervisor 在 MacOS Big Sur beta 11.0.1 上完全崩溃
- file - Typo3 Powermail 文件上传 上传前调整文件大小
- c++ - Robocopy - 如果我在它完成之前停止它会产生损坏的文件吗?