一、NSGA-III概述
1.1 背景与核心思想
非支配排序遗传算法III(NSGA-III) 是由Deb和Jain于2014年提出的多目标优化算法,是NSGA-II的扩展。其核心目标是解决高维目标空间(目标数≥3) 下的多目标优化问题,通过参考点引导的多样性保持机制,替代NSGA-II的拥挤度距离,有效避免"维度灾难",提升高维目标下的选择压力和解集分布性。
1.2 NSGA-III与NSGA-II的关键区别
| 特性 | NSGA-II | NSGA-III |
|---|---|---|
| 多样性保持 | 拥挤度距离(Crowding Distance) | 参考点系统(Reference Points) |
| 适用目标数 | 2-3个目标 | 3个及以上目标(高维目标) |
| 选择机制 | 非支配排序+拥挤度选择 | 非支配排序+参考点关联+小生境选择 |
| 计算复杂度 | 较低(O(MN2O(MN^2O(MN2),MMM为目标数,NNN为种群大小) | 较高(需计算个体与参考点距离) |
二、NSGA-III核心原理
2.1 算法流程
- 初始化 :随机生成初始种群P0P_0P0,设置参考点集ZZZ。
- 非支配排序:对种群进行非支配排序,得到不同等级的前沿面F1,F2,...。
- 参考点关联:将每个个体与最近的参考点关联,计算参考点关联的个体数量。
- 选择操作:优先选择高层级前沿面个体,通过小生境技术(参考点关联)选择个体,保持多样性。
- 交叉变异:对选中的个体进行交叉(如模拟二进制交叉SBX)和变异(如多项式变异),生成子代种群Qt。
- 环境选择 :合并父代PtP_tPt和子代QtQ_tQt,重复步骤2-5,直至达到终止条件。
2.2 关键步骤详解
2.2.1 参考点生成(Das-Dennis方法)
matlab
function Z = generate_reference_points(m, p)
% 生成m目标、p划分的参考点集Z
Z = [];
if m == 1
Z = [1];
return;
end
% 递归生成所有组合
for i = 0:p
sub_points = generate_reference_points(m-1, p-i);
for j = 1:size(sub_points, 1)
Z = [Z; [sub_points(j,:), i/p]];
end
end
Z = unique(Z, 'rows'); % 去重
Z = Z / p; % 归一化
end
2.2.2 个体与参考点关联(垂直距离法)
将个体x的目标向量f(x)投影到参考点z所在的超平面,计算垂直距离,选择距离最小的参考点关联:
d(x,z)=∣(f(x)−z)⋅n∣∣n∣d(x,z)=\frac{∣(f(x)−z)⋅n∣}{∣n∣}d(x,z)=∣n∣∣(f(x)−z)⋅n∣
其中n为超平面法向量(高维空间中简化为欧氏距离)。
2.2.3 小生境选择
- 统计每个参考点关联的个体数量nzn_znz;
- 优先选择关联个体少的参考点(稀疏区域),确保每个参考点有代表个体,维持多样性。
三、NSGA-III MATLAB实现
3.1 算法框架
matlab
function [pop, front] = nsga3(fun, m, lb, ub, pop_size, max_gen, p)
% fun: 目标函数(返回m维目标向量)
% m: 目标数
% lb, ub: 变量上下界
% pop_size: 种群大小
% max_gen: 最大迭代次数
% p: 参考点划分数量
% 1. 生成参考点
Z = generate_reference_points(m, p);
n_ref = size(Z, 1); % 参考点数量
% 2. 初始化种群
pop = repmat(lb, pop_size, 1) + rand(pop_size, length(lb)) .* repmat(ub-lb, pop_size, 1);
front = cell(max_gen+1, 1);
for gen = 1:max_gen
% 3. 计算目标函数值
obj = arrayfun(@(i) fun(pop(i,:)), 1:pop_size, 'UniformOutput', false);
obj = cell2mat(obj'); % 目标矩阵(pop_size×m)
% 4. 非支配排序
[fronts, rank] = non_dominated_sort(obj);
F1 = fronts{1}; % 第一前沿面
% 5. 参考点关联
[association, niche_count] = associate_to_reference_points(obj, Z);
% 6. 选择操作(精英保留+小生境选择)
new_pop = select_population(pop, obj, association, niche_count, Z, pop_size);
% 7. 交叉变异(SBX+多项式变异)
offspring = genetic_operators(new_pop, lb, ub);
% 8. 环境选择(合并父代与子代,重复步骤3-6)
pop = [new_pop; offspring];
% ...(省略合并与截断步骤,保持种群大小pop_size)
end
end
3.2 核心函数实现
3.2.1 非支配排序
matlab
function [fronts, rank] = non_dominated_sort(obj)
% 对目标矩阵obj进行非支配排序,返回各前沿面fronts和个体秩rank
[N, m] = size(obj);
dominated_count = zeros(N, 1); % 被支配次数
dominated_set = cell(N, 1); % 支配的个体集合
rank = zeros(N, 1); % 个体秩
fronts = {};
current_front = [];
for i = 1:N
for j = 1:N
if i == j, continue; end
if dominates(obj(i,:), obj(j,:))
dominated_set{i} = [dominated_set{i}, j];
elseif dominates(obj(j,:), obj(i,:))
dominated_count(i) = dominated_count(i) + 1;
end
end
if dominated_count(i) == 0
current_front = [current_front, i];
rank(i) = 1;
end
end
fronts{1} = current_front;
k = 1;
while ~isempty(fronts{k})
next_front = [];
for i = fronts{k}
for j = dominated_set{i}
dominated_count(j) = dominated_count(j) - 1;
if dominated_count(j) == 0
rank(j) = k+1;
next_front = [next_front, j];
end
end
end
k = k+1;
fronts{k} = next_front;
end
end
function d = dominates(a, b)
% 判断a是否支配b(a在所有目标上不劣于b,且至少一个目标更优)
d = all(a <= b) && any(a < b);
end
3.2.2 参考点关联
matlab
function [association, niche_count] = associate_to_reference_points(obj, Z)
% 将个体obj关联到最近参考点Z,返回关联索引和参考点关联计数
[N, m] = size(obj);
n_ref = size(Z, 1);
association = zeros(N, 1); % 个体关联的参考点索引
niche_count = zeros(n_ref, 1); % 每个参考点关联的个体数
for i = 1:N
min_dist = inf;
best_z = 0;
for j = 1:n_ref
dist = norm(obj(i,:) - Z(j,:)); % 欧氏距离(简化版垂直距离)
if dist < min_dist
min_dist = dist;
best_z = j;
end
end
association(i) = best_z;
niche_count(best_z) = niche_count(best_z) + 1;
end
end
3.2.3 选择操作(小生境选择)
matlab
function new_pop = select_population(pop, obj, association, niche_count, Z, pop_size)
% 基于参考点关联的小生境选择
[N, ~] = size(pop);
new_pop = [];
selected = false(N, 1);
% 优先选择第一前沿面个体
fronts = non_dominated_sort(obj);
for k = 1:length(fronts)
Fk = fronts{k};
for i = Fk
if ~selected(i)
z_idx = association(i);
if niche_count(z_idx) < max(niche_count) % 优先稀疏参考点
new_pop = [new_pop; pop(i,:)];
selected(i) = true;
niche_count(z_idx) = niche_count(z_idx) + 1;
if size(new_pop, 1) >= pop_size, return; end
end
end
end
end
end
3.3 测试案例:DTLZ2多目标问题
以3目标DTLZ2问题为例,验证NSGA-III性能:
目标函数:
minf1(x)=(1+g(x))cos(x1π/2)cos(x2π/2)minf_1(x)=(1+g(x))cos(x_1π/2)cos(x_2π/2)minf1(x)=(1+g(x))cos(x1π/2)cos(x2π/2)
minf2(x)=(1+g(x))cos(x1π/2)sin(x2π/2)minf_2(x)=(1+g(x))cos(x_1π/2)sin(x_2π/2)minf2(x)=(1+g(x))cos(x1π/2)sin(x2π/2)
minf3(x)=(1+g(x))sin(x1π/2)minf_3(x)=(1+g(x))sin(x_1π/2)minf3(x)=(1+g(x))sin(x1π/2)
其中g(x)=100(∣x∣−10)+∑i=3n(xi−0.5)2,x∈[0,1]n(n=7)g(x)=100(∣x∣−10)+∑_{i=3}^n(x_i−0.5)^2,x∈[0,1]^n(n=7)g(x)=100(∣x∣−10)+∑i=3n(xi−0.5)2,x∈[0,1]n(n=7)。
matlab
% DTLZ2目标函数
function obj = dtlz2(x)
n = length(x);
m = 3; % 3目标
g = 100*(n-2) + sum((x(3:end)-0.5).^2);
theta = x(1:m-1)*pi/2;
f = zeros(1, m);
for i = 1:m-1
f(i) = (1+g)*prod(cos(theta(1:i-1))) * sin(theta(i));
end
f(m) = (1+g)*prod(cos(theta));
obj = f;
end
% 运行NSGA-III
lb = zeros(1,7); ub = ones(1,7); % 变量上下界
pop_size = 100; max_gen = 200; p = 12; % 3目标,p=12→参考点数量=C(3+12-1,12)=91
[pop, front] = nsga3(@dtlz2, 3, lb, ub, pop_size, max_gen, p);
四、结果可视化与分析
4.1 解集分布(平行坐标图)
matlab
% 绘制平行坐标图展示3目标解集
obj = arrayfun(@(i) dtlz2(pop(i,:)), 1:pop_size, 'UniformOutput', false);
obj = cell2mat(obj');
figure;
parallelcoords(obj, 'LineSpec', 'b-', 'LineWidth', 0.5);
xlabel('目标'); ylabel('目标值'); title('NSGA-III优化DTLZ2解集(3目标)');
4.2 参考点与个体关联
matlab
% 绘制参考点与实际解集的关联
Z = generate_reference_points(3, 12); % 3目标,p=12
scatter3(obj(:,1), obj(:,2), obj(:,3), 50, association, 'filled');
hold on;
scatter3(Z(:,1), Z(:,2), Z(:,3), 100, 'rx', 'LineWidth', 2);
xlabel('f1'); ylabel('f2'); zlabel('f3'); title('参考点与个体关联');
colorbar;
参考代码 非主导性排序遗传算法nsga3 www.youwenfan.com/contentcss/160527.html
五、NSGA-III关键参数与调优
| 参数 | 作用 | 取值建议 |
|---|---|---|
| 种群大小(pop_size) | 影响解集多样性和计算效率 | 50-200(目标数多则增大) |
| 最大迭代次数(max_gen) | 控制算法收敛性 | 100-500(复杂问题需更大) |
| 参考点划分(p) | 决定参考点数量(C(m+p-1,p)) | 5-20(目标数3-5时,p=10-15) |
| 交叉概率(pc) | 控制基因重组频率 | 0.8-0.95 |
| 变异概率(pm) | 控制基因突变频率 | 1/n(n为变量数) |
六、应用场景与扩展
6.1 典型应用领域
- 工程设计:多目标优化(重量、强度、成本);
- 能源系统:微电网经济性、环保性、可靠性多目标调度;
- 机器学习:超参数优化(精度、训练时间、模型复杂度);
- 物流规划:配送路径、成本、时效多目标优化。
6.2 扩展方向
- 动态NSGA-III:引入时间变量,适应动态变化的优化目标;
- 并行NSGA-III:利用GPU或多核CPU加速种群评估;
- 混合算法:结合粒子群优化(PSO)或模拟退火(SA)提升局部搜索能力;
- 约束处理:集成罚函数法或可行性规则处理约束优化问题。
七、总结
NSGA-III通过参考点系统有效解决了高维目标空间的多目标优化问题,其核心在于多样性保持 和小生境选择。MATLAB实现需注意参考点生成、个体关联和选择操作的细节,适用于各类工程优化场景。
参考文献
1\] Deb K, Jain H. An evolutionary many-objective optimization algorithm using reference-point-based nondominated sorting approach, part I: solving problems with box constraints\[J\]. IEEE Transactions on Evolutionary Computation, 2014. \[2\] 郑金华, 蒋浩. 多目标进化算法及其应用\[M\]. 科学出版社, 2019.