非线性规划中的序列二次规划-序列凸近似-自适应屏障-梯度投影混合算法基础题
我将为你讲解一个结合序列二次规划(SQP)、序列凸近似(SCA)、自适应屏障函数和梯度投影的混合算法,用于求解一类带不等式约束的非线性规划问题。这个算法融合了多种方法的优势,以处理非凸、高维或计算复杂的优化问题。
1. 题目描述
考虑如下非线性规划问题:
\[\begin{aligned} \min_{x \in \mathbb{R}^n} \quad & f(x) \\ \text{s.t.} \quad & c_i(x) \leq 0, \quad i = 1, \ldots, m \\ & x \in \mathcal{X} \end{aligned} \]
其中:
- 目标函数 \(f: \mathbb{R}^n \to \mathbb{R}\) 是连续可微但可能非凸。
- 不等式约束函数 \(c_i: \mathbb{R}^n \to \mathbb{R}\) 是连续可微,也可能非凸。
- 集合 \(\mathcal{X} = \{ x \mid l \leq x \leq u \}\) 是一个简单的盒式约束(闭矩形区域),\(l, u \in \mathbb{R}^n\) 是上下界向量。盒式约束使得投影操作容易计算。
我们的目标是设计一个混合算法,在每一步迭代中:
- 使用序列凸近似(SCA)将原非凸问题近似为一个凸子问题。
- 在子问题上应用序列二次规划(SQP)框架,利用自适应屏障函数处理不等式约束,确保迭代点严格可行或适当松弛。
- 用梯度投影法(GPM)处理盒式约束 \(\mathcal{X}\),确保迭代点始终满足简单约束。
- 通过自适应机制调整屏障参数和信赖域半径,平衡可行性和最优性。
2. 算法原理与步骤详解
这个混合算法的核心思想是分层处理:用SCA处理非凸性,用SQP处理光滑约束,用屏障函数处理不等式约束,用梯度投影处理简单集合约束。
步骤1:初始化
- 选择一个初始点 \(x^0 \in \mathcal{X}\)(即满足盒式约束)。
- 设置初始屏障参数 \(\mu^0 > 0\)(例如 \(\mu^0 = 1\)),初始信赖域半径 \(\Delta^0 > 0\)。
- 选择参数:收缩因子 \(\tau \in (0,1)\)(用于更新 \(\mu\)),增长因子 \(\gamma > 1\),接受阈值 \(\eta \in (0,1)\)。
- 设定收敛容差 \(\epsilon > 0\),最大迭代次数 \(K\)。
步骤2:构建凸近似子问题(SCA阶段)
在第 \(k\) 次迭代,当前点为 \(x^k\)。我们对非凸函数 \(f(x)\) 和 \(c_i(x)\) 进行凸近似。常用的一阶凸近似是:
- 目标函数近似:\(\tilde{f}_k(x) = f(x^k) + \nabla f(x^k)^T (x - x^k) + \frac{1}{2} (x - x^k)^T B_k (x - x^k)\)。
- 约束函数近似:\(\tilde{c}_{i,k}(x) = c_i(x^k) + \nabla c_i(x^k)^T (x - x^k)\)。
这里 \(B_k\) 是Hessian矩阵的近似(如BFGS更新得到的正定矩阵),保证 \(\tilde{f}_k(x)\) 是凸二次函数。\(\tilde{c}_{i,k}(x)\) 是线性函数,因此是凸的。
子问题变为:
\[\begin{aligned} \min_{x \in \mathbb{R}^n} \quad & \tilde{f}_k(x) \\ \text{s.t.} \quad & \tilde{c}_{i,k}(x) \leq 0, \quad i = 1, \ldots, m \\ & x \in \mathcal{X} \end{aligned} \]
这是一个凸二次规划(QP),因为目标为凸二次,约束为线性不等式和盒式约束。
步骤3:整合自适应屏障函数
为了便于求解并控制可行性,我们将不等式约束 \(\tilde{c}_{i,k}(x) \leq 0\) 用对数屏障函数惩罚,得到无约束子问题:
\[\min_{x \in \mathcal{X}} \quad \Phi_k(x; \mu^k) = \tilde{f}_k(x) - \mu^k \sum_{i=1}^m \log(-\tilde{c}_{i,k}(x)) \]
注意:
- 对数屏障要求 \(\tilde{c}_{i,k}(x) < 0\)(严格可行)。由于是线性近似,这可以通过初始点选择或可行性恢复步骤保证。
- 屏障参数 \(\mu^k > 0\) 控制惩罚强度:\(\mu^k\) 大时,解靠近可行域内部;\(\mu^k\) 小时,解靠近边界。自适应机制会根据约束违反程度调整 \(\mu^k\)。
步骤4:用梯度投影法求解无约束子问题
由于问题是无约束(除了盒式约束 \(\mathcal{X}\)),我们可以用梯度投影法(GPM)求解 \(\min_{x \in \mathcal{X}} \Phi_k(x; \mu^k)\)。
- 计算 \(\Phi_k\) 在 \(x\) 处的梯度:
\[\nabla_x \Phi_k = \nabla \tilde{f}_k(x) - \mu^k \sum_{i=1}^m \frac{1}{\tilde{c}_{i,k}(x)} \nabla \tilde{c}_{i,k}(x) \]
其中 \(\nabla \tilde{f}_k(x) = \nabla f(x^k) + B_k (x - x^k)\),\(\nabla \tilde{c}_{i,k}(x) = \nabla c_i(x^k)\)。
- 梯度投影迭代:从当前点 \(y^0 = x^k\) 开始,进行迭代 \(t=0,1,\ldots\):
\[y^{t+1} = P_{\mathcal{X}} \left( y^t - \alpha_t \nabla_x \Phi_k(y^t; \mu^k) \right) \]
其中 \(P_{\mathcal{X}}(z)\) 是到 \(\mathcal{X}\) 的投影(即对每个分量 \(z_j\) 截断到区间 \([l_j, u_j]\)),\(\alpha_t\) 是步长(可通过线搜索确定)。当 \(\| y^{t+1} - y^t \|\) 足够小或达到最大内迭代次数时停止,记解为 \(\tilde{x}^k\)。
步骤5:接受性与自适应更新
计算实际目标改进与预测改进之比:
\[\rho_k = \frac{f(x^k) - f(\tilde{x}^k)}{\tilde{f}_k(x^k) - \tilde{f}_k(\tilde{x}^k)} \]
- 如果 \(\rho_k \ge \eta\)(如 \(\eta=0.1\)),则接受步:\(x^{k+1} = \tilde{x}^k\)。
- 否则拒绝步:\(x^{k+1} = x^k\),并缩小信赖域半径 \(\Delta^{k+1} = \tau \Delta^k\)。
同时,自适应更新屏障参数:
- 计算约束违反度:\(V_k = \max(0, c_i(\tilde{x}^k))\) 的最大值或平方和。
- 如果 \(V_k\) 较大,说明近似约束太松,需增大屏障惩罚:\(\mu^{k+1} = \gamma \mu^k\)。
- 如果 \(V_k\) 很小,说明近似较准,可减小屏障参数以接近边界:\(\mu^{k+1} = \tau \mu^k\)。
步骤6:检查收敛
如果满足以下任一条件,则停止并输出 \(x^{k+1}\):
- \(\| x^{k+1} - x^k \| < \epsilon\) 且 \(\| \nabla_x L(x^{k+1}, \lambda^{k+1}) \| < \epsilon\)(其中 \(L\) 是拉格朗日函数)。
- 约束违反度 \(V_k < \epsilon\) 且目标变化很小。
- 达到最大迭代次数 \(K\)。
否则,令 \(k := k+1\),更新 \(B_k\)(用BFGS公式),返回步骤2。
3. 算法特点与优势
- 处理非凸性:SCA将非凸问题转化为一系列凸子问题,保证子问题可高效求解。
- 保证可行性:自适应屏障函数迫使迭代点趋向可行域内部,避免过早靠近边界导致的数值困难。
- 简单约束处理:梯度投影法高效处理盒式约束,无需额外优化子程序。
- 自适应平衡:通过 \(\rho_k\) 控制步长接受,通过 \(\mu^k\) 控制约束违反,算法在可行性和最优性间自适应调整。
4. 简单例子演示
考虑问题:
\[\min f(x) = (x_1-3)^2 + (x_2-2)^2, \quad \text{s.t. } c(x)=x_1^2 + x_2^2 - 4 \le 0, \quad 0 \le x_1, x_2 \le 3. \]
- 初始化:\(x^0=(1,1), \mu^0=1, \Delta^0=1\)。
- 在 \(x^0\) 处线性化 \(c(x)\):\(\tilde{c}(x) = 1 + 2(x_1-1) + 2(x_2-1) \le 0\)。
- 构建屏障子问题:\(\min_{0\le x_1,x_2\le3} (x_1-3)^2+(x_2-2)^2 - \mu^0 \log(-\tilde{c}(x))\)。
- 用梯度投影求解该子问题,得 \(\tilde{x}^0 \approx (1.5,1.5)\)。
- 计算 \(\rho_0\):若改进充分,则接受,并更新 \(\mu^1\) 等。
- 重复直到收敛到近似解 \(x^* \approx (1.2,1.6)\)(在圆边界附近)。
5. 总结
这个混合算法利用了SCA的凸化、SQP的快速局部收敛、屏障函数的可行性控制以及梯度投影的简单约束处理。它特别适用于目标/约束非凸但可微、且带有简单集合约束的问题。通过自适应调整参数,算法能在可行性、最优性和计算效率之间取得平衡。