非线性规划中的可行顺序线性规划(FSLP)算法进阶题
题目描述
我们考虑以下非线性规划问题:
\[\min_{x \in \mathbb{R}^n} f(x) \]
\[ \text{s.t.} \quad g_i(x) \le 0, \quad i = 1, \dots, m \]
其中,目标函数 \(f: \mathbb{R}^n \to \mathbb{R}\) 和约束函数 \(g_i: \mathbb{R}^n \to \mathbb{R}\) 都是二次连续可微的,并且可能非凸。可行顺序线性规划(Feasible Sequential Linear Programming, FSLP)是一种迭代算法,它在每一步构造当前迭代点处的线性化子问题,并求解该线性规划以获得搜索方向,同时通过适当的步长控制确保迭代点始终严格可行(即满足 \(g_i(x) < 0\))。本题要求你深入理解FSLP的核心思想,掌握其迭代步骤、可行性保持机制、收敛性条件,并能针对一个具体例子实施算法。
具体实例:
\[\min f(x) = (x_1 - 3)^2 + (x_2 - 2)^2 \]
\[ \text{s.t.} \quad g_1(x) = x_1^2 + x_2^2 - 4 \le 0 \]
\[ g_2(x) = -x_1 - x_2 + 1 \le 0 \]
\[ x_1 \ge 0, \quad x_2 \ge 0 \]
初始点 \(x^0 = (1, 1)\),该点满足 \(g_1(x^0) = -2 < 0\),\(g_2(x^0) = -1 < 0\),且 \(x_1, x_2 > 0\),故严格可行。
解题过程
第一步:理解FSLP的基本思想
FSLP属于序列线性规划(SLP)的一种,其核心是在每一步迭代时,将原非线性问题在当前点 \(x^k\) 处进行一阶泰勒展开,得到一个线性规划子问题。但与传统SLP不同,FSLP通过引入可行性恢复步骤或严格内点步长控制,确保每一次迭代后的新点仍然严格可行(即满足所有不等式约束的严格小于0形式)。这能避免约束违反,并允许使用较简单的线性规划求解器。
关键点:
- 线性化:在 \(x^k\) 处,对 \(f\) 和 \(g_i\) 做线性近似。
- 子问题是线性规划(LP),可用单纯形法或内点法求解。
- 步长选择需保证新点严格可行,通常通过回溯线搜索(backtracking line search)或信任域(trust region)策略实现。
第二步:构造线性规划子问题
在当前迭代点 \(x^k\),我们计算目标函数和约束函数的梯度:
\[\nabla f(x) = \begin{bmatrix} 2(x_1 - 3) \\ 2(x_2 - 2) \end{bmatrix}, \quad \nabla g_1(x) = \begin{bmatrix} 2x_1 \\ 2x_2 \end{bmatrix}, \quad \nabla g_2(x) = \begin{bmatrix} -1 \\ -1 \end{bmatrix} \]
线性化后的子问题为(决策变量为搜索方向 \(d \in \mathbb{R}^n\)):
\[\min_{d} \ \nabla f(x^k)^\top d \]
\[ \text{s.t.} \quad g_i(x^k) + \nabla g_i(x^k)^\top d \le 0, \quad i=1,2 \]
\[ x^k + d \ge 0 \quad (\text{即 } d \ge -x^k) \]
注意:这里我们没有在目标中加入二阶项(如 \(f(x^k)\) 是常数,可忽略),因为线性规划的目标必须是线性的。同时,线性化只针对非线性约束,对于简单的边界约束 \(x \ge 0\),我们直接将其转化为对 \(d\) 的线性约束 \(d \ge -x^k\),以确保新点 \(x^{k+1} = x^k + d\) 仍满足边界。
解释:线性化约束 \(g_i(x^k) + \nabla g_i(x^k)^\top d \le 0\) 确保了如果 \(d\) 很小,则 \(g_i(x^k + d) \approx g_i(x^k) + \nabla g_i(x^k)^\top d \le 0\),从而近似满足原约束。但由于线性近似只在局部有效,我们需要限制步长(即 \(d\) 的范数)来保证可行性。
第三步:引入信任域约束以控制步长
为了控制线性近似的误差,我们添加一个信任域约束:
\[\|d\|_\infty \le \Delta^k \]
其中 \(\Delta^k > 0\) 是当前信任域半径,\(\|d\|_\infty = \max_j |d_j|\) 易于线性化(可转化为 \(- \Delta^k \le d_j \le \Delta^k\))。这样,子问题变为:
\[\min_{d} \ \nabla f(x^k)^\top d \]
\[ \text{s.t.} \quad g_i(x^k) + \nabla g_i(x^k)^\top d \le 0, \quad i=1,2 \]
\[ d \ge -x^k \]
\[ -\Delta^k \le d_j \le \Delta^k, \quad j=1,2 \]
这是一个线性规划,可用标准方法求解,得到搜索方向 \(d^k\)。
第四步:可行性保持与步长接受准则
即使有信任域约束,线性化子问题的解 \(d^k\) 也可能导致新点 \(x^k + d^k\) 违反原约束(因为线性近似有误差)。因此,FSLP通常采用以下步骤:
- 求解线性规划子问题,得到 \(d^k\)。
- 检查可行性:计算 \(x_{\text{temp}} = x^k + d^k\),验证是否满足 \(g_i(x_{\text{temp}}) < 0\) 和 \(x_{\text{temp}} > 0\)。如果满足,则接受 \(d^k\) 作为搜索方向;否则,减少信任域半径 \(\Delta^k\)(例如 \(\Delta^k := \beta \Delta^k, \beta \in (0,1)\))并重新求解子问题,直到得到严格可行的 \(x_{\text{temp}}\)。
- 步长选择:一旦得到可行的 \(d^k\),我们可进一步进行线搜索以确保目标函数下降。但由于子问题已考虑了目标梯度,有时直接接受全步 \(x^{k+1} = x^k + d^k\),或进行简单回溯:令 \(\alpha = 1\),当 \(f(x^k + \alpha d^k) > f(x^k)\) 时,设置 \(\alpha := \gamma \alpha\)(\(\gamma \in (0,1)\)),直至满足下降条件。
注意:FSLP的关键是每次迭代后点严格可行,这简化了后续迭代,并允许在工业软件中直接调用LP求解器。
第五步:信任域半径的更新
根据线性近似的拟合程度调整 \(\Delta^k\):
- 定义实际下降:\(\text{ared} = f(x^k) - f(x^{k+1})\)
- 定义预测下降:\(\text{pred} = -\nabla f(x^k)^\top d^k\)(因为线性模型预测的下降)
- 计算比值 \(r^k = \frac{\text{ared}}{\text{pred}}\)
更新规则: - 若 \(r^k > 0.75\)(模型拟合很好),扩大信任域:\(\Delta^{k+1} = 2 \Delta^k\)
- 若 \(0.25 \le r^k \le 0.75\),保持:\(\Delta^{k+1} = \Delta^k\)
- 若 \(r^k < 0.25\),缩小信任域:\(\Delta^{k+1} = 0.5 \Delta^k\)
第六步:算法框架
总结FSLP算法步骤:
- 初始化:严格可行点 \(x^0\),初始信任域半径 \(\Delta^0 > 0\)(例如 \(\Delta^0=1\)),容差 \(\epsilon > 0\),置 \(k=0\)。
- 循环直到 \(\|d^k\| < \epsilon\):
a. 求解上述线性规划子问题得 \(d^k\)。
b. 若 \(x^k + d^k\) 不严格可行,则减小 \(\Delta^k\) 并返回步骤a。
c. 计算比值 \(r^k\)。
d. 如果 \(r^k > 0\),接受步长:\(x^{k+1} = x^k + d^k\);否则拒绝(\(x^{k+1} = x^k\))。
e. 按上述规则更新 \(\Delta^{k+1}\)。
f. \(k := k+1\)。
第七步:应用于具体例子
以初始点 \(x^0=(1,1)\),\(\Delta^0=1\) 为例演示第一次迭代:
- 计算梯度:
\[ \nabla f(1,1)=[-4, -2]^\top, \quad \nabla g_1(1,1)=[2, 2]^\top, \quad \nabla g_2(1,1)=[-1, -1]^\top \]
约束值:\(g_1(1,1)=-2, \ g_2(1,1)=-1\)。
- 构造线性规划:
\[ \min_{d_1,d_2} -4d_1 - 2d_2 \]
\[ \text{s.t.} \quad -2 + 2d_1 + 2d_2 \le 0 \quad (g_1 \text{线性化}) \]
\[ -1 - d_1 - d_2 \le 0 \quad (g_2 \text{线性化}) \]
\[ d_1 \ge -1, \quad d_2 \ge -1 \quad (\text{边界 } x \ge 0) \]
\[ -1 \le d_1 \le 1, \quad -1 \le d_2 \le 1 \quad (\text{信任域}) \]
-
求解此LP(可用图解法或单纯形法):最优解在顶点取得,经计算得 \(d^0 = (1, -0.5)\)(满足所有约束,且使目标最小化)。此时 \(x^0 + d^0 = (2, 0.5)\)。
-
检查可行性:
\(g_1(2,0.5)=4+0.25-4=0.25 > 0\),违反!因此需要减小 \(\Delta^0\),比如设 \(\Delta^0 = 0.5\),重新求解LP(此时信任域约束为 \(|d_j| \le 0.5\))。新解为 \(d^0 = (0.5, -0.5)\),则 \(x^0+d^0=(1.5,0.5)\),计算得 \(g_1(1.5,0.5)=2.25+0.25-4=-1.5 <0\),\(g_2(1.5,0.5)=-1.5-0.5+1=-1<0\),且 \(x>0\),故严格可行。 -
计算比值:\(f(1,1)=5\),\(f(1.5,0.5)= (1.5-3)^2+(0.5-2)^2=2.25+2.25=4.5\),实际下降 \(=0.5\);预测下降 \(= -[-4, -2]^\top [0.5, -0.5] = 4*0.5+2*0.5=3\);比值 \(r=0.5/3\approx0.167<0.25\),故应缩小信任域:\(\Delta^1=0.5*0.5=0.25\)。
-
接受新点 \(x^1=(1.5,0.5)\),继续迭代。
第八步:收敛性说明
FSLP在适当条件下(如约束梯度线性独立、目标与约束光滑、严格互补等)可证明迭代点序列的任一极限点满足一阶必要最优条件(KKT条件)。由于每次迭代均严格可行,算法很稳定,尤其适合需要严格保持可行性的工程应用。
关键优势:每次迭代只需解线性规划,计算简单,且严格可行性便于在线调整和实时优化。
注意事项:线性化可能导致收敛慢(仅线性收敛),且对非凸问题可能陷入局部最优。实际中可与二阶信息或全局策略结合改进。
通过以上步骤,你应能理解FSLP的原理与实现,并应用到其他非线性规划问题中。