记录线性规划的笔记,学习过程难免出错,欢迎指出错误。
课程为方述诚教授线性规划公开课,文中图片为课程PDF中截取,版权归PDF所有者。
文章目录
L1 Introduction
线性规划(LP)历史
- Conceived by G. B. Dantzig (1947)
- Named by T. C. Koopmans & G. B. Dantzig (1948)
- Simplex Method proposed by G. B. Dantzig (1948).(单纯形法曾是唯一的算法)
- Ellipsoid Method proposed by L. G. Khachian (1979)(First polynomial-time algorithm for LP)(椭球法是第一个多项式时间算法)
- Interior-Point Method proposed by N.Karmarkar (1984).(First “good” polynomial-time algorithm for LP)(内点法是第一个表现良好的多项式时间算法)
大规模线性规划问题的求解思路
- 特殊结构
- 稀疏性
- 解构,大化小
- 并行计算
L2 求解前的准备工作
LP的标准型
关于线性规划的标准型和规范型,请参考线性规划标准型和规范型
关键元素
n
n
n个变量(有限个)
x
1
,
x
2
,
.
.
.
,
x
n
x_1,x_2,...,x_n
x1,x2,...,xn
1个目标函数
z
=
c
1
x
1
+
c
2
x
2
+
.
.
.
+
c
n
x
n
z = c_1x_1+c_2x_2+...+c_nx_n
z=c1x1+c2x2+...+cnxn
m
m
m个约束
a
11
x
1
+
a
12
x
2
+
.
.
.
+
a
1
n
x
n
=
b
1
a
21
x
1
+
a
22
x
2
+
.
.
.
+
a
2
n
x
n
=
b
2
⋮
a
m
1
x
1
+
a
m
2
x
2
+
.
.
.
+
a
m
n
x
n
=
b
m
\begin{matrix} a_{11}x_1+a_{12}x_2+...+a_{1n}x_n=b_1 \\ a_{21}x_1+a_{22}x_2+...+a_{2n}x_n=b_2 \\ \vdots \\ a_{m1}x_1+a_{m2}x_2+...+a_{mn}x_n=b_m \\ \end{matrix}
a11x1+a12x2+...+a1nxn=b1a21x1+a22x2+...+a2nxn=b2⋮am1x1+am2x2+...+amnxn=bm
非负约束
x
1
≥
0
,
x
2
≥
0
,
.
.
.
,
x
n
≥
0
x_1 \ge 0,x_2 \ge 0,...,x_n\ge 0
x1≥0,x2≥0,...,xn≥0
线性规划一般形式
M
i
n
i
m
i
z
e
z
=
c
1
x
1
+
c
2
x
2
+
.
.
.
+
c
n
x
n
subject to
a
11
x
1
+
a
12
x
2
+
.
.
.
+
a
1
n
x
n
=
b
1
a
21
x
1
+
a
22
x
2
+
.
.
.
+
a
2
n
x
n
=
b
2
⋮
a
m
1
x
1
+
a
m
2
x
2
+
.
.
.
+
a
m
n
x
n
=
b
m
x
1
≥
0
,
x
2
≥
0
,
.
.
.
,
x
n
≥
0
(LP)
{\rm{Minimize}} \ z = c_1x_1+c_2x_2+...+c_nx_n \\ \text{subject to \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } \\ \\a_{11}x_1+a_{12}x_2+...+a_{1n}x_n=b_1 \\ a_{21}x_1+a_{22}x_2+...+a_{2n}x_n=b_2 \\ \vdots \\ a_{m1}x_1+a_{m2}x_2+...+a_{mn}x_n=b_m \\ x_1 \ge 0,x_2 \ge 0,...,x_n\ge 0 \tag{LP}
Minimize z=c1x1+c2x2+...+cnxnsubject to a11x1+a12x2+...+a1nxn=b1a21x1+a22x2+...+a2nxn=b2⋮am1x1+am2x2+...+amnxn=bmx1≥0,x2≥0,...,xn≥0(LP)
即,最小化一个目标函数+等于约束+非负变量
线性规划矩阵形式
为了方便表述,线性规划的向量都是列向量。
令,
c
=
(
c
1
c
2
⋮
c
n
)
\bf{c} = \begin{pmatrix} c_1\\c_2\\ \vdots\\c_n \end{pmatrix}
c=⎝⎜⎜⎜⎛c1c2⋮cn⎠⎟⎟⎟⎞
x = ( x 1 x 2 ⋮ x n ) \bf{x} = \begin{pmatrix} x_1\\x_2\\ \vdots\\x_n \end{pmatrix} x=⎝⎜⎜⎜⎛x1x2⋮xn⎠⎟⎟⎟⎞
b = ( b 1 b 2 ⋮ b n ) \bf{b} = \begin{pmatrix} b_1\\b_2\\ \vdots\\b_n \end{pmatrix} b=⎝⎜⎜⎜⎛b1b2⋮bn⎠⎟⎟⎟⎞
A
=
(
a
11
a
12
⋯
a
1
n
a
21
a
22
⋯
a
2
n
⋮
⋮
⋱
⋮
a
m
1
a
m
2
⋯
a
m
n
)
\bf{A} = \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \\ \end{pmatrix}
A=⎝⎜⎜⎜⎛a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn⎠⎟⎟⎟⎞
于是,上述的LP公式可以写成
M
i
n
c
T
x
s. t.
A
x
=
b
x
≥
0
{\rm{Min}} \ {\bf{c}}^T {\bf{x}} \\ \text{s. t. } {\bf{Ax} = \bf{b}} \ \ \ \ \ \ \ \ \\ \bf{x} \ge 0
Min cTxs. t. Ax=b x≥0
看着简洁多了,矩阵就是好啊!
简单例子(运输问题)
经典的运输问题如下图所示,有NC、OK、IO、VA四个城市提供猪肉,有NY、LA、DC三个城市需要猪肉,每吨猪肉的价格在各个城市之间的运费不同,具体如第三个矩阵所示,求一个满足需求且成本最小的分配方案。

