跳轉到內容

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)
華夏公益教科書