线性规划问题,在线性等式或者不等式的约束下,去求解一个线性目标函数的最大值最小值问题。
首先想到的是scipy中的优化包→optimize里面的 linprog。这个名字和MATLAB里面优化的名字是一样的。
对于简单的连续性线性极值问题,可以使用。
from scipy import optimize as op
help(op.linprog)
查看帮助,可以看到这个函数的用法
linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None,
method='interior-point', callback=None, options=None, x0=None)
最主要的就是 c,A_ub, b_ub, A_eq, b_eq,前五个参数。
这个函数求的是最小值,也就是求c(目标线性函数)最小,如果现实是求极大值,那么要加一个负号。
他所有的不等式约束都是默认"<=" , 所以要把所有的不等式都转成小于
A_ub,二维数组,所有不等式约束的系数组成
b_ub,一维数组,所有不等式约束的结果组成
A_eq,二维数组,就是约束中等式的系数组成
b_eq,一维数组,所以约束中等式的结果组成
bounds,边界,就是结果的取值边界,默认是(0,None),就是0到无穷大。可以写多个,比如有三个未知数:((0,3),(0,100),(0,None))。
method,方法,{‘interior-point’, ‘revised simplex’, ‘simplex’}三个值可选。
- interior-point:内部点,如果bounds为0~None,那么这个值永远取不到0,只会近似接近。
- revised simplex:改进的simplex方法。这个是最常用的。(第一种方法求出的都是近似的,很难把控我觉得)
- simplex:这是前版本遗留下来的方法,为了支持前版本的程序。
其他参数不说了。这个够用。
例:
设变量x1为A1牛奶的产量,x2为A2的
目标函数就是利益最大:24 * x1+16 * x2 (也就是最小化: -24 * x1-16 * x2)
约束条件为:
x1<=100
4 * x1 + 2 * x2 <=480
x1 / 3 + x2 / 4<=50
x1,x2 >=0
由于里面有除号,所以计算机会近似,因为精度问题,得到的结果不理想。所以建模的时候不要有除号的出现。
我们重新定义,把产量前面加上系数:
设变量3 * x1为A1牛奶的产量,4 * x2为A2的
目标函数就是利益最大:24 * (3 * x1)+16 * (4 * x2) (也就是最小化: -72 * x1 -64 * x2)
约束条件为:
3 * x1<=100
4 * (3 * x1) + 2 * (4 * x2) <=480
x1 + x2 <=50
x1,x2 >=0
代码:(注意,如果式子中没有出现的未知数系数要写0,不能不写)
c = np.array([-72,-64])
A_ub = np.array([[3,0],[12,8],[1,1]])
b_ub = np.array([100,480,50])
op.linprog(c,A_ub,b_ub,method='revised simplex')
结果:
con: array([], dtype=float64)
fun: -3360.0
message: 'Optimization terminated successfully.'
nit: 4
slack: array(