9

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

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

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

在此先感谢您的帮助 !

4

2 回答 2

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 之间的差距应该更小。

于 2017-04-14T22:29:57.597 回答
4

当我遇到 Jonas Hörsch 和 Tom Brown 的这段代码时,我也有同样的疑惑,它对我非常有用:

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

它们定义类以比原始 Pyomo 解析器更有效地定义约束。我对我拥有的大型模型进行了一些测试,它大大减少了生成时间。

于 2017-08-24T12:33:30.923 回答