跳转到内容

GLPK/Python

来自维基教科书,开放的书籍,为开放的世界

有几种可供选择的Python语言绑定。每个绑定提供不同的抽象级别。都是开源软件。

脚本编写加上 MathProg页面上提供有关 Python 和 GLPK 的更多信息。


PyGLPK 是 GLPK 在 Python 对象中的封装(目前正在维护(2021 年))。与 Python-GLPK 相比,语言绑定是“手工制作的”,从而能够在 Python 语言中实现更流畅的集成。PyGLPK 采用 GNU 通用公共许可证授权。

PyGLPK 0.3 于 2010 年 5 月 30 日发布,但基于 GLPK 4.31 API。测试(make; make test) 在 GLPK 4.45 上失败。

PyMathProg

[编辑 | 编辑源代码]

PyMathProg 基于PyGLPK。PyMathProg 也采用 GNU 通用公共许可证授权。

PyMathProg 提供了一种领域特定语言,它能够以与 GLPK MathProg (GMPL) 或 AMPL 非常相似的形式来制定线性问题。

来自桑迪亚国家实验室Python 优化建模对象 (Pyomo) 软件包[1]是一个用于在 Python 中建模优化应用程序的开源工具。Pyomo 默认使用 GLPK 求解器,尽管可以选取其他求解器。Pyomo 在 BSD 许可证下发布。

GLPK 通过创建 LP 文件,并通过命令行接口将其运行到 GLPSOL,然后解释输出文件来进行接口。

严格地说,Pyomo 不是一组针对 GLPK 的低级 Python 语言绑定——相反,Pyomo 提供了高级线性规划结构(在表达上类似于 MathProg)以及 Python 语言的正常特性。

Pyomo 比 GLPK MathProg 或 AMPL 更简洁,因为它必须被解析为 Python。例如,以下 MathProg 语句

maximize f: 0.6 * x1 + 0.5 * x2;

在 Pyomo 中相当于

model.f = Objective( expr=0.6 * model.x + 0.5 * model.y, sense=maximize )

Python-GLPK

[编辑 | 编辑源代码]

Rogério Reis开发的Python-GLPK 是一个使用SWIG 创建的针对 GLPK 的 Python 语言绑定,并采用 GNU 通用公共许可证授权(不幸的是,该软件包不再维护(2021 年))。它也可以通过 Debian 包获得python-glpk.

SWIG 允许轻松维护,因为几乎没有 GLPK 特定代码存在。SWIG 还确保几乎所有 GLPK 库函数都可用。另一方面,客户端调用方法有些笨拙。

构建 Python-GLPK 需要以下依赖项(至少):

以下最小化程序将显示 GLPK 版本号

import glpk
print glpk.glp_version()

从源代码构建和安装

[编辑 | 编辑源代码]

