首页 文章

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

提问于
浏览
4

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

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

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

在此先感谢您的帮助 !

2 回答

  • 3

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

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

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

  • 4

    虽然您可以在创建Pyomo约束时使用NumPy数据,但您目前无法使用Pyomo在单个NumPy样式命令中创建约束块 . F what believe believe believe believe believe believe believe believe believe believe believe believe believe believe believe believe believe believe believe believe believe believe believe believe believe虽然Pyomo可能最终支持使用矩阵和向量操作定义约束的用户,但是该接口不可能避免生成单独的约束,因为求解器接口(例如,NL,LP,MPS文件)都是明确表示个体的表示 . 限制 . 这是因为Pyomo需要明确生成代数的表示(即表达式)以发送给求解器 . 相比之下,NumPy只需计算结果:它通过在C / C后端(即不在Python中)创建数据来获得效率,依靠低级BLAS操作来有效地计算结果,并且只带来结果回到Python .

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

相关问题