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

NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
为了能随时了解Matlab主要操作及思想。
故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。
感谢郭伟学长提供的代码。
代码所有权归郭伟学长。
在看Matlab实现之前,请先看一下:NSGA-II多目标遗传算法概述

% q' v6 o6 f+ C# @8 u% M5 ONSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
9 P+ D$ i( g( D/ t1 A, G( f0 x①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;( r. i9 P! V5 q( Z
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;
/ ]  b" e3 |9 j0 o2 T③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。
$ X8 w6 L; @7 k( Q4 G+ H' n8 p/ Q0 l& e: u! J& M1 E6 S# T
Matlab实现:
  i0 B( ?4 v- N. P; }
7 b* c& i  b8 j3 nMATLAB  d( f( L0 n( s

! N/ D7 y( {4 ?5 ^! u4 r, Qfunction NSGAII()
8 G  z2 g% W9 T3 C' T, T, C3 wclc;format compact;tic;hold on' k6 M1 I8 k" `+ ]: q
   
8 X4 h$ a) @! K% G* E5 q%---初始化/参数设定
  F4 |" v  q# k1 @; R( e  B7 i    generations=100;                                %迭代次数' K3 R" j( V8 Q& e7 i
    popnum=100;                                     %种群大小(须为偶数)
  f6 B( `( D' i# _) _4 c) J9 f* Z    poplength=30;                                   %个体长度1 w6 r6 \# J$ A
    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值7 G3 s. W9 I9 G" H* D* G+ i
    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值    + G' n4 K4 m: c8 `% S* t; g
    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群
& ^) K+ G' i6 K' {    $ I# p) b/ z- g2 b# c! V1 C
%---开始迭代进化
) ?) r, v2 F: K3 s4 u* K    for gene=1:generations                      %开始迭代6 d1 g- U2 e% g+ t! n
        9 e, V7 Y! _4 K  Y3 i0 U% t
%-------交叉 . C7 n! U4 J  e' C3 v
        newpopulation=zeros(popnum,poplength);  %子代种群+ f3 M( f8 `) c* Y
        for i=1:popnum/2                        %交叉产生子代
; D* B& a5 _9 k8 |, z" E, S! A            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法) h9 H6 h' d3 D7 W, k& t" g  \
            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代! G( A& C  n# _- m
            newpopulation(i*2-1,:)=(population(k(1),:)+population(k(2),:))/2+beta.*(population(k(1),:)-population(k(2),:))./2;    %产生第一个子代           3 H5 o$ h( j& F! `; y- ^
            newpopulation(i*2,:)=(population(k(1),:)+population(k(2),:))/2-beta.*(population(k(1),:)-population(k(2),:))./2;      %产生第二个子代
: R. _4 G, A/ u6 Z3 `        end
' s; }) G, j( x& D8 B. H        
, r, z6 h, L9 E( v) S, o%-------变异        
. v* r& k" G6 E        k=rand(size(newpopulation));    %随机选定要变异的基因位
5 b, I( ]/ d' s) j7 p        miu=rand(size(newpopulation));  %采用多项式变异9 P$ F8 I# ?2 _  D' j4 |
        temp=k<1/poplength & miu<0.5;   %要变异的基因位
/ g6 i: K0 m- ^7 k7 ?: i; J        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);        %变异情况一6 V  A- `( ~% l! q9 u  b7 i8 |
        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));  %变异情况二
+ n/ N% o( I, P2 `" I+ f, `        
* J8 k$ e- m+ N7 R# v( k- l% y9 m%-------越界处理/种群合并        ; u) `7 K% J1 F
        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
7 a& X7 V- V+ |) S. }$ Y8 _! V        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理/ y- X( u2 T9 J; m+ G6 P( Y- ~
        newpopulation=[population;newpopulation];                               %合并父子种群
" i1 H( T0 `% v. z        9 @4 r. ~- u4 j" A5 q4 B( Y, Y
%-------计算目标函数值        
6 a+ E' U) p2 e' l8 |! K9 \& A8 ]        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1
( E4 p3 L" O) d* P( E        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值
7 @7 ]' `! v2 U8 I. h: A        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);
/ E9 J6 i! R% L* J" a8 ^5 ~        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值
& e# L- M4 |. p& d& }+ {, z        ! B1 j+ A) x5 s
%-------非支配排序        6 j  \* B8 A4 _8 `$ @6 m/ a  m
        fnum=0;                                             %当前分配的前沿面编号7 i: I% I9 B% q$ N6 g+ v" z+ A7 I
        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号
) B- W) f8 H7 @* g& c5 o$ _9 k        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号6 |8 o' S; |7 Q5 N+ n
        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序, k- U. {' k. Y9 d. K$ G
        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort
, [8 S. ]' u7 s! Y            fnum=fnum+1;
( I& j9 s' C8 _- W            d=cz;
, G( A+ D% d4 X            for i=1:size(functionvalue,1)
( a$ w$ i3 I0 z- K2 f) @, B                if ~d(i)
2 f3 R$ U3 [( t  x; T                    for j=i+1:size(functionvalue,1)6 z- e. y; ]# D' m8 D
                        if ~d(j)
4 D& u  M$ S* L! y                            k=1;                           
6 C& ]* z4 b7 I  D                            for m=2:size(functionvalue,2)
, q3 i9 m* q6 h7 h) G                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)
! A; |' m7 V& O% t                                    k=0;
- C/ _! e$ |4 R! j" ^$ f8 n( e                                    break6 s+ ]7 O! B& H" T
                                end9 v8 }+ D; z0 |( A# n& @
                            end2 D' x3 I; `, d' V5 a! o" ~
                            if k. V- w% f: v- s+ b5 P& w
                                d(j)=true;
4 j/ l- v; w% y3 c                            end* R0 Y4 T8 h( r. M3 i! C" q
                        end
% q& w, o! j( i, j. Y, u. }                    end) b8 ~( A6 f0 C
                    frontvalue(newsite(i))=fnum;9 w1 v! V& w5 t; r6 c5 R2 }
                    cz(i)=true;
+ D6 R6 B/ B5 [1 T: n! q                end
, V# A6 r( e7 r1 m5 j7 m$ D            end* i- w' I8 j+ G, k
        end
9 v' x3 S& T$ R4 M        
) J, I7 R3 y* t: `%-------计算拥挤距离/选出下一代个体        
7 Z- i0 l$ s4 j, n4 J& }. q        fnum=0;                                                                 %当前前沿面( W* R  D' x3 Y1 i9 N$ N6 p5 ~
        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群
1 I$ ^- q: ^$ {            fnum=fnum+1;0 l# |$ e1 ]* k
        end        1 O  u- L+ m% `1 C& v* _6 t8 F
        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数) m/ G2 P1 N! F  i7 b- x
        population(1:newnum,:)=newpopulation(frontvalue<=fnum,:);               %将前fnum个面的个体复制入下一代                       
  G- z" c) b% p; h        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号
7 s5 k6 ^' _  `        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离
( x6 _# _  ~- ]# P  ?& [0 L        fmax=max(functionvalue(popu,:),[],1);                                   %popu每维上的最大值
& x" u  v: O) g7 z        fmin=min(functionvalue(popu,:),[],1);                                   %popu每维上的最小值
7 W$ N8 E9 D5 b0 l; U        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离
7 c3 Y4 ]0 N$ t- g: B6 U- |; d( u            [~,newsite]=sortrows(functionvalue(popu,i));
# |; K, `* P) x$ P8 X            distancevalue(newsite(1))=inf;1 b8 g0 l* n  |
            distancevalue(newsite(end))=inf;
1 @; D1 K6 @0 a: K" P            for j=2:length(popu)-1# z- @, b' Q+ |5 W: @! Z# Q/ ?
                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));
4 S" b. s( y2 o3 b5 g' F* h            end
4 C7 J! e) o- s4 X6 Y        end                                      , R! r: q' @6 l
        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体7 u* j9 r8 O. l% D9 O" e2 O
        population(newnum+1:popnum,:)=newpopulation(popu(2,1:popnum-newnum),:);        %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        
2 j. t# t7 p2 \  l8 N3 A1 R    end
: P* ~- v" {8 e- n& ]& w, ~1 K  J: i7 z$ ]/ j  h* Y3 B
%---程序输出    ! ]0 Y3 y6 U* m" c! M
    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时6 }) X3 Q) K0 A: m- ^* {, ?2 x( l1 e
    output=sortrows(functionvalue(frontvalue==1,:));    %最终结果:种群中非支配解的函数值3 S6 _* Y" E% N7 M8 f
    plot(output(:,1),output(:,2),'*b');                 %作图. \3 b  p0 g, C$ A% @
    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')* Y) \# ~& F* T  l# u( k0 a% g' M
end7 Q) m- p  B% ~  @7 F

3 c7 v) z1 A3 m8 g- [1 D
5 D$ I8 v0 I: u7 K3 G- s

该用户从未签到

2#
发表于 2020-9-16 17:43 | 只看该作者
提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 14:50 , Processed in 0.187500 second(s), 23 queries , Gzip On.

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

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

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