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

时间:2017-04-14 13:59:06

标签: python mathematical-optimization pyomo

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

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

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

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

当我从JonasHörsch和Tom Brown那里看到这段代码时,我也想知道这一点,这对我来说非常有用:

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

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

答案 1 :(得分:3)

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

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