本文是对官方文档中scipy.optimize.linprog的简单翻译和解释。(第一次写博客,也不太会用博客园的编辑器,可能措辞和排版有不合适之处,请见谅)
文档链接:https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.optimize.linprog.html
线性规划的定义及解法就不过多介绍了,(毕竟教程多的是),
文档中对linprog的描述是‘Minimize a linear objective function subject to linear equality and inequality constraints.’,解决的正是一般的线性规划问题。
函数原型: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,b_ub,A_eq,b_eq,bounds这几个
c是一个数组,按顺序排列目标函数的参数,比如目标函数是2x0-4x1,输入的c就是[2,-4]。
A_ub与b_ub,A_eq与b_eq是两对参数,前一对是不等式约束(小于等于),后一对是等式约束,使用方法其实是一样的。例如,有约束条件
-3*x0 + 1*x1 <= 6;
1*x0 + 2*x1 <= 4
(这里用的是文档中的例子)
那么A_ub就是[[-3,1],[1,2]],b_ub是[6,4]。注意A_ub是二维的数组,第0维(行)的每一个数组就是每个约束条件里x的系数。
如果是等式约束的话,只要换用另一对参数就可以了,不需要做其他改动
bounds就是字面意思了,也就是每一个x的取值范围,一一对应,无穷要用None来表示,比如x0大于3,就应该写成(3,None)。
顺便提一下method,看上去是可选项,其实只有一个simplex可用......
知道这些就可以求解线性规划问题了
引用文档中的示例代码:
c = [-1, 4] A = [[-3, 1], [1, 2]] b = [6, 4] x0_bounds = (None, None) x1_bounds = (-3, None) res = linprog(c, A_ub=A, b_ub=b, bounds=(x0_bounds, x1_bounds), options={"disp": True}) print(res)
目标函数f = -1*x0 + 4*x1
约束条件为
-3*x0 + 1*x1 <= 6
1*x0 + 2*x1 <= 4
x1>=3
print会输出一下内容:
Optimization terminated successfully. Current function value: -11.428571 Iterations: 2 status: 0 success: True fun: -11.428571428571429 x: array([-1.14285714, 2.57142857]) message: 'Optimization terminated successfully.' nit: 2
status就是执行情况,0代表成功结束,1代表到达最大迭代次数,2代表问题不可行,3代表问题由于无边界而不可解(例如最优解可以取到无穷大);
fun和x就是最优解和对应的x的取值;
nit是迭代次数。
(其他好像也没什么了)