线性规划问题建模的重要性
大家在对实际问题按照线性规划建模时,有没有因为一些特殊的变量或者约束而束手无策。例如目标函数是个求最大最小值问题,变量带绝对值符号,约束条件只能二选一。这篇文章介绍的建模技巧,让你轻松地将上述棘手难题转换为线性规划问题。
流程图
现实生活中,有很多问题可以描述成优化问题,然后利用运筹优化的知识加以解决。它们通常遵循以下流程:
可以看出,比较核心的两个步骤是:建模(modeling)和求解(solve)。
对于现在有很多成熟的软件或者工具包,可以求解线性规划问题。比如,lingo, cplex, gurobi, glpk,lpsolve, scip,matlab optimization toolbox等。
实际问题成千上万万,它们的约束、目标等各不相同。如何对实际问题建模,并将它归结为一个线性规划问题,是应用线性规划求解问题时最重要,往往也是最困难的一步。问题建模是否合理,很大程度上会影响到后续的模型求解过程。
但是,受限于实际问题特征、建模经验、建模技巧等因素,我们在对问题建立初步模型之后,目标函数和约束条件往往包含一些特殊约束或者特殊变量:
含有绝对值。比如,LASSO回归是L1范数回归,目标函数包含绝对值
m
i
n
β
1
N
∑
i
=
1
n
(
y
i
−
x
i
)
2
+
λ
∥
β
∥
1
min_\beta \quad \frac{1}{N} \displaystyle\sum_{i=1}^n(y_i-x_i)^2+\lambda\Vert\beta\Vert_1
minβN1i=1∑n(yi−xi)2+λ∥β∥1
含有最大(最小)值。比如,风险决策涉及的最小机会损失准则( min-max),也称最小最大后悔准则。
二选一约束。比如,同时生产两种产品A和B,产量分别为x和y,要么采用高负荷生产,满足2x+3y<=100,要么采用低负荷生产,x+y>
其他特殊约束或变量。
对于上述含有特殊约束或者特殊变量的问题,尽管看起来不是线性规划问题,但是通过一些建模技巧,可以将它们转化成线性规划问题。
含有绝对值的建模
比如,有如下规划问题
m
i
n
∥
X
∥
1
=
∑
i
=
1
n
∣
x
i
∣
A
X
≤
b
min \quad \Vert X\Vert_1= \displaystyle\sum_{i=1}^n\vert x_i\vert \\AX\le b
min∥X∥1=i=1∑n∣xi∣AX≤b
为了将其转化为线性规划问题,引入两个新的非负向量u和v,满足以下条件:
{
∣
x
i
∣
=
u
i
+
v
i
x
i
=
u
i
−
v
i
u
i
≥
0
,
v
i
≥
0
\begin{cases} \vert x_i \vert = u_i+v_i \\ x_i=u_i-v_i\\ u_i \ge0,v_i\ge0 \end{cases}
⎩⎪⎨⎪⎧∣xi∣=ui+vixi=ui−viui≥0,vi≥0
上述规划问题就转化为如下线性规划问题:
∑
i
=
1
n
(
u
i
+
v
i
)
s
.
t
.
{
A
(
u
−
v
)
≤
b
u
≥
0
,
v
≥
0
\displaystyle\sum_{i=1}^n (u_i+v_i) \\ s.t.\begin{cases} A(u-v)\le b \\ u \ge 0,v\ge 0 \end{cases}
i=1∑n(ui+vi)s.t.{A(u−v)≤bu≥0,v≥0
含有最大(最小)值的建模
比如,有如下规划问题:
m
i
n
X
m
i
n
Y
(
a
X
+
b
Y
)
\underset{X}{min}\underset{Y}{min}(aX+bY)
XminYmin(aX+bY)
为了将其转化为线性规划问题,引入新的变量u,满足以下条件:
u
=
m
a
x
Y
(
a
X
+
b
Y
)
  
⟺
  
a
X
+
b
Y
≤
u
u= {max \atop Y}(aX+bY)\iff aX+bY \le u
u=Ymax(aX+bY)⟺aX+bY≤u
上述规划问题就转化为如下线性规划问题:
s
.
t
.
a
X
+
b
Y
≤
u
s.t. \space aX+bY \le u
s.t. aX+bY≤u
二选一约束的建模
比如,有如下约束:
该约束实际上是一个二选一约束,为了将其转换为线性约束。引入一个0-1变量z和一个充分大的数M(大M法):
2
x
+
3
y
≤
100
o
r
x
+
y
≤
50
  
⟺
  
{
2
x
+
3
y
≤
100
+
z
M
x
+
y
≤
50
+
(
1
−
z
)
M
z
∈
{
0
,
1
}
2x+3y \le 100 \space or \space x+y \le 50 \iff \begin{cases} 2x+3y \le 100+zM \\ x+y \le 50+(1-z)M\\ z \in \{0,1\} \end{cases}
2x+3y≤100 or x+y≤50⟺⎩⎪⎨⎪⎧2x+3y≤100+zMx+y≤50+(1−z)Mz∈{0,1}
多选多约束的建模
比如,有如下3个约束,要满足其中2个约束:
该约束实际上是一个3选2约束,为了将其转换为线性约束,引入3个0-1变量z和一个充分大的数M(大M法):
2
x
+
3
y
≤
100
o
r
x
+
y
≤
50
o
r
x
+
2
y
≤
80
2x+3y \le 100 \space or \space x+y \le 50 \space or \space x+2y \le 80
2x+3y≤100 or x+y≤50 or x+2y≤80
  
⟺
  
{
2
x
+
3
y
≤
100
+
z
1
M
x
+
y
≤
50
+
z
2
M
x
+
2
y
≤
80
+
z
3
M
z
1
+
z
2
+
z
3
=
2
z
1
,
z
2
,
z
3
∈
{
0
,
1
}
\iff \begin{cases} 2x+3y \le 100 +z_1 M\\ x+y \le 50+z_2M \\ x+2y \le 80+z_3M\\ z_1+z_2+z_3=2\\ z_1,z_2,z_3 \in \{0,1\} \end{cases}
⟺⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧2x+3y≤100+z1Mx+y≤50+z2Mx+2y≤80+z3Mz1+z2+z3=2z1,z2,z3∈{0,1}
固定成本约束的建模
在库存问题中,通常考虑订货的固定成本和可变成本。就是说,只要订货x>0,就有一个固定成本k,和可变成本cx,它的成本函数就是:
z
(
x
)
=
{
0
,
x
=
0
c
x
+
k
,
x
>
0
z(x) = \begin{cases} 0,x=0\\ cx+k,x \gt 0 \end{cases}
z(x)={0,x=0cx+k,x>0
该约束实际上是一个二选一约束,为了将其转换为线性约束。引入一个0-1变量y和一个充分大的数M(大M法):
z
(
x
)
=
{
0
,
x
=
0
c
x
+
k
,
x
>
0
  
⟺
  
z
(
x
)
=
c
x
+
k
y
s
.
t
.
x
≤
y
M
z(x) = \begin{cases} 0,x=0\\ cx+k,x \gt 0 \end{cases} \iff z(x)=cx+ky \space \space s.t. x \le yM
z(x)={0,x=0cx+k,x>0⟺z(x)=cx+ky s.t.x≤yM
分段线性函数的建模
比如,在现实生活中,购买商品的数量越多,它的单价会有折扣。在数学中,它的一个成本或者利润函数就可以表示成如下的分段线性函数:
z
=
{
3
+
4
x
f
o
r
0
≤
x
≤
2
15
−
2
x
f
o
r
2
≤
x
≤
3
6
+
x
f
o
r
3
≤
x
≤
7
z= \begin{cases}3+4x \space for \space 0 \le x \le 2 \\ 15-2x \space for \space 2 \le x \le 3 \\ 6+x \space for \space 3 \le x \le 7 \end{cases}
z=⎩⎪⎨⎪⎧3+4x for 0≤x≤215−2x for 2≤x≤36+x for 3≤x≤7
对于分段线性函数,可以通过引入SOS2约束(a special order set (SOS) constraint of type 2),将其转换为线性规划。以下是一种比较通用的建模技巧。
设一个n段线性函数
f
(
x
)
f(x)
f(x)的分点为
b
1
≤
.
.
.
≤
b
n
≤
b
n
+
1
b_1\le...\le b_n \le b_{n+1}
b1≤...≤bn≤bn+1,引入
w
k
w_k
wk将
x
x
x和
f
(
x
)
f(x)
f(x)表示为
x
=
∑
k
=
1
n
+
1
w
k
b
k
f
(
x
k
)
=
∑
k
=
1
n
+
1
w
k
f
(
b
k
)
x=\sum_{k=1}^{n+1}w_kb_k\\ f(x_k)=\sum_{k=1}^{n+1}w_kf(b_k)
x=k=1∑n+1wkbkf(xk)=k=1∑n+1wkf(bk)
w
k
w_k
wk和0-1变量
z
k
z_k
zk满足
w
1
≤
z
1
,
w
2
≤
z
1
+
z
2
,
.
.
.
w
n
≤
z
n
−
1
+
z
n
,
w
n
+
1
≤
z
n
w_1 \le z_1,w_2 \le z_1+z_2,...w_n \le z_{n-1}+z_n,w_{n+1} \le z_n
w1≤z1,w2≤z1+z2,...wn≤zn−1+zn,wn+1≤zn
z
1
+
z
2
+
.
.
.
+
z
n
=
1
,
z
k
=
0
或
1
z_1+z_2+...+z_n=1,z_k=0或1
z1+z2+...+zn=1,zk=0或1
w
1
+
w
2
+
.
.
.
+
w
n
+
1
=
1
,
w
k
≥
0
(
k
=
1
,
2
,
.
.
.
,
n
+
1
)
w_1+w_2+...+w_{n+1}=1,w_k \ge 0(k=1,2,...,n+1)
w1+w2+...+wn+1=1,wk≥0(k=1,2,...,n+1)
事实上,像CPLEX、LP_SOLVE等solver,已经支持直接对分段线性函数建模,不需要建模人员将其进行线性转换。
https://www.360kuai.com/mob/transcoding?url=932d3fbb3daf6942d&cota=4&kuai_so=1&sign=360_e39369d1
参考资料
[1] Special Ordered Sets (SOS)
http://lpsolve.sourceforge.net/5.1/SOS.htm
[2] Modeling piecewise linear functions
http://homepages.rpi.edu/~mitchj/handouts/ piecewise/
[3] Matlab随笔之分段线性函数化为线性规划
https://blog.csdn.net/weixin_34269583/article/details/86014299
[4] Piecewise Linearity in CPLEX
https://www.ibm.com/support/knowledgecenter/SSSA5P_12.6.1/ilog.odms.cplex.h