内点法 (Interior-Point Methods) —— 通俗易懂详解
目录
引言为什么要用内点法?内点法的基本思路
障碍函数 (Barrier Function)中心路径 (Central Path) 算法步骤详解
原始问题与障碍问题牛顿步 (Newton Step)更新参数 t 与迭代停止条件 原-对偶内点法 (Primal-Dual Interior-Point Method)收敛性与复杂度应用示例总结
引言
在现代优化理论中,内点法 (Interior-Point Method) 已成为求解各种类型凸优化问题(尤其是线性规划 (LP)、二次规划 (QP) 和更一般的凸规划)的重要工具。与早期广为人知的单纯形法 (Simplex Method) 相比,内点法在理论复杂度和实践性能上均有非常强力的表现,常用于大规模优化场景。
传统上,解决线性规划有两大方法:
单纯形法:以顶点为迭代轨迹,在可行域的边界移动。内点法:始终保持迭代点在可行域“内部”并沿着某条“中心路径”迭代。
我们接下来将围绕内点法展开介绍,力求用通俗语言配合一些数学公式,让你对它的原理与实现有一个清晰的认识。
为什么要用内点法?
多用途:它不只适用于线性规划,还可用于二次规划、半定规划、一般凸规划等广泛应用。理论复杂度好:对于 LP 问题,内点法的多项式复杂度可保证在大规模问题中依然能够较快地找到可行解。数值稳定性高:相比单纯形法,内点法通常对噪声或病态问题表现更稳定。
形象理解:和“单纯形法”要走在“外部”边界(顶点)不同,内点法更像是在可行域内“走捷径”。一旦找到一条通往最优解的“中心路径”,就能够快速逼近最优点。
内点法的基本思路
内点法核心思想:在可行域内部引入一个“障碍函数” (Barrier Function),使得迭代点永远不会触碰到可行域的边界(即约束的边界)。借助这层障碍,一方面可避免可行域外的点,另一方面在逼近最优时,这个障碍函数也逐渐“减弱”其效力,最终能在可行域内部快速收敛到最优解。
障碍函数 (Barrier Function)
常见的障碍函数:对数障碍函数 (Log Barrier)
Φ
(
x
)
=
−
∑
i
log
(
−
h
i
(
x
)
)
,
\Phi(x) = -\sum_i \log(-h_i(x)),
Φ(x)=−i∑log(−hi(x)), 其中
h
i
(
x
)
≤
0
h_i(x) \le 0
hi(x)≤0 是约束中的不等式形式。例如,在标准 LP 问题里,若我们有
x
≥
0
x \ge 0
x≥0,则令
h
i
(
x
)
=
−
x
i
h_i(x) = -x_i
hi(x)=−xi,因为
x
i
≥
0
x_i \ge 0
xi≥0 等价于
−
x
i
≤
0
-x_i \le 0
−xi≤0。
若
x
i
x_i
xi 靠近 0,就会使
−
log
(
x
i
)
-\log(x_i)
−log(xi) 项无限逼近正无穷,逼着解不能“碰到” 0。如果
x
i
x_i
xi 保持远离 0,则
−
log
(
x
i
)
-\log(x_i)
−log(xi) 值不会太大,相当于“障碍”较弱。
中心路径 (Central Path)
在内点法中,我们往往将原始的目标函数
f
(
x
)
f(x)
f(x) 加上一个“加权”后的障碍函数。例如,考虑标准形式的线性规划问题:
min
c
T
x
subject to
A
x
=
b
,
x
≥
0.
\begin{aligned} \min \quad & c^T x \\ \text{subject to} \quad & Ax = b, \\ & x \ge 0. \end{aligned}
minsubject tocTxAx=b,x≥0.
引入正参数
t
>
0
t>0
t>0,构造下面的“障碍子问题”:
min
x
t
c
T
x
−
∑
i
=
1
n
log
(
x
i
)
subject to
A
x
=
b
,
x
>
0.
\min_x \quad t \, c^T x - \sum_{i=1}^n \log(x_i) \quad \text{subject to} \quad Ax = b, \; x > 0.
xmintcTx−i=1∑nlog(xi)subject toAx=b,x>0.
在这个问题中,“
−
∑
log
(
x
i
)
-\sum \log(x_i)
−∑log(xi)”就是障碍函数部分。如果我们在解这个子问题时不断地增加
t
t
t,就得到了一条“中心路径”。当
t
→
∞
t \to \infty
t→∞ 时,解会越来越逼近原始问题的最优解,同时又不会违反
x
≥
0
x \ge 0
x≥0 的约束(因为障碍函数不允许
x
i
=
0
x_i = 0
xi=0)。
算法步骤详解
原始问题与障碍问题
原始问题 (Primal Problem) 以最常见的线性规划标准形式举例:
min
c
T
x
subject to
A
x
=
b
,
x
≥
0.
\begin{aligned} \min \quad & c^T x \\ \text{subject to} \quad & Ax = b, \\ & x \ge 0. \end{aligned}
minsubject tocTxAx=b,x≥0.
障碍问题 (Barrier Problem) 对每个不等式约束引入对数障碍,使之成为
min
x
t
c
T
x
+
Φ
(
x
)
,
where
Φ
(
x
)
=
−
∑
i
=
1
n
log
(
x
i
)
.
\min_x \quad t \, c^T x + \Phi(x), \quad \text{where} \quad \Phi(x) = -\sum_{i=1}^n \log(x_i).
xmintcTx+Φ(x),whereΦ(x)=−i=1∑nlog(xi). 同时保留线性等式约束
A
x
=
b
Ax = b
Ax=b。这里
t
t
t 是一个权重系数,越大就越“逼近”原始目标函数,越小就“更关心”可行域的内部位置。
中心路径 当
t
t
t 从小到大增加时,我们就能得到一系列可行解,这些解就构成了“中心路径 (Central Path)”。当
t
t
t 在算法中迭代增大到非常大时,对应的解将非常接近原始问题的最优解。
牛顿步 (Newton Step)
要解这个障碍问题,常用的做法就是采用牛顿法对上面构造的拉格朗日函数或直接对目标函数进行二阶近似来迭代。 举例:上面子问题的目标函数可表示为
f
t
(
x
)
=
t
c
T
x
−
∑
i
=
1
n
log
(
x
i
)
,
f_t(x) = t \, c^T x - \sum_{i=1}^n \log(x_i),
ft(x)=tcTx−i=1∑nlog(xi), 再加上等式约束
A
x
=
b
Ax = b
Ax=b。我们可以用拉格朗日乘子
ν
\nu
ν 处理等式约束、将其组合进目标,然后求解一阶条件、二阶条件,寻找牛顿步。
梯度 (Gradient)
∇
f
t
(
x
)
=
t
c
−
∑
i
=
1
n
1
x
i
e
i
=
t
c
−
X
−
1
1
,
\nabla f_t(x) = t \, c - \sum_{i=1}^n \frac{1}{x_i} e_i = t \, c - X^{-1}\mathbf{1},
∇ft(x)=tc−i=1∑nxi1ei=tc−X−11, 其中
X
−
1
1
X^{-1}\mathbf{1}
X−11 表示向量
(
1
x
1
,
1
x
2
,
…
)
T
\left(\frac{1}{x_1}, \frac{1}{x_2}, \dots\right)^T
(x11,x21,…)T,
e
i
e_i
ei 是第
i
i
i 个标准基向量。
Hessian (二阶导)
∇
2
f
t
(
x
)
=
diag
(
1
x
i
2
)
=
X
−
2
.
\nabla^2 f_t(x) = \text{diag}\bigl(\frac{1}{x_i^2}\bigr) = X^{-2}.
∇2ft(x)=diag(xi21)=X−2.
牛顿方向的求解 当要满足
A
x
=
b
Ax = b
Ax=b 的等式约束时,需要把这个约束纳入系统一并求解。典型地可以写成一个 KKT 系统,然后迭代解出
(
Δ
x
,
Δ
ν
)
(\Delta x, \Delta \nu)
(Δx,Δν)。 简化来说,其形式常见于:
(
X
−
2
A
T
A
0
)
(
Δ
x
Δ
ν
)
=
(
…
…
)
.
\begin{pmatrix} X^{-2} & A^T \\ A & 0 \end{pmatrix} \begin{pmatrix} \Delta x \\ \Delta \nu \end{pmatrix}= \begin{pmatrix} \dots \\ \dots \end{pmatrix}.
(X−2AAT0)(ΔxΔν)=(……). 解出
Δ
x
\Delta x
Δx 后,更新:
x
new
=
x
old
+
α
Δ
x
,
x_{\text{new}} = x_{\text{old}} + \alpha \, \Delta x,
xnew=xold+αΔx, 其中
α
\alpha
α 为步长,往往通过线搜索 (Line Search) 或某些启发式方法保证更新后仍在可行域内(如
x
i
>
0
x_i > 0
xi>0)。
更新参数 t 与迭代停止条件
整体外层循环会在
{
t
=
t
(
1
)
,
t
(
2
)
,
…
}
\{ t = t^{(1)}, t^{(2)}, \ldots \}
{t=t(1),t(2),…} 上迭代增大
t
t
t 的值,比如以几何倍数增加(如
t
←
μ
⋅
t
t \leftarrow \mu \cdot t
t←μ⋅t)。每个固定
t
t
t 时使用牛顿法求解
min
x
t
c
T
x
+
Φ
(
x
)
,
subject to
A
x
=
b
.
\min_x \; t c^T x + \Phi(x), \quad \text{subject to } Ax = b.
xmintcTx+Φ(x),subject to Ax=b. 当
∥
r
dual
(
x
)
∥
\|r_{\text{dual}}(x)\|
∥rdual(x)∥ 或
∥
r
cent
(
x
)
∥
\|r_{\text{cent}}(x)\|
∥rcent(x)∥(牛顿方程的残差)足够小,或者目标的变化量低于一定阈值,就认为在该
t
t
t 下的子问题近似求解完毕,再增大
t
t
t。最后,当
t
t
t 非常大时,我们就能得到近似的最优解。
原-对偶内点法 (Primal-Dual Interior-Point Method)
在实践中,原-对偶内点法是最常用、效率更高的一种内点法变种。它同时考虑原问题 (Primal) 和对偶问题 (Dual),并通过在可行域内进行迭代来满足原、对偶可行性及互补松弛条件 (complementary slackness)。此方法在一步迭代中同时更新原变量
x
x
x、对偶变量
λ
,
ν
\lambda, \nu
λ,ν 等,使得整体收敛速度更快,更能针对问题的结构进行数值优化。
基本流程与前面 Barrier Method 类似,但把原问题、对偶问题、互补条件都一起打包成 KKT 系统求解,逐步逼近最优解。
收敛性与复杂度
内点法在理论上具有多项式时间复杂度。对于线性规划问题,经典结果表明内点法能在
O
(
n
log
(
1
/
ϵ
)
)
O\bigl(\sqrt{n}\log(1/\epsilon)\bigr)
O(n
log(1/ϵ)) 或类似数量级的迭代步内达到
ϵ
\epsilon
ϵ-最优解,这在大规模问题中非常重要。
与单纯形法比较:单纯形法在最坏情况下可能有指数复杂度,然而在实践中 often 非常高效;内点法在大规模场景下趋于表现稳定且平均效率较高。算法实现细节:由于每一步都要解一个规模为
n
×
n
n \times n
n×n 的线性方程组(或者
(
n
+
m
)
×
(
n
+
m
)
(n+m)\times(n+m)
(n+m)×(n+m) 的 KKT 系统),对大规模问题而言,数值线性代数和稀疏矩阵技术的运用就显得极其关键。
应用示例
线性规划 (Linear Programming):最常见,很多 LP 求解器(如 IBM CPLEX、Gurobi 等)内部均实现了高效原-对偶内点法。二次规划 (Quadratic Programming):只要目标函数是二次凸,仍可用内点法来处理二次项;实现时只需根据 Hessian 做相应的修正。半定规划 (Semidefinite Programming):内点法也可推广到矩阵变元维度,对正定性、半定性约束进行处理,广泛用于信号处理、控制、机器学习等领域。广义凸规划:只要能构造合适的障碍函数,并能用牛顿法处理,内点法思路就能适用。