按照线性规划的关键元素,进行建模。

最后得到一个完整的线性规划模型,如图所示

注意,上图中的等式约束是可以削减一个的,因为我们的输入数据中,供给量等于需求量,有冗余,非最简形式。因为供给等于需求,所以去掉一个约束,没送出去(没得到)的肉必然属于哪个城市。
另外,这不是一个解方程的问题,这是线性规划,7个等式,12个变量,12个非负约束
隐含假设
上述的运输问题的例子我们暂时不去求解,建模的过程包含很多假设我们先不考虑。这里说的隐含假设是指线性规划问题的隐含假设。
- 均衡假设:没有规模效应、没有折扣
- 加法假设:总=各部分之和
- 可分假设:非整数,任何小数都可接受
- 确定假设:所有的参数都是已知且确定的
转成标准型
看下面的一个线性规划的一个例子:

在这个例子中,上述式子区别于标准型,首先目标函数是最大化的,其次 x 3 x_3 x3存在绝对值,最后约束也不是等式。处理方法如下:
无约束变量处理方法
上述问题中的
x
3
x_3
x3是无约束的变量,并未出现
x
3
≥
0
x_3 \ge 0
x3≥0,处理的方法如下:
引入两个非负变量,将无约束变量看做这两个非负变量相减。
若
x
i
∈
R
x_i \in {\bf{R}}
xi∈R,令
于是,有
x
i
=
x
i
+
−
x
i
−
,
x
i
−
≥
0
,
x
i
−
≥
0
x_i = x_i^+-x_i^-, x_i^- \ge 0,x_i^-\ge 0
xi=xi+−xi−,xi−≥0,xi−≥0相当于任意两数非负数相减,结果可能是正数、负数、0。
有
∣
x
i
∣
=
x
i
+
+
x
i
−
|x_i| = x_i^++x_i^-
∣xi∣=xi++xi−相当于两个非负数相加。
但是しかし ,无约束变量处理中隐含了一个非常重要的条件,即
x
i
+
×
x
i
−
=
0
x_i^+ \times x_i^- = 0
xi+×xi−=0
因为
x
i
−
x_i^-
xi−和
x
i
−
x_i^-
xi−总有一个要为0。
不等式约束处理方法
经过上述的处理,线性规划例子变成了如下模样:

