多目标优化算法之非支配遗传算法NSGA-Ⅱ,免费MATLAB代码获取

非支配遗传算法NSGA-Ⅱ1 引言

NSGA-II :nondominated sorting genetic algorithm II,非支配排序遗传算法2

提出原因:

传统的使用非支配排序和共享的多目标进化算法受到批评的主要原因是:

1)计算复杂性为O(MN3)(其中M是目标的数量,N为种群规模);

2)非精英(nonelitism)方法;

3)需要指定共享参数。

因此,作者提出了NSGA-II,可以有效解决上述问题,将计算复杂度降为O(MN2),并提出了快速非支配排序过程(fast nondominated sorting procedure),精英保留策略(elitist-preserving approach)和无参数小生境算子(parameterless niching operator)。相比于其他方法,NSGA-II 能够在真正的帕累托最优前沿附近找到更好的解决方案并具备更好的收敛性。

NSGA-Ⅱ原文链接:

https://ieeexplore.ieee.org/abstract/document/996017

NSGA采用的非支配分层方法,可以使好的个体有更大的机会遗传到下一代;适应度共享策略则使得准Pamto面上的个体均匀分布,保持了群体多样性,克服了超级个体的过度繁殖,防止了早熟收敛。

272571184592f5d52e74a1af3dcebc0a.png

免费代码获取,后台回复关键词:

多目标01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
NSGA-II(Non-dominated Sorting Genetic Algorithm II)是一种常用的多目标优化算法,它是基于遗传算法的一种改进算法NSGA-II算法通过非支配排序和拥挤度距离来维护种群的多样性,从而有效地解决了多目标优化问题。下面是NSGA-II算法Matlab代码实现: ``` function [pop,fit] = nsga2(pop,fit,n,m,popsize,pcross,pmut) % NSGA-II算法 % 输入: % pop - 种群 % fit - 种群适应度 % n - 变量个数 % m - 目标个数 % popsize - 种群大小 % pcross - 交叉概率 % pmut - 变异概率 % 输出: % pop - 新种群 % fit - 新种群适应度 % 计算拥挤度距离 function d = crowding_distance(f) [m,n] = size(f); d = zeros(m,1); for i = 1:n [~,idx] = sort(f(:,i)); d(idx(1)) = inf; d(idx(end)) = inf; for j = 2:m-1 d(idx(j)) = d(idx(j)) + (f(idx(j+1),i)-f(idx(j-1),i))/(f(idx(end),i)-f(idx(1),i)); end end end % 非支配排序 function [F,S] = non_domination_sort(f) [m,n] = size(f); F{1} = []; S{1} = zeros(m,1); n(1) = 0; for p = 1:m S{1}(p) = 0; for q = 1:m if all(f(q,:)<=f(p,:)) && any(f(q,:)<f(p,:)) S{1}(p) = S{1}(p) + 1; end end if S{1}(p) == 0 F{1} = [F{1} p]; n(1) = n(1) + 1; end end i = 1; while ~isempty(F{i}) Q = []; for p = F{i} for q = 1:m if all(f(q,:)<=f(p,:)) && any(f(q,:)<f(p,:)) S{1}(q) = S{1}(q) - 1; if S{1}(q) == 0 Q = [Q q]; n(i+1) = n(i+1) + 1; end end end end i = i + 1; F{i} = Q; end end % 选择操作 function [pop,fit] = selection(pop,fit,n,m,popsize) [m,n] = size(fit); F = non_domination_sort(fit); newpop = []; newfit = []; i = 1; while length(newpop) + length(F{i}) <= popsize % 按拥挤度距离排序 cd = crowding_distance(fit(F{i},:)); [~,idx] = sort(cd,'descend'); newpop = [newpop; pop(F{i}(idx),:)]; newfit = [newfit; fit(F{i}(idx),:)]; i = i + 1; end if length(newpop) < popsize cd = crowding_distance(fit(F{i},:)); [~,idx] = sort(cd,'descend'); newpop = [newpop; pop(F{i}(idx(1:popsize-length(newpop))),:)]; newfit = [newfit; fit(F{i}(idx(1:popsize-length(newpop))),:)]; end pop = newpop; fit = newfit; end % 交叉操作 function pop = crossover(pop,pcross) [m,n] = size(pop); for i = 1:2:m if rand < pcross j = randi(n-1); pop(i:i+1,j+1:end) = pop(i+1:-1:i,j+1:end); end end end % 变异操作 function pop = mutation(pop,pmut) [m,n] = size(pop); for i = 1:m if rand < pmut j = randi(n); pop(i,j) = rand; end end end % 主程序 pop = rand(popsize,n); fit = zeros(popsize,m); for i = 1:popsize fit(i,:) = objfun(pop(i,:)); end for i = 1:100 pop = [pop; crossover(pop,pcross)]; pop = mutation(pop,pmut); for j = popsize+1:size(pop,1) fit(j,:) = objfun(pop(j,:)); end [pop,fit] = selection(pop,fit,n,m,popsize); end end ``` 其中,objfun是目标函数,需要根据具体问题进行定义。在使用该代码时,需要将objfun替换为自己定义的目标函数,并设置好其他参数。此外,该代码实现了非支配排序、拥挤度距离和选择操作,可以有效地维护种群的多样性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天吃饺子

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值