最近在做最优化的作业,涉及到线性规划问题,之前运筹学也学过相关问题,都是通过手写单纯性表来进行求解的,但学了python之后感觉太麻烦了,不如利用python来帮我们求解。
线性规划求解主要弄清楚两个部分,目标函数(max,min)和约束条件(s.t.),我们求解时一般要化为python的标准形式:
在此用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)
好啦上门可以跳过不看,来通过一个例子掌握python求解线性规划:
#导入包
from scipy import optimize
import numpy as np
#确定c,A,b,Aeq,beq
c = np.array([1,-2,1,0])
A = np.array([[2,-1,4,0],[-1,2,-4,0]])
b = np.array([8,4])
Aeq = np.array([[1,1,-2,1]])
beq = np.array([10])
#求解
res = optimize.linprog(c,A,b,Aeq,beq)
print(res)
结果如下
con: array([2.16662244e-11])
fun: -18.999999999960654
message: 'Optimization terminated successfully.'
nit: 5
slack: array([4.74820183e-12, 1.77671211e-11])
status: 0
success: True
x: array([5.02499921e-13, 1.20000000e+01, 5.00000000e+00, 8.00000000e+00])
可以看到求解的结果,我们关注第一个和最后一个,fun就是目标函数最小值,x就是最优解。
注:如果原问题是求最大值,则在求解时带入-c,化为python标准形式,最终求出来的值为最小值即为相反数,去掉负号就是我们要的最大值。