一个内置求解器 (glpk) 的 Docker 镜像

docker hub 上有一个包含 Pyomo 和 glpk 的公共镜像。要使用它,请安装 docker,运行 docker,然后使用如下命令

docker pull dlwoodruff/pyomoglpk

获取镜像。一旦有了镜像,您可能希望使用如下命令挂载本地文件系统运行它

docker run -i -t -v /home/woodruff:/home/woodruff pyomoglpk /bin/bash

根据您的环境,您可能需要在 docker 命令前使用 sudo,或者您可能需要在 Windows 机器上做一些工作来使挂载可用。Docker 有很好的文档,因此您可以获得更多关于如何执行这些操作的详细信息。Docker 的主要优点是,您可以将 Pyomo 模型分发给拥有 docker 但不想或不能安装 Python、Pyomo 和 glpk 的人。我知道这样的人数很少。

 

更新到 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 后进行了编辑)

Pyomo-fest 亚琛,德国

邀请Pyomo用户和潜在用户参加Pyomo研讨会。我们可能会稍作调整日程以适应参会者,但目前的计划如下:
3月16日,星期三:面向新用户的教程和面向高级用户的新功能回顾
3月17日,星期四:用户演讲和高级主题
3月18日,星期五:合作与高级主题

研讨会将在亚琛工业大学(RWTH Aachen)举行
Aixtron A
底层,Se1房间
Kackerstraße 15, 亚琛, 德国

如果您计划参加,请发送电子邮件至DLWoodruff@UCDavis.edu

组织者
Alexander Mitsos;亚琛工业大学;alexander.mitsos@avt.rwth-aachen.de
Bill Hart;桑迪亚国家实验室;wehart@sandia.gov
Carl Laird;普渡大学;lairdc@purdue.edu
John Siirola;桑迪亚国家实验室;jdsiiro@sandia.gov
Jean-Paul Watson:桑迪亚国家实验室;jwatson@sandia.gov
David Woodruff;加州大学戴维斯分校;dlwoodruff@ucdavis.edu

检查 GLPK 安装

要将求解器 glpk 与 Pyomo 一起使用,必须安装它,以便可以从任何目录在命令行上给出命令 glpsol --help。这在 Unix 机器上很容易做到,但在 Windows 上有点棘手。在此视频中,我们向您展示了如果您的机器上安装了 glpk,但尚未完全安装,它会是什么样子。该视频没有向您展示如何完全安装它。这实际上不是一个 Pyomo 问题,并且有不止一种方法,但您可以在 Google 上搜索。这是一个视频链接
 http://dlwoodruff.ucdavis.edu/badGLPK.mp4

发布 Pyomo 4.1

我们很高兴地宣布发布 Pyomo 4.1 (4.1.10519)。Pyomo 是一组 Python 软件包,支持各种优化功能,用于公式化和分析优化模型。

此版本的亮点如下

- 建模
   * 模型转换的 API 更改
   * SOSConstraint、Suffix 和 Block 组件的修订 API
   * 优化结果现在加载到模型中
   * 删除模型预处理的显式规范

- 求解器
   * 解决了编写和求解 MPEC 的许多问题
   * MPEC 元求解器名称的更改
   * runph 的解决方案输出已更改为

- 其他
   * Pyomo 子命令现在可以使用配置文件(例如 pyomo solve config.json)
   * 新的 JSON/YAML 参数数据格式
   * 添加了一个脚本来安装 pyomo.extras

有关安装选项和 Pyomo 入门文档,请参阅 https://pyomo.cn

享受!

关于 Pyomo

Pyomo 主页为 Pyomo 用户提供了资源

Pyomo 开发由 Sandia 国家实验室和 COIN-OR 托管

请参阅 Pyomo 论坛进行 Pyomo 的在线讨论

 

Windows 安装视频说明

我制作了一个包含 Pyomo 在 Windows 上安装说明的视频。视频太长,但如果您遇到困难可能会有所帮助。具体行为取决于您的浏览器及其配置。请注意,当我点击 get-pip.py 时,程序会进入浏览器选项卡,而不是下载到下载目录,所以我只是将文件保存到下载目录。也许您的浏览器行为会不同。最终目标是下载并运行 get-pip.py,然后下载并运行 get-pyomo.py。我更喜欢从命令提示符运行它们。这是视频的 URL:http://dlwoodruff.ucdavis.edu/PyomoWindows.mp4