如果无法(或选择不)使用 Debian 包python-glpk,则可以从源代码构建和安装 Python-GLPK。需要 root 权限。以下是步骤

  • 切换到合适的子目录并下载源代码
    wget http://www.dcc.fc.up.pt/~jpp/code/python-glpk/python-glpk_0.4.43.orig.tar.gz
  • 解压缩存档
    tar -xzf python-glpk_0.4.43.orig.tar.gz
  • 切换到src目录
    cd python-glpk-0.4.43/src/
  • 一次性构建和安装软件(请注意,make install 首先执行 make all
    sudo make install
  • 切换到examples目录
    cd ../examples
  • 运行确认测试
    python test.py

CVXOPT 是一个基于 Python 语言的凸优化软件包。它提供对不同的线性(GLPK,Mosek)和二次(Mosek)规划求解器的接口。CVXOPT 由 Joachim Dahl 和 Lieven Vandenberghe 开发。

Sage 是一个基于 Python 的通用数学软件。虽然 Sage 严格来说比 Python 更多,但它仍然列在这个页面上。

用户可以选择链接到 GLPK、COIN Branch-and-Cut 和CPLEX(截至 2010 年 11 月,计划支持SCIP)。但由于许可证的原因,GLPK 仍然是默认求解器。Sage 可用于混合整数规划和图论问题。

PuLP 是 Python 的 LP 建模模块。它生成 MPS 或 LP 文件,并通过命令行将这些文件提交给 GLPK、COIN CLP/CBC、CPLEX 或 XPRESS。采用MIT 许可证。对于 GLPK,PuLP 将问题写入 CPLEX LP 文件,然后在一个新的进程中执行类似以下命令

glpsol --cpxlp %d-pulp.lp --o %d-pulp.sol [--nomip]

完成时,将分析解决方案文件。将删除两个中间文件。

PuLP 还具有针对 GLPK 的直接 python 绑定(上面的示例生成了一个新的进程并发出系统命令)。截至 2012 年 8 月,该功能是使用PyGLPK 绑定实现的,但下一个版本应该使用Python-GLPK 绑定(代码已编写,正在评估中)。

Yet Another Python OSI 绑定或yabosib 项目提供 OSI 绑定——换句话说,yaposib 将 OSI API 包装在 python 类中。它计划正式包含在COIN-OR 套件中。yaposib 还被设计为在PuLP 中使用。

一个 Cython GLPK 接口

这些绑定使用面向对象风格,但仍然相对接近 GLPK C API。例如,大多数 GLPK 函数名称基本保留(删除了 glp_ 前缀),并添加了几个类似的函数。添加的功能之一是,在大多数函数中,行和列名称以及整数索引都可以使用。

一些非常简单的代码,让你了解绑定

# set up the problem
lp = ecyglpki.Problem()
lp.add_named_rows('first', 'second')
lp.set_row_bnds('first', None, 0)
lp.add_named_cols('x', 'y')
lp.set_col_bnds('x', -1, None)
lp.set_mat_col('x', {'first': -1, 'second': 1})
lp.set_col_kind('y', 'binary')
lp.set_obj_coef('x', 1)
lp.set_obj_coef('y', -3)
lp.set_obj_dir('maximize')
# configure and solve
iocp = ecyglpki.IntOptControls() # (default) int. opt. control parameters
iocp.presolve = True
status = lp.intopt(iocp)
if status != 'optimal':
    raise RuntimeError('Error while solving...: ' + status)
# fix the binary variable to its computed value and find exact solution
yval = lp.mip_col_val('y')
lp.set_col_bnds('y', yval, yval)
smcp = ecyglpki.SimplexControls() # (default) simplex control parameters
smcp.presolve = True
status = lp.simplex(smcp)  # solve
if status != 'optimal':
    raise RuntimeError('Error while solving...: ' + status)
smcp.presolve = False
status = lp.exact(smcp)  # now solve exactly
if status != 'optimal':
    raise RuntimeError('Error while solving...: ' + status)

外部资源

该文档包含 API 的描述,还包含示例,这些示例的源代码可用,可以检查这些代码以了解如何使用该包。

GNU 线性规划套件的简单 swig 绑定

PyPI 上提供了描述、安装说明和示例:https://pypi.python.org/pypi/swiglpk

源代码可在 GitHub 上获取:https://github.com/biosustain/swiglpk

ctypes 库允许包装本机库调用。

此示例显示 GLPK 版本号

#!/usr/bin/python
from ctypes import *

solver = cdll.LoadLibrary('libglpk.so')
solver.glp_version.restype = c_char_p

print solver.glp_version()

用户建议

[编辑 | 编辑源代码]

线程 在 2011 年初讨论了各种 Python 绑定的优点

  • 一名用户报告称,尽管进行了多次尝试,但无法在 Mac OS X 下构建 Python-GLPK
  • 一名用户推荐使用 PyMathProg,并建议从头开始编译 GLPK,而不是依赖第三方二进制文件

参考文献

[编辑 | 编辑源代码]
  1. Hart, William E. (2008). "Python optimization modeling objects (Pyomo)" (PDF). {{cite journal}}: Cite journal requires |journal= (help)
华夏公益教科书