Skip to content

返回学习路线

约束数值优化:同一问题的六条求解路线 ​

任务与验收目标 ​

一个二维设计变量 z=(x,y) 希望靠近目标 (2,1),但总资源最多为二,两个变量都不能为负:

minf(z)=12[(x−2)2+(y−1)2],Az≤b,A=(−100−111),b=(002).

请分别执行活跃集、二次罚、精确 ℓ1 罚、增广乘子、对数障碍和原始—对偶内点路线。所有方法都对照同一个最优点、同一组约束符号,并说明自己的有限轮输出有什么证书。最后,把线性资源边界替换成圆约束,检验一次 SQP;再用一个非凸四次目标检查信赖域的拒绝规则及截断 CG 的边界。

完成任务的标准是:能列出真正求解的子问题,复算每个候选与参数,分别核验原始可行性、驻点、乘子符号和互补量。目标值较小却不可行的点不算成功;内层方程解得很准也不能替代原问题证书。

先建立所有路线共用的最优答案 ​

取

z∗=(3/2,1/2),λ∗=(0,0,1/2),f∗=1/4.

松弛为 s∗=b−Az∗=(3/2,1/2,0),故可行;λ∗≥0 且 s∗Tλ∗=0。同时

∇f(z∗)=(−1/2,−1/2)T,ATλ∗=(1/2,1/2)T.

驻点成立,严格凸性使它成为唯一全局解。还可以完全展开:对任意可行 z,

f(z)−f∗=12‖z−z∗‖2+12(2−x−y)≥0.

这个恒等式是无需任何求解器的独立证书。它也说明答案在斜边内部,枚举三个顶点不能解决这项二次规划。

路线一:活跃集在可行域里找正确的面 ​

沿活跃集法,从 (0,0) 和工作集 W={1,2} 开始。工作方向由 p+∇f+AWTν=0,AWp=0 决定。

当前点 工作集 方向或乘子 本轮动作
(0,0) {1,2} p=0,ν=(−2,−1) 删除约束一
(0,0) {2} p=(2,0) 比值一,到 (2,0) 并加入约束三
(2,0) {2,3} p=0,ν2=−1,ν3=0 删除约束二
(2,0) {3} p=(−1/2,1/2) 完整步到 (3/2,1/2)
(3/2,1/2) {3} p=0,ν3=1/2 KKT 终止

移动时目标依次是 5/2,1/2,1/4,始终原始可行。两次删除只改变工作假设,不改变点的位置。最终乘子非负才允许终止,不能在第一个零方向就退出。

路线二:二次罚从不可行侧逼近 ​

对全部三条约束加入正部平方罚:

Qμ(z)=f(z)+μ2[max(−x,0)2+max(−y,0)2+max(x+y−2,0)2].

候选将落在 x,y>0,x+y>2 区域,所以只需考虑最后一项。令 r=x+y−2,驻点给出 x=2−μr,y=1−μr,于是

rμ=11+2μ,ℓμ=μrμ,zμ=(2−ℓμ,1−ℓμ).

解出的点确实满足假设的三个符号,所以也是整个严格凸罚目标的唯一最小点。罚乘子估计为 (0,0,ℓμ),原驻点残差精确为零;原始违约却为 rμ。局部 Hessian 特征值是一与 1+2μ。

μ zμ 最大违约 Hessian 条件数
1 (5/3,2/3) 1/3 3
10 (32/21,11/21) 1/21 21
100 (302/201,101/201) 1/201 201

这里 f(zμ)=ℓμ2<1/4。目标比最优值还低并不矛盾,因为点在可行域之外。二次罚的验收要看违约与驻点两项,不能按原目标大小排出“比最优还好”的结果。

路线三:有限 ℓ1 罚率就得到原解 ​

令

Pρ(z)=f(z)+ρ[max(−x,0)+max(−y,0)+max(x+y−2,0)].

最优乘子的最大分量是 1/2。由精确罚定理,任取 ρ>1/2,例如一,罚目标的唯一最小点就是 z∗。

