更新到 Pyomo 4.x

本文涵盖了 Pyomo 在过去几个发布周期中发生的一些主要变化,以及如何更新使用早于 4.x 版本的 Pyomo 编写的代码。

  • 在 4.0 版本之后,Coopr 已更名为 Pyomo。此更改要求用户更新用于导入 Pyomo 组件的包名。修复导入名称非常简单。只需查找并替换所有出现的 cooprpyomo。也就是说,将 coopr.<sub-package> 重命名为 pyomo.<sub-package>。唯一的例外,也是最常见的导入,是 coopr.pyomo。此包现在位于 pyomo.core 命名空间下。但是,建议导入 pyomo.environ 而不是 pyomo.core ,以确保所有 Pyomo 功能都正确加载。示例

旧 Coopr 代码:

 from coopr.pyomo import *
 from coopr.opt import SolverFactory

Pyomo 4.x 代码:

 from pyomo.environ import *
 from pyomo.opt import SolverFactory
  • Pyomo 子包已合并。此更改不需要对用户代码进行任何更新,但它确实影响了 Pyomo 在您的 Python 站点包目录中的组织方式。如果旧的 Pyomo 或 Coopr 安装在安装最新版本之前没有完全删除,可能会导致一些有趣的错误。如果不确定您的安装有多旧,最好的方法是下载并运行 pyomo_uninstall.py。此脚本将确保所有旧版本和新版本的 Pyomo、Coopr 和 Pyutilib 从您执行它的任何 Python 中完全删除。如果您已经安装了 Pyomo 4.x 版本,更新到新版本就像从命令行执行 pip install -U Pyomo 一样简单。
     
  • 求解器插件上的 solve 方法现在会自动将结果加载到 Pyomo 模型中。这意味着在 Pyomo 脚本中,求解完成后无需使用结果对象调用 load。要恢复旧行为,只需在 solve 调用中添加 load_solutions=False,并使用 solutions.load_from 代替 load 来将解决方案存储在 Pyomo 模型中。示例

旧 Coopr 代码

 results = opt.solve(instance)
 instance.load(results)

Pyomo 4.x 代码

 results = opt.solve(instance, load_solutions=False)
 instance.solutions.load_from(results)
  • 在求解在初始构建后修改的 Pyomo 模型之前,不再需要调用 preprocess 方法。在旧代码中,例如,在添加约束或固定变量后,此方法调用是必要的。如果您的更新代码中看到它,只需删除它。示例

旧 Coopr 代码

 instance.x[1].fix(5.0)
 instance.preprocess()
 results = opt.solve(instance)

Pyomo 4.x 代码

 instance.x[1].fix(5.0)
 results = opt.solve(instance)