更新到 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)

使用 Pip 安装 Pyomo Trunk

需要试用 Pyomo 下一个版本中的新功能或修复吗?那么你就会想要从 trunk 安装 Pyomo。在大多数情况下,这可以使用 https://software.sandia.gov/trac/pyomo/downloader 提供的 pyomo_install 脚本来完成。这篇帖子将回顾如何使用这个脚本,同时也将介绍另一种使用 pip 命令从 trunk 安装的方法。

使用 pyomo_install

要使用 pyomo_install 脚本从 trunk 安装,必须执行如下的 shell 命令

$ python pyomo_install --trunk --venv pyomo_python

此命令中的 --venv 选项告诉安装脚本在名为 pyomo_python 的目录中创建一个新的 Python 安装。如果安装成功,pyomo_python 目录将包含一个名为 bin 的子目录。在 bin 中将有一个新的 Python 可执行文件以及其他 Pyomo 命令。导入 Pyomo 包的脚本需要使用此目录中的 Python 可执行文件。你可能会觉得最好将此 bin 目录添加到 PATH 环境变量的开头,从而将其设为默认 Python。请注意,安装 trunk 需要在你的命令 shell 中提供 svn 命令 (subversion)。

使用 pip

在某些系统上,包括 Windows,你可能会遇到上述安装方法的问题。使用 pyomo_install 脚本的一个很好的替代方案是使用基于 Python 的包管理器 pip。在较新版本的 Python 中,pip 默认安装。如果你有旧版本的 Python(2.7 及更早版本的一些版本),你必须首先通过下载并执行在 https://pip.pypa.org.cn/en/stable/installing 找到的 get-pip.py 脚本来获取 pip。除了 pip,git 命令也需要在你的命令 shell 中可用。

一旦 pip 和 git 命令可用,Pyomo trunk 的安装过程如下

  1. 使用 pip 从 GitHub 安装 PyUtilib 的 master 分支

    $ pip install git+https://github.com/PyUtilib/pyutilib

  2. 使用 pip 从 GitHub 安装 Pyomo 的 master 分支

    $ pip install git+https://github.com/Pyomo/pyomo

如果将来你需要删除 Pyomo 和 Pyutilib,只需执行命令

$ pip uninstall Pyomo Pyutilib

要更新到新的 Pyomo 版本,请执行命令

$ pip install -U Pyomo

如果你在 Windows 上,Pyomo 安装过程将在系统上安装 Python 的目录内创建一个名为 'Scripts' 的子目录。尽管你的系统 Python 已经能够执行 Pyomo 脚本,但 Scripts 子目录将包含你可能会觉得有用的其他各种 Pyomo 工具(例如 pyomo 命令)。将此目录添加到你的 PATH 将使这些工具在你下次打开命令 shell 时可用。下面的屏幕截图显示了我如何在 Windows 8 上为位于 C:\Python27 的 Python2.7 安装编辑 PATH 环境变量。

(更新:此帖子在 Pyutilib 的 git "pyomo" 开发分支与 Pyutilib 的 git master 分支永久合并后进行了编辑)

(更新:此帖子在 Pyomo 移至 GitHub 后进行了编辑)