2017-04-14 69 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解析器做的。我對我有的大型模型做了一些測試,大大縮短了生成時間。

相關問題