多目标遗传算法NSGA-II改进策略

文章深入探讨了NSGA-II多目标遗传算法的缺点,包括非支配排序的计算复杂度、参数选择、局部最优解等问题,并提出了种群策略和选择策略的改进方法,包括佳点集生成种群和选择策略的优化。通过对比分析和代码实现,展示了改进策略对算法性能的提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        上篇写道了关于多目标遗传算法NSGA-II原理详解及算法代码实现,本文将继续在这篇文章的基础上更深一步的向前探索,探索方向为:

        基于NSGA-II算法的固有缺点,着重对其算法提出改进策略,并予以代码实现。同样,本文不灌水,希望读者是在有一定基础的前提下,再来阅读。关于基础方面的问题,可观看我上篇关于原理详解以及算法代码实现的文章,两篇文章结合一起来看。

目录

1、NSGA-II算法缺点

2、NSGA-II算法改进

2.1 种群策略改进

 2.2 选择策略改进

 3、数据案例分析

3.1 模型评价方法

3.2 改进前后对比

 4、多种模型结果对比分析

5、代码实现

6、总结


1、NSGA-II算法缺点

        NSGA-II是一个比较优秀的多目标优化算法,但它也存在一些缺点,主要包括以下几个方面:

        1. 非支配排序的计算复杂度较高:NSGA-II中的非支配排序算法需要对所有个体进行两两比较,计算其支配关系和被支配数,因此计算复杂度较高

        2. 需要选择合适的参数:NSGA-II中有一些参数需要根据具体应用场景进行调整,如交叉概率、变异概率、种群大小等。如果参数选择不当,可能会导致算法性能下降。

        3. 可能会陷入局部最优解:NSGA-II是一种基于群体的算法,其结果受到初始种群的影响。如果初始种群不够优秀,可能会导致算法陷入局部最优解

        4. 对于非凸、多峰、高维问题的处理能力有限:NSGA-II在处理非凸、多峰、高维问题时,可能会出现搜索效率低下、收敛速度慢等问题。

        5. 对于限制条件的处理能力有限:NSGA-II对于带有约束条件的优化问题的处理能力有限,可能会导致搜索空间的缩小和搜索效率的降低。

因此,在实际应用中需要根据具体问题进行选择和改进,以提高算法的性能和适用性。

2、NSGA-II算法改进

        从第一小节我们总结了该算法的一些缺点,那本小节将重点围绕其中的一些方向进行改进。

2.1 种群策略改进

        NSGA-II算法在初始化种群时使用的是随机生成。这种方法的缺点在于其随机性导致种群在空间上分布不均匀,且不确定性较大。为了消除这种不确定性并解决种群在空间分布不均匀的问题,我们引入了一种新的初始化种群方式:佳点集生成种群。

 两种初始化种群的对比示意图如下:

 2.2 选择策略改进

 3、数据案例分析

        本文所用到得函数为标准测试函数,并且通过对多个函数来测试说明

3.1 模型评价方法

3.2 改进前后对比

 我们对测试函数ZDT1进行改进前后的详细对比

对比原则:保持前后的参数不变,仅通过对比改进的效果

改进前原始NSGA-II

帕累托前沿                                                                     函数评价函数   

                                                 

单一佳点集改进测试

帕累托前沿                                                                     函数评价函数   

 

 单一基于线性排名选择改进

 帕累托前沿                                                                     函数评价函数

 混合改进

  帕累托前沿                                                                     函数评价函数

 4、多种模型结果对比分析

        从直观去评估,我们也能发现,这些改进均取得了较好的效果,我们从定量的角度来评估这些改进方式对NSGA_II的改进到底有多大。以免武断下出结论。

5、代码实现

% 参数设置 
global pop_size
global iterations;%迭代次数
target = 2;
 
% 获取种群范围
[bounds,dimension] = get_variable_bounds(x);
%种群初始化
pop = init_pop(pop_size,dimension,bounds,x);
%种群排序
pop = sort_pop(pop,target,dimension);
 
%锦标赛参数设置
parent_size = pop_size/2;
select_size = 2;
 
% 初始化函数返回数据。
% nsga2_test.m 中需要保存的数据。 如果不跑nsga2_test.m。
GD = zeros(1,iterations);
SP = zeros(1,iterations);
allpop = zeros(iterations,pop_size,dimension+4);%保存进化过程中种群的数据
 
warning off all
%迭代循环
hanshu_name = ['zdt1';'zdt2';'zdt3';'zdt4';'zdt6'];
for i = 1:iterations
    %选择父代
    %parent_pop = select_parent(pop,parent_size,select_size);
    parent_pop = select_parent(pop,0,2,parent_size);
    %进行遗传算法,杂交变异
    child_pop = myga(parent_pop,dimension,bounds,x);
    % child_pop = MyGA_mutate(parent_pop,dimension,bounds,i,iterations,x);
    %子代和原始种群进行合并
    pop = combined_pop(pop,child_pop,target,dimension);
    %对合并种群进行非支配排序
    pop = sort_pop(pop,target,dimension);
    %选择新一代种群
    pop = select_pop(pop,target,dimension,pop_size);
    
   %画出种群迭代的过程。只运行naga2_main的的时候,可以画出单个测试函数的变化
    plot(pop(:,dimension+1),pop(:,dimension+2),'*')
    grid on
    title(['NSGA2联合改进测试',hanshu_name(x,:),'第 ',num2str(i),' 代结果'])
    pause(0.1) 
    
    %保存数据,计算每一代的GD和SP,也可以通过保存allpop后单独计算
    allpop(i,:,:) = pop;
    GD(1,i) = calculate_gd(pop,x);
    SP(1,i) = calculate_sp(pop);
end

6、总结

        本文仅是穿针引线,为大家提供了一个思路,改进的方法大多是先去研究这个算法的缺点是什么?这个算法的执行步骤是什么,以及操作算子是什么?结合这几点我们就可以实现改进的方式。

        我想,改进的方法还会有很多,如变异改进等,常规的自适应改进,其实我也跑通了,即是说对传统的NSGA-II算法,基本每个算子都可以改进,只是看你改进完后效果有没有提升,

如有想要交流,沟通,可私信!

        前面基本都是使用的函数案例进行求解,接下来,我们将会使用具体的案例来进行描绘,敬请期待

下期预告:

        NSGA-II求解双目标的路径规划问题案例

        NSGA-II求解三目标的分布式电源的选址定容案例

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

且行且安~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值