老卫带你学—python使用scipy求解线性规划问题
线性规划求解
线性规划求解主要弄清楚两个部分,目标函数(max,min)和约束条件(s.t.),我们求解时一般要化为MATLAB标准形式
MATLAB求解代码为:
[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)
LB,UB分别为x的上界和下界
在此用Python求解,需要scipy和numpy库的支持:
from scipy import optimize
import numpy as np
#求解函数
res = optimize.linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)
#目标函数最小值
print(res.fun)
#最优解
print(res.x)
例 求解下列线性规划问题
code:
#导入包
from scipy import optimize
import numpy as np
#确定c,A,b,Aeq,beq
c = np.array([2,3,-5])
A = np.array([[-2,5,-1],[1,3,1]]) ###这里是二维数组
b = np.array([-10,12)]
Aeq = np.array([[1,1,1]]) ###这里是二维数组
beq = np.array([7])
#求解
res = optimize.linprog(-c,A,b,Aeq,beq)
print(res)
reslult:
fun: -14.571428571428571
message: 'Optimization terminated successfully.'
nit: 2
slack: array([3.85714286, 0. ])
status: 0
success: True
x: array([6.42857143, 0.57142857, 0. ])
可以看到求解的结果,我们关注第一个和最后一个,fun就是目标函数最小值,x就是最优解。
注:在求解时带入-c并且把第二个式子的系数加了负号,是因为需要化为MATLAB标准形式,最终求出来的值为最小值即-14.57,去掉负号就是我们要的最大值。