也能直接核验尖角。z∗ 的前两条约束严格松弛,罚次梯度为零;第三条在零处允许取 θ(1,1)、0≤θ≤1。选 θ=1/2,恰好抵消 (−1/2,−1/2),故零在罚目标次微分中。严格凸性保证唯一性。

作为边界对照,取 ρ=1/4,不可行区域的唯一驻点是 (7/4,3/4),违约为 1/2,仍未恢复原解。有限精确罚率不意味着粗糙的内层近似也会恰好可行;它描述的是精确最小点。

路线四:乘子保存历史,罚率保持一 ​

不等式可写成 gi(z)+ui=0,ui≥0。对这些等式使用增广乘子法,再把 ui 精确消去,就得到不等式增广函数

Lρ(z,λ)=f(z)+12ρ∑i[max(0,λi+ρgi(z))2−λi2],

以及投影乘子更新 λi+=max(0,λi+ρgi(z+))。消元来自在 ui≥0 上最小化一个关于 gi+ui+λi/ρ 的平方;因此不等式乘子自然保持非负。

取 ρ=1,λ0=0。本例每个联合最小点都满足 x,y>0,前两条罚项与乘子为零。只需保存第三个乘子 ℓk:

ℓk+1=ℓk+13,zk+1=(2−ℓk+1,1−ℓk+1),ℓk=12(1−3−k).
k zk ℓk xk+yk−2
1 (5/3,2/3) 1/3 1/3
2 (14/9,5/9) 4/9 1/9
3 (41/27,14/27) 13/27 1/27
4 (122/81,41/81) 40/81 1/81

内层 Hessian 始终具有特征值一和三。与路线二相比,减少违约靠的是乘子变化,计算矩阵的曲率比没有不断上升。有限轮点仍不可行,虽然每轮新乘子下的驻点残差已为零。

路线五:障碍点始终留在三角形内部 ​

取

minz tf(z)−log⁡x−log⁡y−log⁡(2−x−y).

给每个 t 用阻尼 Newton 求中心点,初值 (1/2,1/2),先保三项松弛严格正,再作 Armijo 回溯。若 s=b−Az,梯度和 Hessian 分别为

G=t(z−(2,1))+ATs−1,B=tI+ATdiag(s−2)A.

逆与幂在这里逐分量计算。脚本从原式组装它们,独立于下一节的原始—对偶求解。

t 中心点 (x,y) 原目标 精确中心的间隙 3/t
1 (0.941987,0.586226) 0.645301 3
4 (1.229778,0.513420) 0.415001 0.75
16 (1.409449,0.492110) 0.303352 0.1875
64 (1.474956,0.495873) 0.264908 0.046875

定义 λi=1/(tsi),在中心点就有 z−(2,1)+ATλ=0。本 QP 的对偶函数可直接配方求出:

d(λ)=λT(A(2,1)T−b)−12‖ATλ‖2,λ≥0.

于是 f(z)−d(λ)=sTλ=3/t。表中的浮点中心另行检查驻点残差,最大约 6.3×10−13,并重算真实目标差,不能只把理论 3/t 填入验收栏。中心路径给的是原始上界与对偶下界,它和不可行罚点拥有不同的证书。

路线六:原始—对偶内点直接同时修正三组条件 ​

本节仍解同一个 QP,采用 g(z)=Az−b、s=b−Az。从

z0=(1/2,1/2),s0=(1/2,1/2,1),λ0=(1/2,3/2,2)

出发,已经满足 Az+s=b 与 z−(2,1)+ATλ=0,且松弛和乘子均严格正。间隙为三,平均互补量 μ=1。

令 σ=1/5,每轮解

(I0ATAI00ΛS)(ΔzΔsΔλ)=−(rdrpSλ−σμ1),

其中 rd=z−(2,1)+ATλ,rp=Az+s−b。第一轮得到

Δz=(11/25,−3/100),Δs=(11/25,−3/100,−41/100),Δλ=(−27/50,−101/100,−49/50).

乘子第一项最先触零,边界比值为 25/27。取边界比值的 9/10,即 α=5/6,新点为

