线性规划
线性规划(Linear programming,简称LP),是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支,它是辅助人们进行科学管理的一种数学方法。研究线性约束条件下线性目标函数的极值问题的数学理论和方法。英文缩写LP。
启示
在解决实际问题时,把问题归结成一个线性规划数学模型是很重要的一步,但往往也是困难的一步,模型建立得是否恰当,直接影响到求解。而选适当的决策变量,是我们建立有效模型的关键之一。
实例1:普通问题
某机床厂生产甲、乙两种机床,每台销售后的利润分别为4000元与3000元。生产甲机床需用A、B机器加工,加工时间分别为每台2小时和1小时;生产乙机床需用A、B、C三种机器加工,加工时间为每台各一小时。若每天可用于加工的机器时数分别为A机器10小时、B机器8小时和C机器7小时,问该厂应生产甲、乙机床各几台,才能使总利润最大?
思路
在一组线性约束条件的限制下,求一线性目标函数最大或最小的问题。
求解
约束条件
{ 2 x 1 + x 2 ≤ 10 x 1 + x 2 ≤ 8 x 2 ≤ 7 x 1 , x 2 ≥ 0 \begin{cases} 2x_1+x_2 \leq 10 \\ x_1 + x_2 \leq 8 \\ x_2 \leq 7 \\ x_1,x_2 \geq 0 \\ \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧2x1+x2≤10x1+x2≤8x2≤7x1,x2≥0
目标函数
m a x z = 4 x 1 + 3 x 2 max \ \ z=4x_1+3x_2 max z=4x1+3x2
python使用scipy.optimize.linprog
linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simplex', callback=None, options=None)
其中标准式
使最小化: c^T * x
服从: A_ub * x <= b_ub
A_eq * x == b_eq
代码
#! /usr/bin/python3
# 导入一下包,没有的自行pip
import numpy
from scipy import optimize
c = [-4, -3]
A_ub = [[2, 1], [1, 1], [0, 1]]
b_ub = [10, 8, 7]
A_eq = None
b_eq = None
bounds = [[0, None], [0, None]]
result = optimize.linprog(c, A_ub, b_ub, A_eq, b_eq, bounds)
print(result)
结果
con: array([], dtype=float64)
fun: -25.999999999841215
message: 'Optimization terminated successfully.'
nit: 5
slack: array([8.02451439e-11, 3.92690325e-11, 1.00000000e+00])
status: 0
success: True
x: array([2., 6.])
fun最大值:26
array最优解: x 1 = 2 , x 2 = 6 x_1=2,x_2=6 x1=2,x2=6
实例2:可以转换线性规划的问题
很多看起来不是线性规划的问题也可以通过变换变成线性规划的问题来解决。如:
m i n ∣ x 1 ∣ + ∣ x 2 ∣ + ⋅ ⋅ ⋅ + ∣ x n ∣ s . t . A x < b min \ \left | x_1 \right |+\left | x_2 \right |+···+\left | x_n \right | \\ s.t. \ \ Ax < b\\ min ∣x1∣+∣x2∣+⋅⋅⋅+∣xn∣s.t. Ax<b
其中 x = [ x 1 . . . x n ] T x=[x_1 ...x_n]^T x=[x1...xn]T、A和b为相应维数的矩阵和向量。
思路
要把上面的问题变换成线性规划问题,只要注意到事实:
对任意的 x i x_i xi,存在 u i , v i > 0 u_i,v_i>0 ui