MOEA/D(Multiobjective Evolutionary Algorithm Based on Decomposition,基于分解的多目标进化算法)是一种多目标优化算法,由 Zhang 和 Li 于 2007 年提出。它的核心思想是将多目标优化问题(MOP)分解为一组单目标子问题,并采用进化算法协同求解。
MOEA/D 的核心思想
在多目标优化问题(MOP)中,我们通常希望优化多个相互冲突的目标。MOEA/D 采用分解(Decomposition)的方式,将 MOP 转化为多个单目标优化子问题,并利用邻域搜索进行优化。
相较于 NSGA-II 这种基于 Pareto 支配排序的方法,MOEA/D 直接优化多个标量化的子问题,使得解的分布性更好,特别适用于高维多目标优化问题。
MOEA/D 的数学原理
1. 多目标优化问题
一个典型的 MOP 可以表示为:
min
F
(
x
)
=
(
f
1
(
x
)
,
f
2
(
x
)
,
.
.
.
,
f
m
(
x
)
)
,
x
∈
Ω
\min F(x) = (f_1(x), f_2(x), ..., f_m(x)), \quad x \in \Omega
minF(x)=(f1(x),f2(x),...,fm(x)),x∈Ω
其中:
- x x x 是决策变量,
- f i ( x ) f_i(x) fi(x) 是需要优化的目标函数,
- Ω \Omega Ω 是可行解空间,
- m m m 是目标的数量。
2. 分解方法
MOEA/D 使用分解策略将 MOP 转换为多个单目标优化子问题。常见的分解方法包括:
- 加权和法(Weighted Sum, WS):
g W S ( x ∣ λ ) = ∑ i = 1 m λ i f i ( x ) g^{WS}(x|\lambda) = \sum_{i=1}^{m} \lambda_i f_i(x) gWS(x∣λ)=i=1∑mλifi(x) - 切比雪夫方法(Tchebycheff, TCH):
g T C H ( x ∣ λ , z ∗ ) = max i = 1 , . . . , m λ i ∣ f i ( x ) − z i ∗ ∣ g^{TCH}(x|\lambda, z^*) = \max_{i=1,...,m} \lambda_i |f_i(x) - z^*_i| gTCH(x∣λ,z∗)=i=1,...,mmaxλi∣fi(x)−zi∗∣ - 边界交叉约束法(Boundary Intersection, BI):
g B I ( x ∣ λ , z ∗ ) = d 1 + θ d 2 g^{BI}(x|\lambda, z^*) = d_1 + \theta d_2 gBI(x∣λ,z∗)=d1+θd2
其中: - λ = ( λ 1 , . . . , λ m ) \lambda = (\lambda_1, ..., \lambda_m) λ=(λ1,...,λm) 是权重向量,控制不同目标的权衡;
- z ∗ = ( z 1 ∗ , . . . , z m ∗ ) z^* = (z^*_1, ..., z^*_m) z∗=(z1∗,...,zm∗) 是理想点,表示所有目标的最优值;
- d 1 d_1 d1 和 d 2 d_2 d2 是个体到参考线的距离。
3. 邻域结构
MOEA/D 通过邻域搜索来更新解:
- 对于每个子问题 i i i,选择最近的 T T T 个权重向量作为邻居;
- 交叉和变异操作仅在邻居中进行,从而促进局部搜索,提高收敛性。
MOEA/D 的工作流程
-
初始化
- 生成一组均匀分布的权重向量 λ 1 , λ 2 , . . . , λ N \lambda_1, \lambda_2, ..., \lambda_N λ1,λ2,...,λN。
- 计算理想点 z ∗ z^* z∗。
- 初始化种群。
-
子问题求解
- 选择邻居。
- 交叉变异生成新解。
- 使用分解方法评估目标函数。
- 更新邻居解。
-
更新理想点
- 如果有新的解更优,则更新 z ∗ z^* z∗。
-
迭代优化
- 重复执行上述步骤,直到达到最大代数。
MOEA/D 与 NSGA-II 的对比
算法 | MOEA/D | NSGA-II |
---|---|---|
优化策略 | 采用分解方法优化多个子问题 | 采用 Pareto 排序优化整体种群 |
选择策略 | 基于邻域搜索 | 采用非支配排序与拥挤度 |
适用场景 | 适用于高维目标问题,分布更均匀 | 适用于目标较少(2-3 个目标)问题 |
MOEA/D 通过分解策略直接优化子问题,在高维多目标问题(如 5 维以上)上表现优异,而 NSGA-II 在低维问题上仍然表现较好。
Python 代码示例
MOEA/D 的实现可以使用 pymoo
库:
import numpy as np
from pymoo.algorithms.moo.moead import MOEAD
from pymoo.factory import get_problem
from pymoo.optimize import minimize
# 定义优化问题(ZDT1)
problem = get_problem("zdt1")
# 配置 MOEA/D 算法
algorithm = MOEAD(
n_neighbors=15,
decomposition="tchebi",
prob_neighbor_mating=0.7
)
# 运行算法
res = minimize(problem,
algorithm,
("n_gen", 200),
seed=1,
verbose=True)
# 画 Pareto 前沿
import matplotlib.pyplot as plt
F = res.F
plt.scatter(F[:, 0], F[:, 1], c="blue", label="MOEA/D Pareto Front")
plt.xlabel("f1(x)")
plt.ylabel("f2(x)")
plt.legend()
plt.title("MOEA/D Pareto Front for ZDT1")
plt.show()