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 基于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 )
由Rogério Reis开发的Python-GLPK 是一个使用SWIG 创建的针对 GLPK 的 Python 语言绑定,并采用 GNU 通用公共许可证授权(不幸的是,该软件包不再维护(2021 年))。它也可以通过 Debian 包获得python-glpk.
SWIG 允许轻松维护,因为几乎没有 GLPK 特定代码存在。SWIG 还确保几乎所有 GLPK 库函数都可用。另一方面,客户端调用方法有些笨拙。
构建 Python-GLPK 需要以下依赖项(至少):
- Python
- SWIG
- PLY (Python Lex-Yacc)——可通过 Debian 包单独获得python-ply和python-ply-doc
以下最小化程序将显示 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)
外部资源
- PyPI 页面:https://pypi.python.org/pypi/ecyglpki
- 最新版本的文档:http://pythonhosted.org/ecyglpki/
- GitHub 上的源代码:https://github.com/equaeghe/ecyglpki
- 最近开发版本的文档:https://equaeghe.github.io/ecyglpki/
该文档包含 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,而不是依赖第三方二进制文件
- ↑ Hart, William E. (2008). "Python optimization modeling objects (Pyomo)" (PDF).
{{cite journal}}
: Cite journal requires|journal=
(help)