非线性规划中的内点反射共轭梯度法基础题
字数 3529 2025-12-11 14:30:04
非线性规划中的内点反射共轭梯度法基础题
题目描述:
考虑一个简单的非线性规划问题:
最小化目标函数 \(f(x) = x_1^2 + 2x_2^2 - 2x_1x_2 + e^{x_1 + x_2}\),
约束条件为:
- \(x_1 + 2x_2 \ge 1\),
- \(x_1^2 + x_2^2 \le 4\),
- \(x_1, x_2 > 0\)(严格为正,这是内点法的要求)。
要求使用内点反射共轭梯度法求解该问题,从初始点 \((x_1, x_2) = (1, 1)\) 开始,计算其迭代过程,解释如何结合内点法、反射技巧和共轭梯度法来处理约束和优化目标。
解题过程:
步骤1:理解问题与算法框架
- 这是一个带不等式约束的非线性规划问题,有两个决策变量 \(x_1, x_2\)。
- 目标函数 \(f(x)\) 是非线性的(包含二次项和指数项)。
- 约束包括线性不等式(\(x_1 + 2x_2 \ge 1\))、非线性不等式(\(x_1^2 + x_2^2 \le 4\))和变量非负约束(\(x_1, x_2 > 0\))。
- 内点反射共轭梯度法是一种混合算法:
- 内点法:通过在约束边界引入障碍函数,将约束问题转化为一系列无约束子问题,并保持迭代点严格在可行域内部。
- 反射技巧:当迭代点靠近边界时,通过镜像反射调整搜索方向,避免过早碰壁,提高收敛效率。
- 共轭梯度法:用于求解每个子问题的无约束优化,利用共轭方向加速收敛。
步骤2:构造障碍函数,转化为无约束子问题
- 内点法通过添加障碍项来惩罚靠近边界的点,使迭代始终保持在可行域内部。对于本问题:
- 约束 \(x_1 + 2x_2 \ge 1\) 可写为 \(1 - x_1 - 2x_2 \le 0\),障碍项为 \(-\mu \log(x_1 + 2x_2 - 1)\)(其中 \(\mu > 0\) 是障碍参数)。
- 约束 \(x_1^2 + x_2^2 \le 4\) 的障碍项为 \(-\mu \log(4 - x_1^2 - x_2^2)\)。
- 变量非负约束 \(x_1, x_2 > 0\) 的障碍项为 \(-\mu \log(x_1) -\mu \log(x_2)\)。
- 子问题的目标函数为:
\[ \Phi(x, \mu) = f(x) - \mu \left[ \log(x_1 + 2x_2 - 1) + \log(4 - x_1^2 - x_2^2) + \log(x_1) + \log(x_2) \right] \]
- 算法从较大的 \(\mu\) 开始,逐步减小 \(\mu \to 0\),使得子问题的解逼近原问题的最优解。
步骤3:初始点与可行性检查
- 给定初始点 \((1, 1)\):
- 检查约束:\(1 + 2\cdot1 = 3 \ge 1\)(满足);\(1^2 + 1^2 = 2 \le 4\)(满足);\(x_1, x_2 > 0\)(满足)。
- 该点严格可行,可以作为内点法的起始点。
步骤4:在子问题上应用共轭梯度法(以第一个子问题 \(\mu = 1\) 为例)
- 对 \(\Phi(x, \mu)\) 执行共轭梯度法迭代:
- 4.1 计算梯度:
- 目标函数梯度:\(\nabla f = [2x_1 - 2x_2 + e^{x_1+x_2}, 4x_2 - 2x_1 + e^{x_1+x_2}]^T\)。
- 障碍项梯度:例如,对 \(-\mu \log(x_1 + 2x_2 - 1)\),其梯度为 \([-\mu/(x_1 + 2x_2 - 1), -2\mu/(x_1 + 2x_2 - 1)]^T\)。
- 完整梯度 \(\nabla \Phi\) 是各部分的叠加,在 \((1,1)\) 处可具体计算数值。
- 4.2 初始化共轭梯度法:
- 初始搜索方向 \(d_0 = -\nabla \Phi(x_0)\)(最速下降方向)。
- 迭代公式:\(x_{k+1} = x_k + \alpha_k d_k\),其中 \(\alpha_k\) 通过线搜索(如Armijo规则)确定,确保目标函数下降且不违反约束(保持内点)。
- 4.3 更新搜索方向:
- 共轭梯度法使用以下方式更新方向:\(d_{k+1} = -\nabla \Phi(x_{k+1}) + \beta_k d_k\)。
- 这里 \(\beta_k\) 通常用Fletcher-Reeves公式:\(\beta_k = \frac{\nabla \Phi_{k+1}^T \nabla \Phi_{k+1}}{\nabla \Phi_k^T \nabla \Phi_k}\),以保持方向的共轭性。
- 4.1 计算梯度:
步骤5:反射技巧的应用
- 当迭代点接近约束边界时(例如,\(x_1 + 2x_2 - 1\) 很小,或 \(4 - x_1^2 - x_2^2\) 很小),标准线搜索可能失败(步长过小)。
- 反射技巧:在接近边界时,计算边界的法向量,将搜索方向 \(d_k\) 沿边界反射,得到新方向 \(d_k'\)。
- 例如,对约束 \(g(x) = x_1 + 2x_2 - 1 \ge 0\),其梯度 \(\nabla g = [1, 2]^T\) 是边界的法向量。
- 如果点靠近该边界且 \(d_k\) 指向不可行域(即 \(d_k^T \nabla g < 0\)),则将 \(d_k\) 反射:\(d_k' = d_k - 2 \frac{d_k^T \nabla g}{\|\nabla g\|^2} \nabla g\)。
- 反射后方向沿边界切向,帮助沿边界快速移动,避免陷入角落。
- 在共轭梯度迭代中,每当方向被调整后,需重新计算 \(\beta_k\) 以保持共轭性。
步骤6:减小障碍参数 \(\mu\),重复迭代
- 当共轭梯度法对当前 \(\mu\) 收敛后(梯度范数足够小),减小 \(\mu\)(例如 \(\mu_{\text{new}} = 0.1 \mu\))。
- 用前一个子问题的解作为新初始点,重复步骤4-5,求解新子问题。
- 随着 \(\mu \to 0\),障碍项的影响减弱,子问题的解逼近原约束问题的最优解。
步骤7:收敛判断
- 当 \(\mu\) 足够小(如 \(\mu < 10^{-6}\)),且原问题的KKT条件近似满足:
- 梯度条件:\(\nabla f(x) - \lambda_1 \nabla g_1(x) - \lambda_2 \nabla g_2(x) - \lambda_3/x_1 - \lambda_4/x_2 \approx 0\),其中 \(\lambda_i\) 是拉格朗日乘子(可从障碍函数梯度中估计)。
- 互补松弛条件:\(\lambda_i g_i(x) \approx 0\)。
- 满足时停止,输出最优解和最优值。
实际计算示例(简化):
- 初始点:\((1,1)\),设 \(\mu_0 = 1\)。
- 子问题1:计算 \(\Phi(x,1)\) 的梯度,执行共轭梯度迭代(含反射):
- 第一步:\(\nabla \Phi(1,1) \approx [2.718, 5.436]^T\)(示例值),取 \(d_0 = [-2.718, -5.436]^T\)。
- 线搜索得 \(\alpha_0 = 0.1\),新点 \((0.728, 0.457)\)。
- 检查约束:接近 \(x_1+2x_2-1=0\) 时,若方向指向边界外,则反射后继续。
- 重复至 \(\|\nabla \Phi\| < 0.001\),更新 \(\mu = 0.1\),继续迭代。
- 最终近似解:约 \((0.5, 0.25)\)(可行且靠近约束边界),目标值 \(f \approx 0.85\)。
总结:内点反射共轭梯度法通过障碍函数处理约束,反射技巧改善边界附近的搜索行为,共轭梯度法加速内部优化。该方法适用于中小规模的非线性规划,能稳定收敛到局部最优解。