非支配排序遗传算法NSGA-III详解与MATLAB实现

一、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 算法流程

  1. 初始化 :随机生成初始种群P0P_0P0,设置参考点集ZZZ。
  2. 非支配排序:对种群进行非支配排序,得到不同等级的前沿面F1,F2,...。
  3. 参考点关联:将每个个体与最近的参考点关联,计算参考点关联的个体数量。
  4. 选择操作:优先选择高层级前沿面个体,通过小生境技术(参考点关联)选择个体,保持多样性。
  5. 交叉变异:对选中的个体进行交叉(如模拟二进制交叉SBX)和变异(如多项式变异),生成子代种群Qt。
  6. 环境选择 :合并父代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 典型应用领域

  1. 工程设计:多目标优化(重量、强度、成本);
  2. 能源系统:微电网经济性、环保性、可靠性多目标调度;
  3. 机器学习:超参数优化(精度、训练时间、模型复杂度);
  4. 物流规划:配送路径、成本、时效多目标优化。

6.2 扩展方向

  1. 动态NSGA-III:引入时间变量,适应动态变化的优化目标;
  2. 并行NSGA-III:利用GPU或多核CPU加速种群评估;
  3. 混合算法:结合粒子群优化(PSO)或模拟退火(SA)提升局部搜索能力;
  4. 约束处理:集成罚函数法或可行性规则处理约束优化问题。

七、总结

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.

相关推荐
ballball~~2 小时前
ISP-Tone Mapping
图像处理·算法·isp
米粒12 小时前
力扣算法刷题 Day22
算法·leetcode·职场和发展
科德航空的张先生2 小时前
飞行错觉(空间定向障碍)地面模拟训练系统
人工智能·算法
老四啊laosi2 小时前
[双指针] 2. 力扣--复写零
算法·leetcode·双指针·复写零
ballball~~2 小时前
ISP-Gamma
图像处理·算法·isp
机器学习之心2 小时前
HHO-LSBoost哈里斯鹰算法优化最小二乘提升多输入回归预测MATLAB代码
算法·matlab·回归·hho-lsboost
ballball~~2 小时前
ISP-Demosaic
图像处理·数码相机·算法
m0_730115112 小时前
C++中的装饰器模式实战
开发语言·c++·算法
m0_743470372 小时前
C++中的适配器模式
开发语言·c++·算法