pyomo生成具有大量约束的模型的性能

Dim*_*nos 5 python mathematical-optimization pyomo

我对Pyomo生成具有大量约束和变量(大约10e6)的OR模型的性能感兴趣。我目前正在使用GAMS来启动优化,但是我想使用不同的python功能,因此要使用Pyomo生成模型。

我进行了一些测试,显然当我编写模型时,每次实例化约束时都会调用用于定义约束的python方法。在进一步实施之前,我想知道是否存在一种基于numpy数组数据直接创建约束块的方法?从我的角度来看,对于大型模型,按块构造约束可能更有效。

您认为使用pyomo或其他python建模库可以获得与GAMS或其他AML语言相当的性能吗?

在此先感谢您的帮助 !

jsi*_*ola 6

虽然您可以在创建 Pyomo 约束时使用 NumPy 数据,但目前您无法使用 Pyomo 在单个 NumPy 样式命令中创建约束块。看看它的价值,我不相信你可以在像 AMPL 或 GAMS 这样的语言中。虽然 Pyomo 可能最终支持用户使用矩阵和向量运算定义约束,但该接口不太可能避免生成单独的约束,因为求解器接口(例如,NL、LP、MPS 文件)都是“平面”表示代表个体约束。这是因为 Pyomo 需要显式生成代数(即表达式)的表示以发送给求解器。相比之下,NumPy 只需要计算结果:它通过在 C/C++ 后端(即不在Python 中)创建数据来提高效率,依靠低级 BLAS 操作来有效地计算结果,并且只将结果返回给 Python。

就性能和可扩展性而言,我生成了具有超过 13e6 个变量和 21e6 个约束的原始模型。也就是说,Pyomo 旨在实现灵活性和可扩展性而不是速度。使用 cPython 时,Pyomo 中的运行时可能比 AMPL 慢一个数量级(尽管使用 pypy 可以缩小到 4 或 5 倍以内)。至少在历史上,AMPL 一直比 GAMS 快,所以 Pyomo 和 GAMS 之间的差距应该更小。


Jon*_*oso 6

当我看到 Jonas H\xc3\xb6rsch 和 Tom Brown 的这段代码时,我也有同样的疑问,它对我非常有用:

\n\n

https://github.com/FRESNA/PyPSA/blob/master/pypsa/opt.py

\n\n

它们定义类来定义约束比原始 Pyomo 解析器更有效。我对我拥有的大型模型做了一些测试,它大大缩短了生成时间。

\n