在 Ubuntu 上的 Python 3.4 下使用 Trunk

这仅适用于 Ubuntu(可能也包括 Debian)上 Pyomo 的 trunk 用户。如果您不知道为什么需要 trunk,那么您可能不需要它,并且可以完全忽略此帖子。

以下是我在2015年3月,Ubuntu 14.04 上使用 python3.4 安装 pyomo trunk 的步骤;

注意事项

0. 如果您想要 python2.7,请勿使用这些步骤。

1. 没有理由认为这些步骤会与 Mac 上的步骤相似

2. 我已经厌倦了这项工作,所以我没有进行实验来找出哪些步骤可以省略或简化

3. 显然,如果您已经将 numpy 等安装到 3.4 中,或者您不需要 numpy 等,则可以跳过这些步骤

4. 可能有打字错误(我没有粘贴这些)

sudo rm -r /usr/bin/python

sudo ln -s /usr/bin/python3.4 /usr/bin/python

sudo apt-get install python3-numpy

sudo apt-get install python3-scipy

sudo apt-get install python3-matplotlib

sudo apt-get install python3-pip

==== (如果需要,您稍后可以获取 xlrd)

=== 编辑 pyomo_install 以注释掉两行并添加一行

    ### install_pip(upgrade=options.zipfile is None, user=False, quiet=not options.verbose)

    ### pip = find_pip(pyomo_install_tempdir)

    pip = "pip"

python pyomo_install –trunk --venv=pyomo

sudo rm -r /usr/bin/python

sudo ln -s /usr/bin/python2.7 /usr/bin/python

=== 确保您的 .bashrc 文件将 pyomo/bin 放在路径的非常靠前的位置

=== 打开一个新终端

发布 Pyomo 4.0.9682

我们很高兴地宣布发布 Pyomo 4.0 (4.0.9682)。Pyomo 是一组 Python 软件包,支持各种优化功能,用于公式化和分析优化模型。

此版本是 Pyomo 4.0.9638 的补丁版本。以下是此版本的亮点

- 建模
   * 添加了 ComplementarityList 组件

- 求解器
   * PySP 测试基线更新

- 其他
   * 修复了结果对象腌制错误
   * 修复了有序集的性能问题
   * 解决了禁用 pyodbc 支持的错误。
   * 添加了对 pypyodbc 的初步支持。
   * 修复了允许使用元组初始化集合的问题
   * 重新启用了“import”和“export”Pyomo 数据命令,这些命令
     仍然已弃用。
   * 各种性能增强,以避免迭代列表
     字典键。

有关安装选项和 Pyomo 入门文档,请参阅 https://pyomo.cn。

享受!

 - Pyomo 开发团队
 - pyomo-developers@googlecode.com
 - https://pyomo.cn


-----------
关于 Pyomo
-----------

Pyomo 主页为 Pyomo 用户提供了资源

 * https://pyomo.cn

Pyomo 开发由 Sandia 国家实验室和 COIN-OR 托管

 * https://software.sandia.gov/pyomo
 * https://projects.coin-or.org/Pyomo

请参阅 Pyomo 论坛进行 Pyomo 的在线讨论

 * http://groups.google.com/group/pyomo-forum/

 

访问求解器状态和终止条件

Pyomo 旨在为用户提供高级脚本编写功能,以便使用现成的求解器快速轻松地编写元算法。编写这些脚本的用户通常需要根据从求解器获得的状态或终止条件做出决策。为此,Pyomo 提供了一组标准化的对象,无论使用何种求解器,都可以用于查询求解器信息。以下代码片段提供了一个典型场景,其中 SolverStatusTerminationCondition 对象可能有用。


from pyomo.opt import SolverStatus, TerminationCondition

…

results = opt.solve(instance) # Solving a model instance  
instance.load(results) # Loading solution into results object

if (results.solver.status == SolverStatus.ok) and (results.solver.termination_condition == TerminationCondition.optimal):
    # Do something when the solution in optimal and feasible
