找回密码
 注册
关于网站域名变更的通知
查看: 472|回复: 1
打印 上一主题 下一主题

NSGA2 算法Matlab实现

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-6-2 14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 uqHZau 于 2020-6-2 14:09 编辑
  B( M: N. o, T( \, u" J2 G1 V; {7 Z  H2 p  T, C  h- U
为了能随时了解Matlab主要操作及思想。
! }0 }8 S4 _$ k& A2 Q. Z- ]+ r. r" a5 O
故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。 - d* b& z3 p9 m9 F; W- x2 X# Z

+ W! W7 S! M/ g, r) t1 ^+ n* F2 NNSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
" [5 Q3 ?7 g9 K% ?/ T: K①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体; ' ?6 C/ ?) c3 \% x8 @# }# E' Z
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度; 0 h+ S% ~- n# D" H- F
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。
% J$ ^! W  e2 @" U' ~: F: ]  [4 v8 L' T: a  Q
Matlab实现:  E4 t0 c" {5 p" W; ^

) \8 M8 Z2 s( ]& [  p2 \9 e, ^% Tfunction NSGAII(); I8 s  _) X; x1 O# K/ K6 ?
clc;format compact;tic;hold on
0 t" Y) [1 S% ?- c! {# P) C) r
' `5 f1 e( d8 y* _5 L  e+ i%---初始化/参数设定
3 z, D  k" S7 f    generations=100;                                %迭代次数) B6 \# X2 C1 m
    popnum=100;                                     %种群大小(须为偶数)" ]' ^" E: _/ _
    poplength=30;                                   %个体长度8 a+ g% b6 C7 y- Z+ Z
    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值
