swiglpk-gnu线性规划工具包的简单swig绑定
swiglpk的Python项目详细描述
gnu线性编程工具包(glpk)的纯python绑定
为什么?
swiglpk不是glpk的高级包装器(请看 optlang如果你是 对基于python的数学编程语言感兴趣)。只是 提供普通的swig绑定到 底层C库。与python的其他glpk包装器相比 (例如PyGLPK, Python-GLPK, ctypes-glpk, ecyglpki等)这是公平的 版本不可知:它将尝试猜测glpk.h头的位置 文件(使用which glpsol),然后编译 特殊GLPK安装。此外,swiglpk还提供了二进制轮子 对于所有主要平台,它们总是最新的 最新的glpk版本(swiglpk版本遵循主要的glpk版本控制 以及小版本数字来强调这一点)。
如果你觉得swiglpk有用的话,请盯着这个repo给我们一些爱!
安装
pip install swiglpk
就这样。swiglpk为windows、mac和linux提供了二进制轮子。不需要安装第三方依赖项。
示例
from swiglpk import * ia = intArray(1+1000); ja = intArray(1+1000); ar = doubleArray(1+1000); lp = glp_create_prob(); glp_set_prob_name(lp, "sample"); glp_set_obj_dir(lp, GLP_MAX); glp_add_rows(lp, 3); glp_set_row_name(lp, 1, "p"); glp_set_row_bnds(lp, 1, GLP_UP, 0.0, 100.0); glp_set_row_name(lp, 2, "q"); glp_set_row_bnds(lp, 2, GLP_UP, 0.0, 600.0); glp_set_row_name(lp, 3, "r"); glp_set_row_bnds(lp, 3, GLP_UP, 0.0, 300.0); glp_add_cols(lp, 3); glp_set_col_name(lp, 1, "x1"); glp_set_col_bnds(lp, 1, GLP_LO, 0.0, 0.0); glp_set_obj_coef(lp, 1, 10.0); glp_set_col_name(lp, 2, "x2"); glp_set_col_bnds(lp, 2, GLP_LO, 0.0, 0.0); glp_set_obj_coef(lp, 2, 6.0); glp_set_col_name(lp, 3, "x3"); glp_set_col_bnds(lp, 3, GLP_LO, 0.0, 0.0); glp_set_obj_coef(lp, 3, 4.0); ia[1] = 1; ja[1] = 1; ar[1] = 1.0; # a[1,1] = 1 ia[2] = 1; ja[2] = 2; ar[2] = 1.0; # a[1,2] = 1 ia[3] = 1; ja[3] = 3; ar[3] = 1.0; # a[1,3] = 1 ia[4] = 2; ja[4] = 1; ar[4] = 10.0; # a[2,1] = 10 ia[5] = 3; ja[5] = 1; ar[5] = 2.0; # a[3,1] = 2 ia[6] = 2; ja[6] = 2; ar[6] = 4.0; # a[2,2] = 4 ia[7] = 3; ja[7] = 2; ar[7] = 2.0; # a[3,2] = 2 ia[8] = 2; ja[8] = 3; ar[8] = 5.0; # a[2,3] = 5 ia[9] = 3; ja[9] = 3; ar[9] = 6.0; # a[3,3] = 6 glp_load_matrix(lp, 9, ia, ja, ar); glp_simplex(lp, None); Z = glp_get_obj_val(lp); x1 = glp_get_col_prim(lp, 1); x2 = glp_get_col_prim(lp, 2); x3 = glp_get_col_prim(lp, 3); print("\nZ = %g; x1 = %g; x2 = %g; x3 = %g\n" % (Z, x1, x2, x3)) glp_delete_prob(lp);
…将产生以下输出(示例也可以在 examples/example.py):
GLPK Simplex Optimizer, v4.52 3 rows, 3 columns, 9 non-zeros * 0: obj = 0.000000000e+00 infeas = 0.000e+00 (0) * 2: obj = 7.333333333e+02 infeas = 0.000e+00 (0) OPTIMAL LP SOLUTION FOUND Z = 733.333; x1 = 33.3333; x2 = 66.6667; x3 = 0
很难看吧?考虑使用optlang来制定和解决优化问题。
文档
您可以找到有关glpk的c api的文档here
开发
你还想从源安装吗?然后您需要安装以下 依赖关系优先。
- GLPK
- 开关量
如果你在OSX上,swig和glpk可以很容易地安装 homebrew。
brew install swig glpk
如果你使用的是ubuntu linux,你可以使用 apt-get。
apt-get install glpk-utils libglpk-dev swig
如果你在windows上,你就可以自己操作了(查看appveyor.yml配置文件以获得指导)。
然后克隆repo并运行以下命令。
python setup.py install