这时,引入松弛变量和剩余变量的概念。在小于等于约束中,引入松弛变量,填补小于等于的部分,转换成等式。

在大于等于约束中,引入剩余变量,减去大于等于的部分,转换成等式。

最大化目标函数处理方法
经过上述的处理,线性规划例子变成了如下模样:

现在,只剩下目标函数不对了,最大化一个问题,就等于最小化这个问题目标函数取负后的目标函数值再取负,即 M a x c T x = − M i n ( − c T x ) {\rm{Max}}\ c^T x = {-\rm{Min}}(-c^Tx) Max cTx=−Min(−cTx),原理如图所示

于是,例子中的线性规划终于转成了标准型。

处理绝对值 ∣ x i ∣ |x_i| ∣xi∣时潜在问题
- 增加了变量个数,就增加了问题的维度。
x i = x i + − x i − , x i − ≥ 0 , x i − ≥ 0 x_i = x_i^+-x_i^-, x_i^- \ge 0,x_i^-\ge 0 xi=xi+−xi−,xi−≥0,xi−≥0; ∣ x i ∣ = x i + + x i − , x i − ≥ 0 , x i − ≥ 0 |x_i| = x_i^++x_i^-, x_i^- \ge 0,x_i^-\ge 0 ∣xi∣=xi++xi−,xi−≥0,xi−≥0 - 在处理绝对值问题丢失了一个二次约束。
丢失的二次约束就是前文中的 x i + × x i − = 0 x_i^+ \times x_i^- = 0 xi+×xi−=0 - 原问题的一个解(并非某一变量值)变成了处理后问题(新问题)的多个解。
比如,原问题 x i = 5 x_i=5 xi=5,可以是新问题5-0=5得来,6-1=5得来,也可以是7-2=5得来。(产生这样的问题就是丢失了二次约束 x i + × x i − = 0 x_i^+ \times x_i^- = 0 xi+×xi−=0,这个约束让其中一个变量为0) -
∣
x
∣
|x|
∣x∣是凸的,
−
∣
x
∣
-|x|
−∣x∣是凹的。
凹函数这里出现了问题,因为 − ∣ x ∣ -|x| −∣x∣是凹函数,没有极小。
(中国大陆数学界某些机构关于函数凹凸性定义和国外的定义相反,此处为遵守方述诚教授课程中的定义,即英文convex function。详见凸函数——百度百科) - 当求
c
∣
x
∣
c|x|
c∣x∣,
c
>
0
c >0
c>0的最大化时,
m
a
x
c
∣
x
∣
{\rm{max\ }}c|x|
max c∣x∣可能会有问题。(绝对值出现在目标函数中)
求 c ∣ x ∣ c|x| c∣x∣的最大化,转换为求 − c ∣ x ∣ -c|x| −c∣x∣的最小化,若 c c c为正,则 − c ∣ x ∣ -c|x| −c∣x∣为凹函数且无极小。丢失二次约束会导致无解。
按照上述方法处理问题,举几个反例。
反例1 多个解出现
这个问题中,只有一个唯一解,最优值为-1。按照上述的方法进行转换,得到标准型如下:

反例2 单纯形法失效
求 − c ∣ x ∣ , c > 0 -c|x|,c>0 −c∣x∣,c>0的最小化问题,原问题为:

经过处理,标准型为

求这个标准型,得到解为

单纯形法失效了,不能从一个点转到另一个点再转到最优点。
这个问题,在1971年被发现并提出,原文和参考如下:

也就是说,在求max问题中目标函数出现了 c ∣ x ∣ c|x| c∣x∣,且 c > 0 c>0 c>0,上述处理失效,因为缺少那个隐藏的二次约束。1948年单纯形法提出,1971年人们才发现这个问题。