自适应协方差矩阵调整演化策略(CMA-ES)在约束优化中的改进应用进阶题
题目描述
我们考虑一个带约束的非线性规划问题:
\[\begin{aligned} \min_{x \in \mathbb{R}^n} &\quad f(x) \\ \text{s.t.} &\quad g_i(x) \le 0, \quad i = 1,\dots,m \\ &\quad h_j(x) = 0, \quad j = 1,\dots,p \\ &\quad x_{\min} \le x \le x_{\max} \end{aligned} \]
其中,目标函数 \(f\) 和约束函数 \(g_i, h_j\) 均可能是非凸、不可微或计算代价高昂的(例如来自黑箱仿真模型)。传统的基于梯度的优化方法在此类问题上可能失效,因此我们使用基于种群的演化策略。
自适应协方差矩阵调整演化策略(CMA-ES)是一种高效的随机优化算法,擅长处理无约束、非光滑、高维问题。但标准CMA-ES无法直接处理约束。本题要求:
设计一种改进的CMA-ES算法,使其能够有效处理上述约束,并在保持CMA-ES原有自适应协方差调整、步长控制等优点的同时,保证种群在可行域内搜索。
解题过程
我们将分步骤讲解如何改进CMA-ES以处理约束。整个方法的核心思想是:将约束违反程度融入选择机制,引导种群向可行且目标函数值更优的方向进化。
步骤1:回顾标准CMA-ES的基本框架
标准CMA-ES(无约束版本)主要迭代步骤如下:
- 采样:在每一代 \(t\),从当前多元正态分布 \(\mathcal{N}(m^{(t)}, \sigma^{(t)2} C^{(t)})\) 中生成 \(\lambda\) 个子代候选解:
\[ x_k^{(t)} = m^{(t)} + \sigma^{(t)} \cdot y_k, \quad y_k \sim \mathcal{N}(0, C^{(t)}), \quad k=1,\dots,\lambda \]
其中 \(m^{(t)}\) 是均值向量(当前最优解的估计),\(\sigma^{(t)}\) 是全局步长,\(C^{(t)}\) 是协方差矩阵。
-
评估:计算每个子代的目标函数值 \(f(x_k)\)。
-
选择与重组:将 \(\lambda\) 个子代按 \(f(x_k)\) 排序,选取其中最好的 \(\mu\) 个(\(\mu < \lambda\)),通过加权平均更新均值:
\[ m^{(t+1)} = \sum_{i=1}^{\mu} w_i x_{i:\lambda} \]
其中 \(x_{i:\lambda}\) 表示第 \(i\) 好的解,\(w_i\) 是正的权重系数。
- 自适应更新:更新协方差矩阵 \(C\) 和步长 \(\sigma\),以反映搜索方向的成功信息和分布形状。
步骤2:约束处理的基本思路
在约束优化中,一个解 \(x\) 可能违反约束。我们需要定义一个约束违反度函数 \(v(x)\):
\[v(x) = \sum_{i=1}^{m} \max(0, g_i(x)) + \sum_{j=1}^{p} |h_j(x)| \]
如果 \(v(x) = 0\),则 \(x\) 是可行解;否则 \(v(x) > 0\),值越大违反越严重。
改进CMA-ES处理约束的常用方法是基于排序的选择机制,它同时考虑目标函数值和约束违反度。这里我们采用可行优先准则:
- 可行解总是优于不可行解。
- 两个可行解比较时,目标函数值小的更好。
- 两个不可行解比较时,约束违反度小的更好。
步骤3:具体改进方案——约束处理CMA-ES(CHT-CMA-ES)
我们在标准CMA-ES的“评估与选择”步骤中引入约束处理机制,其他步骤保持不变。
-
采样:与标准CMA-ES相同,生成 \(\lambda\) 个子代候选解。
-
评估:对每个子代 \(x_k\),计算:
- 目标函数值 \(f(x_k)\)。
- 约束违反度 \(v(x_k)\)。
-
约束支配排序:
- 将所有 \(\lambda\) 个子代按照可行优先准则排序。具体排序方法如下:
- 定义偏序关系:解 \(a\) 优于解 \(b\)(记作 \(a \prec b\))当且仅当:
- 将所有 \(\lambda\) 个子代按照可行优先准则排序。具体排序方法如下:
\[ \begin{cases} v(a) = 0 \text{ 且 } v(b) > 0, \quad \text{或} \\ v(a) = v(b) = 0 \text{ 且 } f(a) < f(b), \quad \text{或} \\ v(a) > 0 \text{ 且 } v(b) > 0 \text{ 且 } v(a) < v(b). \end{cases} \]
- 根据此偏序关系,对 $ \lambda $ 个子代进行排序,得到排序后的解序列 $ x_{1:\lambda}, x_{2:\lambda}, \dots, x_{\lambda:\lambda} $,其中 $ x_{1:\lambda} $ 是最优的(可能是可行且目标值最小,或不可行中违反度最小)。
-
选择与重组:
- 选取前 \(\mu\) 个最优的解 \(x_{1:\lambda}, \dots, x_{\mu:\lambda}\)。
- 更新均值向量 \(m^{(t+1)}\) 时,使用这 \(\mu\) 个解的加权平均(权重 \(w_i\) 与标准CMA-ES相同)。
-
自适应更新:
- 协方差矩阵 \(C\) 和步长 \(\sigma\) 的更新公式与标准CMA-ES完全相同,但注意:更新所用的成功信息(如进化路径)是基于上述排序后的最优解集计算的。这意味着,即使当前最优解是不可行的,算法也会尝试向减小约束违反度的方向调整搜索分布。
-
边界处理:
- 对于边界约束 \(x_{\min} \le x \le x_{\max}\),在采样后可以对越界的分量进行修正(例如反射或裁剪),但更好的方法是在评估时对越界解施加一个大的惩罚项到约束违反度 \(v(x)\) 中,使其在排序中自然落后。
步骤4:算法流程伪代码
输入:初始均值 m⁽⁰⁾, 初始步长 σ⁽⁰⁾, 初始协方差矩阵 C⁽⁰⁾ = I, 种群大小 λ, 选择数量 μ, 权重 w₁,…,wₘ。
输出:最优解 x*(最终找到的可行解中目标值最小的)。
t ← 0
while 终止条件未满足 do
// 1. 采样
for k = 1 to λ do
生成 yₖ ∼ N(0, C⁽ᵗ⁾)
xₖ⁽ᵗ⁾ ← m⁽ᵗ⁾ + σ⁽ᵗ⁾ · yₖ
end for
// 2. 评估与约束处理
for k = 1 to λ do
计算 f(xₖ⁽ᵗ⁾) 和 v(xₖ⁽ᵗ⁾)
end for
// 3. 约束支配排序
根据可行优先准则对 {xₖ⁽ᵗ⁾} 排序,得到排序序列 x₁:λ, …, x_λ:λ
// 4. 选择与重组
m⁽ᵗ⁺¹⁾ ← ∑_{i=1}^{μ} w_i · x_i:λ
// 5. 自适应更新(与标准CMA-ES相同)
更新进化路径 p_σ, p_c
更新协方差矩阵 C⁽ᵗ⁺¹⁾
更新步长 σ⁽ᵗ⁺¹⁾
t ← t + 1
end while
返回历史中找到的最佳可行解(若无非可行解,则返回违反度最小的解)。
步骤5:关键点与讨论
-
可行性导向:排序机制确保了算法优先降低约束违反度。一旦找到可行解,后续搜索会集中在可行域内改进目标函数。
-
自适应机制的影响:协方差矩阵和步长的更新依赖于排序后的解集。如果当前代中较好的解都偏向某个方向(例如向可行域边界移动),协方差矩阵会逐渐调整以在该方向上扩大搜索。
-
与罚函数法的区别:该方法没有将约束违反度加权合并到目标函数中,避免了权重选择的困难,也避免了不可行解因目标值很好而掩盖其不可行性。
-
处理等式约束:等式约束 \(h_j(x) = 0\) 通常很难严格满足。在实际中,可以引入一个小的容差 \(\epsilon > 0\),将等式约束转化为不等式: \(|h_j(x)| \le \epsilon\)。
-
终止条件:可以设定最大迭代次数、目标函数改进停滞、或种群分布集中(步长 \(\sigma\) 很小)等。
总结
本题目介绍了如何将标准CMA-ES扩展为能够处理约束的改进算法。核心改进在于在每一代中使用基于可行优先准则的排序来选择优势个体,从而引导搜索向可行域靠近并优化目标。这种方法保留了CMA-ES的自适应协方差调整能力,适用于目标或约束函数不可微、计算代价高的黑箱优化问题。实际应用中,还可以结合本地搜索、重启策略等进一步提升性能。