01. 线性规划
定义
线性规划,就是在一组线性约束条件的限制下,求一线性目标函数最大或最小的问题。
线性规划由三部分组成:
- 决策变量
- 目标函数
- 约束条件
形式
编程中,线性规划的标准形式为:
min
x
c
T
x
\min_xc^Tx
xmincTx
s . t . { A x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b s.t.\left\{\begin{aligned} &Ax\le b \\ &Aeq\cdot x=beq \\ &lb\le x\le ub \end{aligned}\right. s.t.⎩⎪⎨⎪⎧Ax≤bAeq⋅x=beqlb≤x≤ub
其中 c , x c,x c,x 为 n n n 维列向量, A , A e q A,Aeq A,Aeq 为适当维数的矩阵, b , b e q b,beq b,beq 为适当维数的列向量。
例子
如对于下列线性规划问题:
max
z
=
2
x
1
+
3
x
2
−
5
x
3
\max z=2x_1+3x_2-5x_3
maxz=2x1+3x2−5x3
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 s.t.\left\{\begin{aligned} &x_1+x_2+x_3=7 \\ &2x_1-5x_2+x_3\ge10 \\ &x_1+3x_2+x_3\le12 \\ &x_1,x_2,x_3\ge0 \end{aligned}\right. s.t.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x1+x2+x3=72x1−5x2+x3≥10x1+3x2+x3≤12x1,x2,x3≥0
对于目标函数
化为矩阵形式有:
c = ( 2 3 − 5 ) T , x = ( x 1 x 2 x 3 ) T c=\begin{pmatrix} 2 & 3 & -5 \end{pmatrix}^T, x=\begin{pmatrix} x_1 & x_2 & x_3 \end{pmatrix}^T c=(23−5)T,x=(x1x2x3)T
注意到原目标函数求最大值,因此转换为求最小值后取反。
对于约束条件中的不等式
化为矩阵形式有:
A = ( − 2 5 − 1 1 3 1 ) , b = ( − 10 12 ) T A=\begin{pmatrix} -2 & 5 & -1 \\ 1 & 3 & 1 \end{pmatrix}, b=\begin{pmatrix} -10 & 12 \end{pmatrix}^T A=(−2153−11),b=(−1012)T
注意到最终要求左边小于等于右边,因此对于原为大于或大于等于的不等式要先取反。
对于约束条件中的等式
化为矩阵形式有:
A
e
q
=
(
1
1
1
)
,
b
e
q
=
(
7
)
T
=
7
Aeq=\begin{pmatrix} 1 & 1 & 1 \end{pmatrix}, beq=\begin{pmatrix} 7 \end{pmatrix}^T=7
Aeq=(111),beq=(7)T=7
对于约束条件中的取值范围
化为矩阵形式有:
l
b
=
(
0
0
0
)
lb=\begin{pmatrix} 0 & 0 & 0 \end{pmatrix}
lb=(000)
Python 代码
使用 python 的求解代码如下:
# %%
import numpy as np
from scipy.optimize import linprog
# %%
# 目标函数形如 min c^T·x
c = np.array([2, 3, -5])
# 不等式约束形如 A·x <= b
A = np.array([[-2, 5, -1],
[1, 3, 1]])
b = np.array([-10, 12])
# 等式约束形如 Aeq·x = beq
Aeq = np.array([[1, 1, 1]])
beq = np.array([7])
# 取值范围约束形如 lb <= x <= ub
lb = np.array([0, 0, 0])
ub = np.array([None, None, None])
bound = tuple(zip(lb, ub))
res = linprog(c, A, b, Aeq, beq, bound)
print('min y =', res.fun)
print('x =', res.x)
输入如下:
min y = -14.000000657683218
x = [2.99999979e+00 1.04988686e-08 4.00000005e+00]
于是解得:
x 1 = 3 , x 2 = 0 , x 3 = 4 x_1=3,x_2=0,x_3=4 x1=3,x2=0,x3=4 时,目标函数取得最大值 14.