NSGA_2总结梳理附代码按行详细注解

做实验需要解决多目标优化问题,之前也没用过Matlab,看代码也是学习Matlab语法的过程,所以很详细的注解了基本上每一行代码,下面代码亲测可以直接运行,如果有问题的地方欢迎指正。

下面代码可能有些长,主要是注释加的比较多,如果想要替换函数的话,直接在evaluate_objective里替换,在主函数里修改M和V即可

目录

一.NSGA-2算法简介

二.NSGA-2算法整体流程图

三.算法及各函数讲解

1.主函数:nsga_2_optimization

2.目标函数:evaluate_objective

3.初始化代码:initialize_variables

4.快速非支配排序和拥挤度计算代码:non_domination_sort_mod

5.锦标赛选择过程:tournament_selection

6.交叉 变异代码:genetic_operator

7.生成新的种群(精英策略):replace_chromosome


一.NSGA-2算法简介

SGA2主要是对NSGA算法的改进。NSGA是N. Srinivas 和 K. Deb在1995年发表的一篇名为《Multiobjective function optimization using nondominated sorting genetic algorithms》的论文中提出的该算法在快速找到Pareto前沿和保持种群多样性方面都有很好的效果,不过在这么多年的应用中也出现了如下的一些问题:

1。非支配排序的时间复杂的很大,为O(MN3)。其中M为目标函数的数量,N为种群规模。

2。不支持精英策略。精英策略在保持好的个体及加速向Pareto前沿收敛方面都有很好的表现。

3。需要自己指定共享参数。该参数将对种群的多样性产生很大的影响。

关于MOP的理解可参考另一篇博客:https://blog.csdn.net/qq_39552268/article/details/111656270

二.NSGA-2算法整体流程图

流程图各个步骤旁边的是函数名对应下面的各个算法函数名

这是最终跑出的结果:

三.算法及各函数讲解

1.主函数:nsga_2_optimization

function nsga_2_optimization
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pop = 200; %种群数量
gen = 500; %迭代次数
M = 2; %目标函数数量
V = 30; %维度(决策变量的个数) 决策变量就是解的个数
min_range = zeros(1, V); %下界 生成1*30的个体向量 全为0
max_range = ones(1,V); %上界 生成1*30的个体向量 全为1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
chromosome = initialize_variables(pop, M, V, min_range, max_range);%初始化种群
chromosome = non_domination_sort_mod(chromosome, M, V);%对初始化种群进行非支配快速排序和拥挤度计算


for i = 1 : gen
    pool = round(pop/2);%round() 四舍五入取整 交配池大小
    tour = 2;%竞标赛  参赛选手个数
    parent_chromosome = tournament_selection(chromosome, pool, tour);%竞标赛选择适合繁殖的父代
    mu = 20;%交叉和变异算法的分布指数
    mum = 20;
    %% parent_chromosome 竞标赛选择的适合繁殖的父代 M 目标函数数量 V维度(决策变量的个数)      mu = 20;%交叉和变异算法的分布指数    mum = 20; 
    %%min_range = zeros(1, V); %下界 生成1*30的个体向量 全为0 
    %%max_range = ones(1,V); %上界 生成1*30的个体向量 全为1  这个在这里用来约束解(Xi)的范围
    %%offspring_chromosome不一定生成了500个后代
    offspring_chromosome = genetic_operator(parent_chromosome,M, V, mu, mum, min_range, max_range);%进行交叉变异产生子代 该代码中使用模拟二进制交叉和多项式变异 采用实数编码
    [main_pop,~] = size(chromosome);%父代种群的大小
    [offspring_pop,~] = size(offspring_chromosome);%子代种群的大小
    
    clear temp
    intermediate_chromosome(1:main_pop,:) = chromosome;
    intermediate_chromosome(main_pop + 1 : main_pop + offspring_pop,1 : M+V) = offspring_chromosome;%合并父代种群和子代种群
    intermediate_chromosome = non_domination_sort_mod(intermediate_chromosome, M, V);%对新的种群进行快速非支配排序
    %%精英选择 从子代和父代中选出Pop个
    chromosome = replace_chromosome(intermediate_chromosome, M, V, pop);%选择合并种群中前N个优先的个体组成新种群
   %%每计算100代清空下控制台
    if ~mod(i,100)
        clc;
        fprintf('%d generatio
您可以使用引用提供的两个NSGA_II的Matlab代码中的一个来实现NSGA_II算法。这两个代码中的一个与原论文算法基本相同,另一个对算法使用的算子进行了改进。在相同的迭代次数下,改进后的代码相比原始代码具有更快的运行速度和更好的收敛性。 其中,引用提供了一个名为non_domination_sort_mod的函数,该函数用于根据非支配性对当前种群进行排序。它根据个体之间的支配关系为个体分配等级,并计算每个前沿中的拥挤度。 另外,如果目标空间的维度可视化,您可以使用引用提供的代码来可视化结果。如果目标函数的维度是2,可以使用plot函数绘制二维图形;如果目标函数的维度是3,可以使用plot3函数绘制三维图形。 综上所述,您可以使用非主导排序和目标函数来实现NSGA_II算法,并根据需要使用可视化代码来可视化结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [nsga2的Matlab代码](https://download.csdn.net/download/qq_43472569/64537795)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [NSGA_2 Matlab 算法详解完整代码 中文注释详解](https://blog.csdn.net/weixin_42462804/article/details/84866708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值