赞
踩
线性规划(Linear programming,简称LP),是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支,它是辅助人们进行科学管理的一种数学方法。研究线性约束条件下线性目标函数的极值问题的数学理论和方法。英文缩写LP。
线性规划是运筹学的一个重要分支,广泛应用于军事作战、经济分析、经营管理和工程技术等方面。为合理地利用有限的人力、物力、财力等资源作出的最优决策,提供科学的依据。
线性规划模型主要包括三个部分:决策变量、目标函数、约束条件
决策变量
决策变量是指问题中可以改变的量,例如生产多少货物,选择哪条路径等;线性规划的目标就是找到最优的决策变量。
在线性规划中决策变量包括实数变量,整数变量,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
线性规划模型可以写成如下形式:
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
上述模型的矩阵形式如下:
max
z
=
c
T
x
s.t.
A
x
≤
b
x
≥
0
单纯型法:
单纯型法思路就是在 可行域的一个顶点处找到一个初始可行解,判断该解是不是最优,若不是,则迭代到下一个顶点处进行重复判断。因为最优解的搜索范围从整个可行域缩小到了可行域的有限个顶点,算法的效率得到了极大的提升。
在单纯型法中,我们通过增加变量等将约束条件变成等式。在编程中,一般支持直接写等式约束和小于等于约束。
在单纯型法中,我们将最大化目标函数视为标准型。在编程中,我们将最小化目标函数作为标准型。
编程思路:
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
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)
作者:少年吉
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。