来自 <https://www.learningwhat.com/course/OR2018IE/flow-session/40838/0/>
参考资料:
以下为一个简单的例子(下载),演示了PuLP的建模和求解流程。参考来源链接.
- 官方文档 链接
- python_pulp_glpk-tutorial.pdf ·
- PuLP: A Linear Programming Toolkit for Python.pdf
- PuLP严格来说是一个基于Python的建模描述语言
- 它本身并没有求解功能,而是通过整合各种外部的求解工具来进行求解
- 比如让大家安装的GLPK就是一个求解工具.
- 相对于Matlab、AMPL来说简单,易用
- 安装PuLP及GLPK,链接,密码:6y89,GLPK目录.
- 分别安装PuLP和winglpk(后者安装方法见解压中的说明文件)
导入PuLP模块
from pulp import *
创建一个线性规划问题,名字为"test1"
prob = LpProblem("test1", LpMinimize)
Variables(决策变量)
# 0 <= x <= 4
x = LpVariable("x", 0, 4)
# -1 <= y <= 1
y = LpVariable("y", -1, 1)
# 0 <= z
z = LpVariable("z", 0)
LpVariable的第1位置参数为name(变量名),第2位置参数为lowBound(下限),第3位置参数为upBound(上限),第4位置参数为cat(变量类型)
使用None来表示无穷大(为lowBound的时候表示负无穷大,为upBound的时候为正无穷大), 例如z <= 0应表示为LpVariable("z", None, 0)
变量的类型默认值为LpContinuous, 整数类型为LpInteger, 0-1变量为LpBinary.
Objective(目标函数)
prob += x + 4*y + 9*z, "obj"
(最后一个name为该问题的名称,根据需要可设可不设)
Constraints(约束条件)
prob += x+y <= 5, "c1"
prob += x+z >= 10, "c2"
prob += -y+z == 7, "c3"
(最后一个name为该约束的名称,根据需要可设可不设)
输出一个LP文件
Don't do this on LearningWhat.com !!
prob.writeLP("test1.lp")
用默认的求解器(solver)求解问题
- 用prob.solve(GLPK())使用GLPK作为solver, 可使用用GLPK(msg = 0)来消除GLPK生成的消息
- 如果GLPK不在系统路径中,而且你没有安装pulpGLPK模块,将GLPK()替换成GLPK("/path/"),其中的/path/表示glpsol的路径(不包含glpsol 本身).
- 如果你要使用CPLEX, 则用CPLEX()替换GLPK().
- 如果你要使用XPRESS, 则用XPRESS()替换GLPK().
- 如果你要使用COIN, 则用COIN()替换GLPK(). 在这种情况下,系统中需设置clp和cbc的路径.
prob.solve()
# 打印出已经求解问题的状态
print("Status:", LpStatus[prob.status])
# 打印出最优解
for v in prob.variables():
print(v.name, "=", v.varValue)
# 打印最优目标函数值
print("objective=", value(prob.objective))
Status: Optimal
x = 4.0
y = -1.0
z = 6.0
objective= 54.0