elif (results.solver.termination_condition == TerminationCondition.infeasible):
    # Do something when model in infeasible
else:
    # Something else is wrong
    print “Solver Status: ”,  result.solver.status


下表提供了所有可用求解器状态和终止条件的完整列表。

求解器状态
ok 正常终止
warning 以异常条件终止
error 内部错误终止
aborted 因外部条件(例如中断)终止
unknown 未知(未初始化的值)
终止条件
maxTimeLimit 超出允许的最大时间限制
maxIterations 超出允许的最大迭代次数
minFunctionValue 找到小于指定函数值的解
minStepLength 步长小于指定限制
globallyOptimal 找到全局最优解
locallyOptimal 找到局部最优解
optimal 找到最优解
maxEvaluations 超出最大问题评估次数(例如,分支定界节点)
other 其他,未分类的正常终止
unbounded 证明问题无界
infeasible 证明问题不可行
invalidProblem 问题设置或特性对求解器无效
solverFailure 求解器未能正确终止
internalSolverError 内部求解器错误
error 其他错误
userInterrupt 用户生成的中断信号
resourceInterrupt 求解器使用的资源中的中断信号
licensingProblem 访问求解器许可时出现问题

发布 Pyomo 4.0

我们很高兴地宣布发布 Pyomo 4.0 (4.0.9629)。Pyomo 是一组 Python 软件包,支持各种优化功能,用于公式化和分析优化模型。

此版本将 Coopr 更名为 Pyomo,这反映了用户一直将 Coopr 软件与 Pyomo 建模语言混淆的事实。Pyomo 4.0 包含以下重大更改

  • Pyomo 提供了一个单一的源代码树,取代了所有 Coopr 包
  • 'pyomo' 命令取代了 'coopr' 命令
  • 'pyomo solve' 子命令取代了之前的 'pyomo' 命令
  • 'pyomo.environ' 包现在用于导入核心 Pyomo 功能
  • 对 Python 3.x 的强大支持

此版本的亮点如下

  • 建模
    • 添加了 RealInterval 域
    • coopr.dae 的重大重构。现在可以表示更高阶和偏微分方程。还添加了更多离散化方案。
  • 求解器
    • 添加了对 Benders 求解器的初步支持
    • 添加了对 BARON 求解器的支持
    • 对 MPEC 求解器(包括 PATH 求解器)的初步支持
  • 转换
    • 添加了对模型转换的显式支持
    • 'pyomo solve --transform' 选项指定了模型转换
    • 创建了一个流线型线性对偶转换
  • 其他
    • 'pyomo help' 命令记录了已安装的功能
    • 'pyomo_install' 脚本的重大重构和简化
    • 添加了对使用 Pyro4 的并行支持

有关安装选项和 Pyomo 入门文档,请参阅 https://pyomo.cn

享受!

  • Pyomo 开发团队
  • pyomo-developers@googlecode.com
  • https://pyomo.cn

关于 Pyomo

Pyomo 主页为 Pyomo 用户提供了资源

Pyomo 开发由 Sandia 国家实验室和 COIN-OR 托管

请参阅 Pyomo 论坛进行 Pyomo 的在线讨论

Coopr 正在更名为 Pyomo

Coopr 软件很快将更名为 Pyomo!Coopr 曾是一个伞式软件项目,其中包括 Pyomo 和其他软件组件。然而,大多数用户首先且最重要的是使用 Coopr 的 Pyomo 建模包。因此,许多用户将他们的模型描述为“Pyomo 模型”,即使它依赖于 Coopr 中的高级建模扩展。事实上,甚至 Coopr 开发人员也经常讨论“Pyomo”开发。

鉴于这种混淆,我们决定将此软件明确命名为 Pyomo。今年秋天晚些时候,Pyomo 4.0 将发布。源代码仓库将更改以反映名称更改。新的 Pyomo 主页将托管在 https://pyomo.cn,并且 Pyomo Trac 站点将重新设计,以更明确地成为 Pyomo 开发人员的站点。

Pyomo 4.0 中还将有一些新功能。更多详细信息即将公布!