z1=(13/15,19/40),s1=(13/15,19/40,79/120),λ1=(1/20,79/120,71/60).

原始等式与驻点仍精确成立,所有需要保正的分量均正。实际间隙不是预设的 3σ,而是

(s1)Tλ1=32692880≈1.135069.

脚本继续使用同一中心化与保正规则,并在必要时回溯到实际间隙满足 gap+≤(1−0.1α)gap。本例得到:

轮数 (x,y) 原始目标 对偶下界 实际间隙
0 (0.5,0.5) 1.25 −1.75 3
1 (0.866667,0.475000) 0.780035 −0.355035 1.135069
2 (1.238733,0.437626) 0.447895 −0.009754 0.457650
4 (1.467899,0.483627) 0.274886 0.226207 0.048679
8 (1.499820,0.499960) 0.250110 0.249790 0.000320
18 (1.499999999474,0.499999999895) 0.250000000316 0.249999999368 9.47×10−10

每一轮都重算两组等式残差、正性和 f−d=sTλ,故最后一行确实认证原目标误差小于 10−9。这与不可行初值的 LP 算例不同:若原始或驻点等式不满足,互补量就不能直接代替上下界之差。

曲线约束加试:SQP 的线性化误差 ​

改求 F(x,y)=(x−2)2+y2,约束 c=x2+y2−1=0。在 z0=(3/5,4/5),λ0=1/5,Lagrangian Hessian 为 (12/5)I,QP 给出

p=(16/15,−4/5),Jcp=0.

由单位圆的展开,c(z0+αp)=16α2/9。完整步虽然使 F 降到 1/9,在 Φ=F+2|c| 下却从 13/5 升到 11/3。半步给出 (17/15,2/5),真实违约为 4/9,Φ=9/5,通过系数 0.1 的 Armijo 条件。

验收时应同时写出“QP 线性化误差为零”和“真实约束误差为 4/9”。前者不能覆盖后者。SQP下一轮重新线性化,正是为了继续处理这份曲率造成的偏离。

非凸加试:信赖域与截断 CG 各自负责什么 ​

取 h(x)=x4−2x2+x,在零点使用模型 m(p)=p−2p2。半径二时最优候选 p=−2 的预测下降是十,真实下降却为负六,因此拒绝并缩半径;半径一时 p=−1 的预测下降三、实际下降二,故比值为 2/3,可以接受。外层检验的是真实函数,不是模型自己是否解得漂亮。

对内层不定模型 H=diag(−2,1),g=(0,1),Δ=1,完整子问题的解为 (±8/3,−1/3),模型值 −7/6。零启动截断 CG只探索第二坐标轴,返回 (0,−1)、值 −1/2。它有 Cauchy 下降,却没有发现未被梯度激发的负曲率方向。

因此三份结论要各自验收:内层是否达到所需下降,外层是否真的降低目标,最终是否达到要求的一阶或二阶条件。一个局部数值方法返回的驻点,不能靠“全局化”三个字变成非凸全局最优解。

复现与逐项验收 ​

下载 Python 核验脚本,需要 Python 3 与 NumPy。运行后生成逐项结果 JSON;查看本次核验结果。脚本既执行活跃集和内点迭代,也独立核对闭式罚解、乘子递推、SQP 有理数和信赖域证书。

  • 活跃集:五次状态检查后到达 (3/2,1/2),全过程可行,终止乘子非负
  • 二次罚:有限参数有残差 1/(1+2μ),同时报告条件数 1+2μ
  • 精确罚:给出乘子阈值、尖角次梯度和低于阈值的不可行对照
  • 增广乘子:固定罚率一,残差按 3−k 减少,明确有限轮仍有违约
  • 障碍:所有松弛正,中心残差小,使用实际对偶值复核 3/t
  • 原始—对偶:三组条件分别检查,最后实际间隙小于 10−9
  • SQP 与信赖域:验收基于真实函数与真实约束,区分模型解、允许步及最终证书

进一步阅读 ​