, S% q, y8 Y2 w( F4 A" |    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值    + N& U! {9 v5 D( \2 T
    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群# g, ^/ K2 V$ Z  M9 s" T

$ j( {6 o* x3 b+ k' L%---开始迭代进化0 l/ C4 o: q- _* h+ s7 f
    for gene=1:generations                      %开始迭代, k% _" z: f  g# y3 j- f
: i- L* n- n3 S& D$ X( {" I4 v  [6 S
%-------交叉
: d5 M4 l, v7 b9 q9 C: i0 V        newpopulation=zeros(popnum,poplength);  %子代种群
/ f2 d7 N9 ?/ m  J: q/ F        for i=1:popnum/2                        %交叉产生子代
. ?  B; W( W0 ~7 u$ M; Y( o            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法
3 c9 W0 W3 l1 F$ m' F9 y! _            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代3 b, \2 S# m, i) D* [
            newpopulation(i*2-1,: )=(population(k(1),: )+population(k(2),: ))/2+beta.*(population(k(1),: )-population(k(2),: ))./2;    %产生第一个子代           
) a4 [* n7 l* O. Z: C# c1 T5 n8 V7 |            newpopulation(i*2,: )=(population(k(1),: )+population(k(2),: ))/2-beta.*(population(k(1),: )-population(k(2),: ))./2;      %产生第二个子代
; ]0 l! C8 X" E* ]        end
' [: Y* c! O2 O  W+ o; v" h6 @) o1 c1 N5 H
%-------变异        
) g% w3 v( ?" Z        k=rand(size(newpopulation));    %随机选定要变异的基因位
& [9 R: w. f4 i7 ^$ K# w        miu=rand(size(newpopulation));  %采用多项式变异# W" }" S) w1 o  {  |, B* ]( A! I0 O
        temp=k<1/poplength & miu<0.5;   %要变异的基因位7 B* n: w8 w8 D3 S
        newpopulation(temp)=newpopulation(temp)+(maxvalue(temp)-minvalue(temp)).*((2.*miu(temp)+(1-2.*miu(temp)).*(1-(newpopulation(temp)-minvalue(temp))./(maxvalue(temp)-minvalue(temp))).^21).^(1/21)-1);        %变异情况一8 W3 P+ d" g2 r9 p) m2 q, F
        newpopulation(temp)=newpopulation(temp)+(maxvalue(temp)-minvalue(temp)).*(1-(2.*(1-miu(temp))+2.*(miu(temp)-0.5).*(1-(maxvalue(temp)-newpopulation(temp))./(maxvalue(temp)-minvalue(temp))).^21).^(1/21));  %变异情况二9 R" g/ U1 |' |
1 H5 @' f8 l" a2 z; {
%-------越界处理/种群合并        
( y! h6 q% d/ |  {        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
& A, R8 q" h; ]        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理
" h, D  Y. G: f) l' Z+ M        newpopulation=[population;newpopulation];                               %合并父子种群
7 y% K% G, N  p+ g) Z
$ k2 Z) |  E2 m" ^+ t%-------计算目标函数值        ' |! A; K0 B. Z/ h9 ~- l
        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1. T! _8 A  D4 [) w& M7 H1 ]
        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值
4 x4 Q* ^8 ?. X# p        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);
$ M" b8 r# i1 \' m; F+ F( F( i        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值
3 k; @2 B9 ~5 e. K4 C
$ Z4 K( j$ B" z: R( y, ~- q%-------非支配排序        
" c% B2 B$ X" N- _3 m% n, R        fnum=0;                                             %当前分配的前沿面编号
% A9 ?1 n( A+ j8 P' ]        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号
4 p" Y( n: _" A8 _        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号, l5 C4 k/ r7 T6 H7 k" ^
        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序
  W' J0 a4 S4 t4 o  r) ?: `( Z$ L        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort
6 W% ^. A, D+ C9 X            fnum=fnum+1;, c7 C0 A1 A* F' O
            d=cz;
# O) s" N( }7 f9 K! q/ J# D# u            for i=1:size(functionvalue,1)
" O4 \8 r! w* U- o3 |                if ~d(i)- J9 f5 e% m0 l$ F" a( K
                    for j=i+1:size(functionvalue,1)2 I6 Y6 \' C3 p
                        if ~d(j)5 s: |5 G* m% r) J6 z$ q; O
                            k=1;                            : W  W& t& h: s: _& p4 q" j. C
                            for m=2:size(functionvalue,2)
4 o2 v1 Q8 y, n" }! S& V                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)
+ p" Z$ `. m7 W                                    k=0;' E% G7 v- T4 I# ]' j" \8 C2 [0 g& J
                                    break
3 x) \" a6 p" D$ g7 \4 w7 f; N- w                                end
. w0 i0 c" C# J" K2 q# p! ]                            end
2 x( s$ P# Z6 v                            if k
- d2 ?5 I3 M: m5 x. o                                d(j)=true;( l- c: u0 ]' L( L* ^3 t/ h
                            end
' P/ O1 O% {+ }1 M1 S8 Z                        end
! x0 |; ]) j* Y8 Y                    end+ S0 E6 P- N+ t, n) w
                    frontvalue(newsite(i))=fnum;3 ~9 |/ E. V0 _( z! ]2 p) J$ ?
                    cz(i)=true;3 t( n* Z4 [' _* _9 X
                end$ q) T* y4 ~" m% u
            end
! `0 ^0 R$ J. [, M  s        end6 V& O( w0 a$ S2 \- T0 o
; Y3 ~) L  y; v+ l
%-------计算拥挤距离/选出下一代个体        
5 \; ~9 B1 k5 z+ b. ^        fnum=0;                                                                 %当前前沿面
% q9 e( c& `3 V        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群
0 _( y6 P( ^+ t3 Z/ _            fnum=fnum+1;
0 z9 D0 u. r' f# T# }        end        
( L9 c2 r* R3 N" S" |        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数
8 u' U' G, K# z; M; W! P        population(1:newnum,: )=newpopulation(frontvalue<=fnum,: );               %将前fnum个面的个体复制入下一代                       
8 e& T6 `( M8 m; v& D8 c        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号
7 a1 [0 @7 t8 D% W( ^        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离
# l! [9 V+ v- x+ E        fmax=max(functionvalue(popu,: ),[],1);                                   %popu每维上的最大值
: j9 m8 @$ ?. b1 `: k        fmin=min(functionvalue(popu,: ),[],1);                                   %popu每维上的最小值; T$ _3 e1 c; R+ m7 m! C: ?
        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离. l9 [  T. q1 D/ w. C
            [~,newsite]=sortrows(functionvalue(popu,i));
; l5 b$ }( O: D) v$ B            distancevalue(newsite(1))=inf;
! E& F. p; o! `4 n/ H4 ~8 p1 A; Z            distancevalue(newsite(end))=inf;3 s2 K. U  l9 W% {$ n
            for j=2:length(popu)-1# j: Y& o5 `- D7 Q4 M5 Y  S
                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));
7 n. i. r8 @$ `) x- n: D% G& A; `" e            end. j1 C7 l7 N) |9 w  F
        end                                      & [; U' u7 c0 D0 z
        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体
) {) y. z" i7 }0 P/ ]        population(newnum+1: popnum,: )=newpopulation(popu(2,1: popnum-newnum),: ); %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        
9 e! w- T0 _0 T# N    end4 {& f# H7 O  ]- [2 I, \( q

6 L: M: t; V) n7 @* g%---程序输出   
$ r, I$ K) L7 J4 F, M: r. D6 v    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时
; k% ?( e0 {+ A' W    output=sortrows(functionvalue(frontvalue==1,: ));    %最终结果:种群中非支配解的函数值
. Y  p: O0 ]* c7 H. V' V8 S6 k    plot(output(:,1),output(:,2),'*b');                 %作图8 f8 p1 f; H0 m6 p, l* W# |" s
    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')
5 c$ D- n7 l/ ^: Hend
/ l7 r9 Z+ ^6 E& ?8 j' U' K- A+ K# f) q4 \# ~

% c- g5 c' v9 V% s& C
# N8 K! y3 v2 |& k; c4 j* b

该用户从未签到

2#
发表于 2020-6-2 14:53 | 只看该作者
NSGA2 算法Matlab实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-18 13:26 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表