线性规划简介
线性规划(Linear programming,简称LP),是运筹学中研究较早、发展较快、应用普遍、方法较成熟的一个重要分支,它是辅助人们进行科学管理的一种数学方法。研究线性约束条件下线性目标函数的极值问题的数学理论和方法。英文缩写LP。python
线性规划是运筹学的一个重要分支,普遍应用于军事做战、经济分析、经营管理和工程技术等方面。为合理地利用有限的人力、物力、财力等资源做出的最优决策,提供科学的依据。算法
线性规划模型的三要素
线性规划模型主要包括三个部分:决策变量、目标函数、约束条件编程
决策变量
决策变量是指问题中能够改变的量,例如生产多少货物,选择哪条路径等;线性规划的目标就是找到最优的决策变量。
在线性规划中决策变量包括实数变量,整数变量,0-1变量等。
微信
目标函数
目标函数就是把问题中的决策目标量化,通常分为最大化目标函数和最小化目标函数。在线性规划中,目标函数为一个包含决策变量的线性函数,例如
max x 1 + x 2 \text{max}\quad x_1 +x_2 maxx1+x2
约束条件
函数
约束条件是指问题中各类时间,空间,人力,物力等限制。在线性规划中约束条件通常表示为一组包含决策变量的不等式,例如
x 1 + 2 x 2 ≤ 10 4 x 1 + 3 x 2 ≤ 24 \begin{array}{r} x_{1}+2 x_{2} \leq 10 \\ 4 x_{1}+3 x_{2} \leq 24 \end{array} x1+2x2≤104x1+3x2≤24
此外,决策变量的取值范围称为符号约束,例如:
x 1 ≥ 0 , x 2 ≥ 0 x_1 \geq 0,x_2\geq 0 x1≥0,x2≥0
spa
线性规划模型的数学表示
线性规划模型能够写成以下形式:
max z = x 1 + x 2 s.t. x 1 + 2 x 2 ≤ 10 4 x 1 + 3 x 2 ≤ 24 x 1 , x 2 ≥ 0 \begin{aligned} &\max \quad z=x_{1}+x_{2}\\ &\text { s.t. } \quad x_{1}+2 x_{2} \leq 10\\ &\begin{array}{r} \quad \quad 4 x_{1}+3 x_{2} \leq 24 \\ \quad x_{1}, x_{2} \geq 0 \end{array} \end{aligned} maxz=x1+x2 s.t. x1+2x2≤104x1+3x2≤24x1,x2≥0
其中, s . t . s.t. s.t. 表示 s u b j e c t t o subject \; to subjectto 的缩写。
3d
上述模型的矩阵形式以下:
max z = c T x s.t. A x ≤ b x ≥ 0 \begin{array}{rr} \max & z=c^{T} x \\ \text { s.t. } & A x \leq b \\ & x \geq 0 \end{array} max s.t. z=cTxAx≤bx≥0
对于有 n n n 个决策变量, m m m 个约束的线性规划模型, c , x c,x c,x 为 n n n 维列向量, b b b 为 m m m 为列向量, A A A 为 m ∗ n m*n m∗n 维系数矩阵。
code
单纯型法标准型与编程过程的“标准型”
单纯型法:blog
单纯型法思路就是在 可行域的一个顶点处找到一个初始可行解,判断该解是否是最优,若不是,则迭代到下一个顶点处进行重复判断。由于最优解的搜索范围从整个可行域缩小到了可行域的有限个顶点,算法的效率获得了极大的提高。图片
在单纯型法中,咱们经过增长变量等将约束条件变成等式。在编程中,通常支持直接写等式约束和小于等于约束。
在单纯型法中,咱们将最大化目标函数视为标准型。在编程中,咱们将最小化目标函数做为标准型。
Python 求解线性规划模型
编程思路:
1. 选择适当的决策变量
在解决实际问题时,把问题归结成一个线性规划数学模型是很重要的一步,但每每也是困难的一步,模型创建得是否恰当,直接影响到求解。而选适当的决策变量,是咱们创建有效模型的关键之一。
2.将求解目标简化为求一个目标函数的最大/最小值
能把要求解的问题简化为一个最值问题是可否使用线性规划模型的关键,若是这一点不能达到,以后的工做都有没有意义的。
3. 根据实际要求写出约束条件(正负性,资源约束等)
线性规划的约束条件针对不一样的问题有不一样的形式,总结来讲有如下三种:等式约束、不等式约束、符号约束
考虑如下线性规划问题:
max z = 2 x 1 + 3 x 2 − 5 x 3 s.t. x 1 + x 2 + x 3 = 7 2 x 1 − 5 x 2 + x 3 ≥ 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 , x 2 , x 3 ≥ 0 \begin{array}{r} \max z=2 x_{1}+3 x_{2}-5 x_{3} \\ \text { s.t. } \quad x_{1}+x_{2}+x_{3}=7 \\ 2 x_{1}-5 x_{2}+x_{3} \geq 10 \\ x_{1}+3 x_{2}+x_{3} \leq 12 \\ x_{1}, x_{2}, x_{3} \geq 0 \end{array} maxz=2x1+3x2−5x3 s.t. x1+x2+x3=72x1−5x2+x3≥10x1+3x2+x3≤12x1,x2,x3≥0
Step1:导入相关函数库:
import numpy as np from scipy import optimize as op
Step2: 定义决策变量:
# 给出变量取值范围 x1=(0,None) x2=(0,None) x3=(0,None)
Step3: 将原问题化为标准形式
注意:编程时默认为最小化目标函数,所以这里改成 ;第二个约束为大于等于约束,这里化为小于等于约束;
Step4: 定义目标函数系数和约束条件系数
c=np.array([-2,-3,5]) # 目标函数系数,3x1列向量 A_ub=np.array([[-2,5,-1],[1,3,1]]) # 不等式约束系数A,2x3维矩阵 B_ub=np.array([-10,12]) # 等式约束系数b, 2x1维列向量 A_eq=np.array([[1,1,1]]) # 等式约束系数Aeq,3x1维列向量 B_eq=np.array([7]) # 等式约束系数beq,1x1数值
Step5: 求解
res=op.linprog(c,A_ub,B_ub,A_eq,B_eq,bounds=(x1,x2,x3)) #调用函数进行求解 print('结果以下:\n',res)
完整代码以下:
import numpy as np from scipy import optimize as op # 给出变量取值范围 x1=(0,None) x2=(0,None) x3=(0,None) c=np.array([-2,-3,5]) # 目标函数系数,3x1列向量 A_ub=np.array([[-2,5,-1],[1,3,1]]) # 不等式约束系数A,2x3维矩阵 B_ub=np.array([-10,12]) # 等式约束系数b, 2x1维列向量 A_eq=np.array([[1,1,1]]) # 等式约束系数Aeq,3x1维列向量 B_eq=np.array([7]) # 等式约束系数beq,1x1数值 res=op.linprog(c,A_ub,B_ub,A_eq,B_eq,bounds=(x1,x2,x3)) #调用函数进行求解 print('结果以下:\n',res)
结果以下:
结果以下: con: array([1.80712334e-09]) fun: -14.571428565645078 message: 'Optimization terminated successfully.' nit: 5 slack: array([-2.24570584e-10, 3.85714286e+00]) status: 0 success: True x: array([6.42857143e+00, 5.71428571e-01, 2.35900788e-10])
即,当 x 1 = 6.42857143 , x 2 = 0.571428571 , x 3 = 2.35900788 × 1 0 − 10 x_1=6.42857143,x_2=0.571428571,x_3=2.35900788\times10^{-10} x1=6.42857143,x2=0.571428571,x3=2.35900788×10−10 时候目标函数取得最大值。
部份内容参考其余文章 分享自微信公众号 - 数据科学CLUB(jiji8215) 做者:少年吉