参考:最优化理论与算法(第2版)(陈宝林)
书中首先介绍了将一般线性规划问题转化为Karmarkar标准问题求解,为简化计算,Karmarkar等人又给出了内点法以求解线性规划问题,此部分在书中为*号引申内容,介绍较为简略,此处也是对书中内容做简要的补充。
考虑如下线性规划问题
max
c
T
x
s. t.
A
x
⩽
b
\begin{array}{ll} \max & \boldsymbol{c}^{\mathrm{T}} \boldsymbol{x} \\ \text { s. t. } & \boldsymbol{A} \boldsymbol{x} \leqslant \boldsymbol{b} \end{array}
max s. t. cTxAx⩽b
其中:
c
,
x
∈
R
n
\boldsymbol{c}, x \in \mathbb{R}^n
c,x∈Rn,
A
是
m
×
n
矩阵,
m
⩾
n
.
\boldsymbol{A} \text { 是 } m \times n \text {矩阵, } m \geqslant n \text {. }
A 是 m×n矩阵, m⩾n.
算法的基本思想,是从内点
x
(
0
)
\boldsymbol{x}^{(0)}
x(0) 出发,沿可行方向求出使目标函数值上升的后继点,再从得到的内点出发, 沿另一个可行方向求使目标函数值上升的内点。
将问题进行松弛:
max
c
T
x
s. t.
A
x
+
v
=
b
,
v
⩾
0.
\begin{array}{ll} \max & \boldsymbol{c}^{\mathrm{T}} \boldsymbol{x} \\ \text { s. t. } & \boldsymbol{A x}+\boldsymbol{v}=\boldsymbol{b}, \\ & \boldsymbol{v} \geqslant \mathbf{0} . \end{array}
max s. t. cTxAx+v=b,v⩾0.
对于第k轮迭代,即有
v
(
k
)
=
b
−
A
x
(
k
)
\boldsymbol{v}^{(k)}=\boldsymbol{b}-\boldsymbol{A} \boldsymbol{x}^{(k)}
v(k)=b−Ax(k)
- 随后进行Affine Scaling,这是因为:当 x k \boldsymbol{x}^k xk 是非常接近边界又不是最优解时, 步长将被迫选得非常小, 到最优解的收敛将非常慢。
- 故:若当前解 x k \boldsymbol{x}^k xk 不是很靠近 “中心”, 需要将坐标重新拉伸 (re-scale), (仿射) 变换到靠近 “中心”的位置。
- 如何定义一个可行域的中心:
若 x k = e \mathbf{x}^k=\mathbf{e} xk=e, 则
(1) x k \mathbf{x}^k xk 距离边界 1 个单位.
(2) 因此只要步长 α k < 1 \alpha^k<1 αk<1, 则可确保 x k + 1 > 0 \boldsymbol{x}^{k+1}>\mathbf{0} xk+1>0.
故可以定义对角矩阵:
D
k
=
diag
(
1
v
1
(
k
)
,
⋯
,
1
v
m
(
k
)
)
.
\boldsymbol{D}_k=\operatorname{diag}\left(\frac{1}{v_1^{(k)}}, \cdots, \frac{1}{v_m^{(k)}}\right) .
Dk=diag(v1(k)1,⋯,vm(k)1).,利用其进行Affine Scaling:
w
=
D
k
v
\boldsymbol{w}=\boldsymbol{D}_k \boldsymbol{v}
w=Dkv,原问题可进一步被写为:
max
c
⊤
x
s. t.
A
x
+
D
k
−
1
w
=
b
,
w
⩾
0.
\begin{array}{ll} \max & \boldsymbol{c}^{\top} \boldsymbol{x} \\ \text { s. t. } & \boldsymbol{A x}+\boldsymbol{D}_k^{-1} \boldsymbol{w}=\boldsymbol{b}, \\ & \boldsymbol{w} \geqslant \mathbf{0} . \end{array}
max s. t. c⊤xAx+Dk−1w=b,w⩾0.
在变换后的空间中,定义搜索方向为:
d
=
[
d
x
d
w
]
∈
R
m
+
n
d=\left[\begin{array}{l} d_x \\ d_w \end{array}\right] \in \mathbb{R}^{m+n}
d=[dxdw]∈Rm+n
代入可得:
A
(
x
+
d
x
)
+
D
k
−
1
(
w
+
d
w
)
=
b
A
x
+
D
k
−
1
w
⏟
b
+
A
d
x
+
D
k
−
1
d
w
=
b
D
k
A
d
x
+
d
w
=
0
\begin{aligned} & A(x+d_x)+D_k^{-1}\left(w+d_w\right)=b \\ & \underbrace{A x+D_k^{-1} w}_b+A d_x+D_k^{-1} d_w=b \\ & D_k A d_x+d_w=0 \end{aligned}
A(x+dx)+Dk−1(w+dw)=bb
Ax+Dk−1w+Adx+Dk−1dw=bDkAdx+dw=0
随后,为了寻找一个“好方向”,
对于满足
D
k
A
d
x
+
d
w
=
0
D_k A d_x+d_w=0
DkAdx+dw=0的任一解,有
A
T
D
k
(
D
k
A
d
x
+
d
w
)
=
0
A^{\mathrm{T}} D_k\left(D_k A d_x+d_w\right)=0
ATDk(DkAdx+dw)=0 (零空间投影)
可以得到:
d
x
=
−
(
A
⊤
D
k
2
A
)
−
1
A
⊤
D
k
d
w
.
d_x=-\left(A^{\top} D_k^2 A\right)^{-1} A^{\top} D_k d_w .
dx=−(A⊤Dk2A)−1A⊤Dkdw.
为了使
c
T
(
x
+
d
x
)
c^T(x+d_x)
cT(x+dx)最大,将上式代入
c
T
d
x
c^T d_x
cTdx得到:
c
T
d
x
=
c
T
[
−
(
A
T
D
k
2
A
)
−
1
A
T
D
k
d
w
]
=
−
[
D
k
A
(
A
T
D
k
2
A
)
−
1
c
]
T
d
w
.
\boldsymbol{c}^{\mathrm{T}} \boldsymbol{d}_x=\boldsymbol{c}^{\mathrm{T}}\left[-\left(\boldsymbol{A}^{\mathrm{T}} \boldsymbol{D}_k^2 \boldsymbol{A}\right)^{-1} \boldsymbol{A}^{\mathrm{T}} \boldsymbol{D}_k \boldsymbol{d}_w\right]=-\left[\boldsymbol{D}_k \boldsymbol{A}\left(\boldsymbol{A}^{\mathrm{T}} \boldsymbol{D}_k^2 \boldsymbol{A}\right)^{-1} \boldsymbol{c}\right]^{\mathrm{T}} \boldsymbol{d}_w .
cTdx=cT[−(ATDk2A)−1ATDkdw]=−[DkA(ATDk2A)−1c]Tdw.
为了使上式最大,需进一步确定
d
w
d_w
dw取值,即选择同方向:
d
w
=
−
D
k
A
(
A
T
D
k
2
A
)
−
1
c
.
\boldsymbol{d}_{\mathrm{w}}=-\boldsymbol{D}_k \boldsymbol{A}\left(\boldsymbol{A}^{\mathrm{T}} \boldsymbol{D}_k^2 \mathbf{A}\right)^{-1} \boldsymbol{c} .
dw=−DkA(ATDk2A)−1c.
又由于:
D
k
A
d
x
+
d
w
=
0
D_k A d_x+d_w=0
DkAdx+dw=0 可知
−
D
k
A
d
x
=
d
w
=
−
D
k
A
(
A
T
D
k
2
A
)
−
1
c
-D_k A d_x = d_w = -D_k \boldsymbol{A}\left(A^{\mathrm{T}} D_k^2 A\right)^{-1} c
−DkAdx=dw=−DkA(ATDk2A)−1c
可得到
d
x
=
(
A
T
D
k
2
A
)
−
1
c
d_x = \left(\boldsymbol{A}^{\mathrm{T}} \boldsymbol{D}_k^2 \boldsymbol{A}\right)^{-1} \boldsymbol{c}
dx=(ATDk2A)−1c
随后,将得到的
d
w
d_w
dw逆仿射:
d
v
=
D
k
−
1
d
w
=
−
A
(
A
T
D
k
2
A
)
−
1
c
=
−
A
d
x
d_v=D_k^{-1} d_w=-A\left(A^{\mathrm{T}} D_k^2 A\right)^{-1} c=-A d_x
dv=Dk−1dw=−A(ATDk2A)−1c=−Adx
故迭代更新表示为:
x
(
k
+
1
)
=
x
(
k
)
+
λ
d
x
\boldsymbol{x}^{(k+1)}=\boldsymbol{x}^{(k)}+\lambda \boldsymbol{d}_{\boldsymbol{x}}
x(k+1)=x(k)+λdx
为保证更新序列始终为内点:
A
(
x
(
k
)
+
λ
d
x
)
<
b
,
λ
A
d
x
<
b
−
A
x
(
k
)
−
λ
d
v
<
v
(
k
)
\begin{aligned} & \boldsymbol{A}\left(\boldsymbol{x}^{(k)}+\lambda \boldsymbol{d}_x\right)<\boldsymbol{b}, \\ & \lambda \boldsymbol{A} \boldsymbol{d}_x<\boldsymbol{b}-\boldsymbol{A } \boldsymbol{x}^{(k)} \\ & -\lambda \boldsymbol{d}_v<\boldsymbol{v}^{(k)} \end{aligned}
A(x(k)+λdx)<b,λAdx<b−Ax(k)−λdv<v(k)
令:
α
=
min
{
v
i
(
k
)
−
(
d
v
)
i
∣
(
d
v
)
i
<
0
,
i
∈
{
1
,
⋯
,
m
}
}
,
\alpha=\min \left\{\left.\frac{v_i^{(k)}}{-\left(d_v\right)_i} \right\rvert\,\left(d_v\right)_i<0, i \in\{1, \cdots, m\}\right\},
α=min{−(dv)ivi(k)
(dv)i<0,i∈{1,⋯,m}},
取
λ
=
γ
α
,
γ
∈
(
0
,
1
)
\lambda=\gamma\alpha ,\gamma \in(0,1)
λ=γα,γ∈(0,1)
这样即可从
x
(
k
)
x^{(k)}
x(k)出发沿方向
d
x
d_x
dx求得使
c
T
x
c^T x
cTx上升的点