3. 多目标优化算法分类:经典方法、进化算法与分解策略

做多目标优化这些年,我最大的感受就是:没有银弹。不同的问题,得用不同的家伙什儿。今天咱们就把主流的几类方法掰开揉碎了聊聊。我个人习惯把它们分成三大流派——经典数学派、进化算法派、还有分解派。

核心观点:选对算法,比调参重要十倍。你想想看,拿把螺丝刀去拧螺母,再使劲也白搭。

多目标优化算法分类 经典数学方法 加权和法 ε-约束法 目标规划法 进化算法 (MOEA) NSGA-II (非支配排序) SPEA2 (强度Pareto) MOEA/D (分解进化) 基于分解的方法 加权和分解 切比雪夫分解 边界交叉法 适用场景: 凸问题 → 经典方法 | 复杂Pareto前沿 → 进化算法 | 高维目标 → 分解方法

3.1 经典方法:老派但管用

经典方法说白了就是把多个目标揉成一个。我刚开始做优化那会儿,前辈们基本都用这招。虽然现在进化算法很火,但经典方法在某些场景下依然是最优解。

3.1.1 加权和法

这是最直观的方法。给每个目标一个权重,然后加起来变成一个目标。公式很简单:

min F(x) = w₁·f₁(x) + w₂·f₂(x) + ... + wₙ·fₙ(x)
其中 w₁ + w₂ + ... + wₙ = 1, 且 wᵢ ≥ 0

我在项目中遇到过一个问题:用加权和法找Pareto前沿,结果发现非凸区域根本找不到。为什么?因为加权和法本质上是在目标空间里找超平面的切点。如果Pareto前沿是凹的,切点就落在两端,中间区域全丢了。

避坑指南:我曾经在一个发动机设计项目里只用加权和法,结果漏掉了好几个关键的非凸解。后来加了ε-约束法才补上。记住:加权和法只保证能找到凸Pareto前沿上的点

3.1.2 ε-约束法

这个方法我特别喜欢。它的思路是:选一个主要目标,其他目标都变成约束条件。比如:

min f₁(x)
s.t. f₂(x) ≤ ε₂
     f₃(x) ≤ ε₃
     ...
     x ∈ Ω

你想想看,这样有什么好处?它能找到非凸区域的解。我做过一个对比实验:同样的非凸问题,加权和法只找到2个解,ε-约束法找到了15个。

实用技巧:ε值的选取很关键。我一般先用单目标优化找到每个目标的极值,然后在极值之间均匀取ε值。这样能保证覆盖整个Pareto前沿。

3.2 进化算法:现代主力军

进化算法(MOEA)现在是多目标优化的主力。为什么?因为它能一次跑出一整条Pareto前沿。我这些年用得最多的就是NSGA-II。

3.2.1 NSGA-II:非支配排序

NSGA-II的核心思想就两个:非支配排序拥挤度距离

  • 非支配排序:把种群分成不同层级。第一层是Pareto最优解,第二层是只被第一层支配的解,以此类推。
  • 拥挤度距离:同一层里,距离其他解越远的解越被优先保留。这样能保证解的多样性。

我记得有一次做供应链优化,目标有5个,用加权和法调权重调了三天没调好。换成NSGA-II,跑了一晚上,第二天早上看结果,Pareto前沿漂亮得很。

// NSGA-II 核心伪代码
1. 初始化种群 P₀
2. 对 P₀ 进行非支配排序
3. 计算每个个体的拥挤度距离
4. 用锦标赛选择法选父代
5. 交叉、变异生成子代 Q₀
6. 合并 P₀ 和 Q₀ → R₀
7. 对 R₀ 进行非支配排序
8. 按层级和拥挤度选择 N 个个体 → P₁
9. 重复步骤4-8直到收敛

关键参数:种群大小一般设100-200,交叉概率0.8-0.9,变异概率1/n(n是决策变量个数)。这是我多年实战总结的经验值。

3.2.2 SPEA2:强度Pareto进化算法

SPEA2和NSGA-II是同一时期的作品。它用了一个叫「强度值」的概念来评估个体优劣。简单说:一个解支配的解越多,它的强度值就越高

我个人觉得SPEA2在低维目标(2-3个)上表现不错,但高维目标(5个以上)就不太行了。NSGA-II在高维场景下更稳定。

3.3 基于分解的方法:化整为零

分解方法是我最近几年研究比较多的方向。它的思路很巧妙:把多目标问题分解成多个单目标子问题,然后同时求解

3.3.1 MOEA/D:分解进化算法

MOEA/D是张青富教授提出的,现在已经是多目标优化领域的标杆算法了。它的核心步骤:

  1. 生成N个均匀分布的权重向量
  2. 每个权重向量对应一个子问题
  3. 每个子问题用聚合函数(如加权和、切比雪夫)转化为单目标
  4. 相邻子问题之间交换信息,协同进化

为什么MOEA/D效果好?因为它把全局搜索和局部搜索结合起来了。每个子问题只关注自己那一块区域,但通过邻居关系又能共享信息。

实战经验:我在做汽车轻量化设计时,目标有4个(重量、刚度、碰撞安全、成本)。用MOEA/D配合切比雪夫分解,跑了50代就找到了满意的解集。同样的配置,NSGA-II需要80代。

3.3.2 三种分解方法对比

分解方法 公式 优点 缺点
加权和 min Σ wᵢ·fᵢ(x) 简单直观,计算快 只能找凸前沿
切比雪夫 min max(wᵢ·|fᵢ(x)-zᵢ*|) 能找非凸前沿 对权重敏感
边界交叉 min d₁ + θ·d₂ 分布均匀性好 参数θ难调

我个人习惯:凸问题用加权和,非凸问题用切比雪夫,追求均匀分布用边界交叉。当然,这只是经验之谈,具体问题还得具体分析。

3.4 如何选择?

说了这么多,到底该用哪个?我给大家一个简单的决策流程:

  • 目标数 ≤ 3,且Pareto前沿是凸的 → 加权和法或ε-约束法,简单高效
  • 目标数 2-5,前沿形状未知 → NSGA-II或MOEA/D,通用性强
  • 目标数 ≥ 5 → MOEA/D配合切比雪夫分解,高维场景下表现更好
  • 需要精确控制某个目标 → ε-约束法,把关键目标设为主要目标

最后提醒一句:算法只是工具,理解问题才是根本。我曾经见过有人用NSGA-II解一个线性多目标问题,跑了100代还没收敛。其实用加权和法一步就能搞定。别为了用算法而用算法。


公众号:蓝海资料掘金营,微信deep3321