2017-04-14 70 views
3

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

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

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

在此先感谢您的帮助!

+0

通常GAMS比Pyomo快(并且在我的模型上通常也比AMPL快,特别是当我们有很多数据操作步骤但我知道AMPL显着更快的模型时)。 –

回答

3

虽然您可以在创建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之间的差距应该更小。

+0

非常感谢您的回答,我一直对Pyomo有这个疑问。但是,你能否进一步澄清下面的部分? >解算器接口都是“平坦”的表示,明确地[ly]表示单个约束。 Pyomo需要显式生成_algebra_(即表达式)的表示以发送给求解器。相反,NumPy只需计算结果:通过依靠低级别BLAS操作在C/C++后端创建数据来有效计算结果,并仅将结果返回至蟒蛇。 –

+0

这与矩阵表示的情况有何不同,还是写出标量形式的联立线性方程组?求解器输入文件当然会有一些矩阵方式来表示大量的约束?或者你是否说因为稀疏而不是这种情况? –

+0

据我所知,标准解算器输入格式不支持“矩阵式”指定约束。对于线性解算器,标准格式是LP(基于行)和MPS(基于列)。两者都明确列出“A”矩阵中的所有非标度。对于一般的非线性,确实没有标准格式。 AMPL的NL格式是最接近的,并且是基于行的。一些凸求解器支持矩阵样式输入,但这些不是一般非线性求解器通常采用的格式。 – jsiirola

4

我也想知道同样的,当我碰到这片由乔纳斯HORSCH和汤姆·布朗的代码,这是非常有用的对我说:

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

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

相关问题