python玄学建模(1):线性规划

本文是对官方文档中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(cA_ub=Noneb_ub=NoneA_eq=Noneb_eq=Nonebounds=Nonemethod='simplex'callback=Noneoptions=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是迭代次数。

(其他好像也没什么了)

上一篇:easy-flows 一个简单的工作流引擎


下一篇:Mysql 统计查询