序列二次规划-积极集-乘子法-过滤器-信赖域-自适应屏障混合算法进阶题
题目描述
考虑以下非线性规划问题:
\[\begin{aligned} \min_{x \in \mathbb{R}^n} \quad & f(x) = e^{x_1^2 + 2x_2^2} + (x_1 - 1)^2 \\ \text{s.t.} \quad & c_1(x) = x_1^2 + x_2^2 - 4 \le 0, \\ & c_2(x) = -\ln(x_1 + 2) + x_2^3 - 1 \le 0, \\ & c_3(x) = x_1 - 2x_2 = 0. \end{aligned} \]
其中 \(n=2\),目标函数 \(f(x)\) 非凸,包含指数和二次项;\(c_1(x)\) 为凸不等式约束(圆盘),\(c_2(x)\) 为非凸不等式约束(含对数与立方项),\(c_3(x)\) 为线性等式约束。要求设计一种混合算法,结合序列二次规划(SQP)、积极集法、乘子法、过滤器法、信赖域和自适应屏障技术,在保证全局收敛的同时高效处理非凸约束。
解题过程循序渐进讲解
1. 问题分析与算法框架
- 挑战:目标函数非凸,约束包含非凸项,传统SQP可能收敛到局部极小或遇到Maratos效应(约束违反振荡)。
- 混合策略:
- SQP框架:在每步迭代中求解二次规划子问题。
- 积极集法:动态识别起作用约束,降低子问题规模。
- 乘子法:处理等式约束,增强稳定性。
- 过滤器法:避免传统罚函数中罚参数难以选取的问题,平衡目标下降与约束违反。
- 信赖域:控制步长,保证子问题模型足够精确。
- 自适应屏障:将不等式约束转化为屏障函数,屏障参数自适应调整,避免病态。
- 整体流程:在每步迭代中,基于当前点构造拉格朗日函数,利用积极集简化约束,通过乘子法处理等式约束,用自适应屏障处理不等式约束,在信赖域内求解二次规划子问题,并用过滤器判断是否接受迭代点。
2. 算法初始化
- 初始点 \(x_0 = (0.5, 0.5)^T\),满足 \(c_3(x_0)=0\)(等式约束成立)。
- 初始拉格朗日乘子 \(\lambda_0 = (0, 0)^T\)(不等式),\(\mu_0 = 0\)(等式)。
- 初始信赖域半径 \(\Delta_0 = 1\),屏障参数 \(\tau_0 = 10\),过滤器 \(\mathcal{F} = \emptyset\)。
- 设置参数:收敛容忍度 \(\epsilon = 10^{-6}\),屏障衰减因子 \(\eta = 0.1\),信赖域更新参数 \(0 < \gamma_1 < 1 < \gamma_2\)。
3. 构造拉格朗日函数与自适应屏障变换
- 标准拉格朗日函数:
\[ L(x, \lambda, \mu) = f(x) + \lambda_1 c_1(x) + \lambda_2 c_2(x) + \mu c_3(x). \]
- 引入自适应对数屏障处理不等式约束(避免 \(c_i(x) \ge 0\)):
\[ B(x; \tau) = f(x) - \tau \sum_{i=1}^2 \ln(-c_i(x)) + \mu c_3(x). \]
这里屏障参数 \(\tau > 0\) 初始较大,随着迭代减小,使屏障函数逼近原问题。
- 自适应更新:若子问题求解成功,则 \(\tau_{k+1} = \eta \tau_k\);否则保持 \(\tau_k\) 不变。
4. 积极集识别与乘子更新
- 在当前点 \(x_k\),计算不等式约束值:
\(c_1(x_k) = x_{k1}^2 + x_{k2}^2 - 4\),\(c_2(x_k) = -\ln(x_{k1}+2) + x_{k2}^3 - 1\)。 - 积极集 \(\mathcal{A}_k = \{ i \mid c_i(x_k) \ge -\delta \}\),其中 \(\delta = 10^{-4}\) 为激活阈值。
例如:若 \(c_1(x_k) = -0.1 > -\delta\),则 \(c_1\) 处于积极边界。 - 对于等式约束 \(c_3\),乘子 \(\mu_k\) 通过乘子法更新:
\[ \mu_{k+1} = \mu_k + \rho c_3(x_k), \]
其中 \(\rho > 0\) 为惩罚参数(本例取 \(\rho=1\))。乘子法将等式约束纳入增广拉格朗日项,增强收敛稳定性。
5. 序列二次规划子问题构造
- 在 \(x_k\) 处构造二次近似子问题:
\[ \begin{aligned} \min_{d \in \mathbb{R}^n} \quad & \nabla f(x_k)^T d + \frac{1}{2} d^T H_k d \\ \text{s.t.} \quad & \nabla c_i(x_k)^T d + c_i(x_k) \le 0, \quad i \in \mathcal{A}_k, \\ & \nabla c_3(x_k)^T d + c_3(x_k) = 0, \\ & \|d\| \le \Delta_k. \end{aligned} \]
- 其中 \(H_k\) 是拉格朗日函数 \(L\) 的Hessian近似,用BFGS拟牛顿法更新:
\[ H_{k+1} = H_k + \frac{y_k y_k^T}{y_k^T s_k} - \frac{H_k s_k s_k^T H_k}{s_k^T H_k s_k}, \]
\(s_k = x_{k+1} - x_k\),\(y_k = \nabla_x L(x_{k+1}, \lambda_k, \mu_k) - \nabla_x L(x_k, \lambda_k, \mu_k)\)。
- 梯度计算示例(在 \(x_k=(0.5,0.5)\)):
\[ \nabla f = \begin{pmatrix} 2x_1 e^{x_1^2+2x_2^2} + 2(x_1-1) \\ 4x_2 e^{x_1^2+2x_2^2} \end{pmatrix}, \quad \nabla c_1 = \begin{pmatrix} 2x_1 \\ 2x_2 \end{pmatrix}, \quad \nabla c_2 = \begin{pmatrix} -\frac{1}{x_1+2} \\ 3x_2^2 \end{pmatrix}, \quad \nabla c_3 = \begin{pmatrix} 1 \\ -2 \end{pmatrix}. \]
6. 信赖域内求解子问题
- 子问题是带线性约束的二次规划,可用积极集法或内点法求解。
- 由于维数低(\(n=2\)),可直接用数值求解器(如MATLAB的
quadprog)求得步长 \(d_k\)。 - 计算实际下降量与预测下降量:
\[ \text{ared}_k = B(x_k; \tau_k) - B(x_k + d_k; \tau_k), \quad \text{pred}_k = -[\nabla f(x_k)^T d_k + \frac{1}{2} d_k^T H_k d_k]. \]
- 更新信赖域半径:
\[ \Delta_{k+1} = \begin{cases} \gamma_1 \Delta_k, & \text{if } \frac{\text{ared}_k}{\text{pred}_k} < 0.1, \\ \Delta_k, & \text{if } 0.1 \le \frac{\text{ared}_k}{\text{pred}_k} \le 0.75, \\ \gamma_2 \Delta_k, & \text{if } \frac{\text{ared}_k}{\text{pred}_k} > 0.75. \end{cases} \]
这里 \(\gamma_1=0.5, \gamma_2=2\)。
7. 过滤器判断是否接受迭代点
- 定义:\(h(x) = \sum_{i=1}^2 \max(0, c_i(x)) + |c_3(x)|\) 衡量约束违反程度。
- 当前点 \(x_k\) 对应序对 \((f(x_k), h(x_k))\)。
- 过滤器 \(\mathcal{F}\) 存储不被接受的序对:若 \((f, h)\) 被某个 \((f', h') \in \mathcal{F}\) 支配(即 \(f \ge f'\) 且 \(h \ge h'\)),则拒绝。
- 接受条件:若 \(x_k + d_k\) 满足:
- 要么 \(h(x_k+d_k) = 0\)(可行),
- 要么 \((f(x_k+d_k), h(x_k+d_k))\) 不被 \(\mathcal{F}\) 中任何点支配。
- 若接受,更新 \(x_{k+1} = x_k + d_k\),并将 \((f(x_k), h(x_k))\) 加入过滤器(若 \(h(x_k) > 0\))。
- 若拒绝,缩小信赖域 \(\Delta_k = \gamma_1 \Delta_k\) 并重新求解子问题。
8. 迭代与收敛判断
- 更新乘子 \(\lambda_i\) 对于积极不等式约束:
\[ \lambda_i^{k+1} = \max(0, \lambda_i^k + \rho c_i(x_{k+1})). \]
- 检查收敛条件:
\[ \|\nabla_x L(x_k, \lambda_k, \mu_k)\|_\infty \le \epsilon, \quad |c_3(x_k)| \le \epsilon, \quad \|\max(c_i(x_k), -\lambda_i)\|_\infty \le \epsilon. \]
- 若未收敛,返回步骤3继续迭代。
9. 示例数值迭代(前两步)
- 初始点 \(x_0=(0.5,0.5)\),计算得:
\[ f=2.117, \quad c_1=-3.5, \quad c_2 \approx -1.18, \quad c_3=0, \quad h=0. \]
积极集 \(\mathcal{A}_0 = \emptyset\)(约束远离边界)。
- 第一次迭代:
- 子问题:仅等式约束 \(d_1 - 2d_2 = 0\),目标为 \(\nabla f^T d + \frac{1}{2} d^T H_0 d\)。
- 解得 \(d_0 \approx (0.1, 0.05)\),\(\Delta_0=1\)。
- 计算得 \(\text{ared}=0.15\),\(\text{pred}=0.14\),比例 \(>0.75\),接受迭代,扩大信赖域 \(\Delta_1=2\)。
- 更新 \(x_1=(0.6,0.55)\),过滤器仍为空(因 \(h=0\))。
- 第二次迭代:
- 此时 \(c_1(x_1) \approx -3.33\),\(c_2(x_1) \approx -1.15\),仍非积极。
- 更新乘子 \(\mu_1 = \mu_0 + 1 \times c_3(x_1) = 0\)。
- 继续求解子问题,重复至收敛。
10. 算法特点与总结
- 混合优势:
- 积极集法减少计算量。
- 乘子法稳定处理等式约束。
- 过滤器避免罚参数调优,平衡目标与可行性。
- 信赖域保证模型可靠性。
- 自适应屏障温和处理不等式,避免数值病态。
- 全局收敛:在适当条件下,算法能收敛到满足KKT条件的点,即使问题非凸。
- 应用提示:此框架适合中小规模非凸问题,对于高维问题需注意Hessian近似和子问题求解效率。
通过以上步骤,该混合算法可系统求解给定非凸约束优化问题,兼具鲁棒性与效率。