本文介绍三种常见的python做线性规划的工具包:scipy、pulp、cvxpy,后面2个包也支持整数规划(Integer Program)、01规划(Binary Program)还是混合整数线性规划(MILP)。
一、scipy做线性规划
1、scipy简单介绍
scipy库是个功能很强大的包,可以通过调用optimize.linprog函数解决简单的线性规划:
scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None,
bounds=None, method=‘simplex’, callback=None, options=None)
c指的应该是要求最大值的函数的系数数组,A_ub是应该是不等式未知量的系数矩阵,【注意:来这不等式指的是<=的不等式,那如果是>=,就需要乘个负号】。A_eq就是其中等式的未知量系数矩阵了。B_ub就是不等式的右边了,B_eq就是等式右边了。bounds的话,指的就是每个未知量的范围了。
2、案例
题目:
代码示例:
from scipy import optimize as op
import numpy as np
c=np.array([2,3,-5])
A_ub=np.array([[-2,5,-1],[1,3,1]])#注意是-2,5,-1
B_ub=np.array([-10,12])
A_eq=np.array([[1,1,1]])
B_eq=np.array([7])
# 上限7是根据约束条件1和4得出的
x1=(0,7)
x2=(0,7)
x3=(0,7)
res=op.linprog(-c,A_ub,B_ub,A_eq,B_eq,bounds=(x1,x2,x3))
print(res)
结果:
二、pulp工具包
1、pulp简单介绍
Python的scipy库中提供了解简单线性或非线性规划问题,但是不能求解如背包问题的0-1规划问题,或整数规划问题,混合整数规划问题,pulp库可以求解以上类型的问题,并且有更多的通用性,编写程序更自由。
官方有很多案例和教程:
https://coin-or.github.io/pulp/CaseStudies/a_transportation_problem.html#presentation-of-solution-and-analysis
2、案例
pulp官方教程和网上可参看案例比较多,个人推荐下面一篇文章
https://www.jianshu.com/p/9be417cbfebb
里面还有运输问题,指派问题的案例。
三、cvxpy工具包
1、cvxpy简单介绍
CVXPY是一种可以内置于Python中的模型编程语言,解决凸优化问题(整数规划、01规划和混合规划)。它可以自动转化问题为标准形式,调用解法器,解包结果集。cvxpy包相对前面2种算是最专业了,功能也更强大。从安装难度和官方教程就可以看出来。
我前面一篇文章介绍了cvxpy的安装。
2、案例
复杂一些的问题,建议参考教程案例里面有大量很复杂的问题案例。我自己使用直接用的是上千变量的外部数据,不适合入门介绍,就不分享了。简单的入门可以参考如下2篇文章:
https://blog.csdn.net/GeekWill/article/details/78836054
使用Python中的cvxpy库解整数规划问题
来源:oschina
链接:https://my.oschina.net/u/4412439/blog/4812031