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

NSGA2 算法Matlab实现

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 uqHZau 于 2020-6-2 14:09 编辑
0 G- H" v! J) |* p, X4 Z  R, \$ @' U* K* o! Y, _/ e
为了能随时了解Matlab主要操作及思想。# u' e9 B+ i% ]' ?* f) C0 u
& q! {% u  n  ~" L4 Y. W* w2 v
故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。
# x: x% ~' s% y, a1 h4 v1 Q; Y5 b1 u; v. b
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
3 W# O$ u: G( P) ?6 L. e+ b①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;
3 c- Z& Y* i) f, D) L- l; e2 I②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;
2 \" O( ]5 c8 e③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。$ {8 N* G; O: e- n! j+ k

8 R) n6 P  m( M( a  X1 q9 q; f2 J# @Matlab实现:
) H' ]7 M8 C7 f  F5 R- P0 O5 m: k0 x5 v% C) X
function NSGAII()+ H, q* N+ P" T7 Z5 K) _
clc;format compact;tic;hold on- {6 M0 S, n% G2 S

% ^0 ]3 }6 H# F1 _% P%---初始化/参数设定
* B7 H+ S: M- g9 z( P, [    generations=100;                                %迭代次数9 c- W; Q9 o2 g; N
    popnum=100;                                     %种群大小(须为偶数)/ e6 x9 y( z$ ]7 p' e
    poplength=30;                                   %个体长度
/ O/ M& V& H9 L    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值
* w$ e! y1 ?) f& L2 T3 I    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值   
, \/ V; S' V' g. j8 S$ J    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群
2 N2 `2 f# [5 c
. U+ d" W. Z& C) m%---开始迭代进化" @" `2 L! N* t4 z( x6 `
    for gene=1:generations                      %开始迭代
+ }  G% I4 W1 \8 N& d
' u6 G; k! H/ P& a+ Z1 G%-------交叉 ' J9 S" N( e7 a2 X7 M9 C
        newpopulation=zeros(popnum,poplength);  %子代种群  F- Z( P9 W( g/ i1 x! ?& l' y
        for i=1:popnum/2                        %交叉产生子代- Q6 K3 O" }+ Y/ f5 T* l4 ?/ ~
            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法  I' ^& e, c; N/ r  k5 q" d
            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代
$ L2 W; a4 x$ m: k: `            newpopulation(i*2-1,: )=(population(k(1),: )+population(k(2),: ))/2+beta.*(population(k(1),: )-population(k(2),: ))./2;    %产生第一个子代           8 y% p( X9 Q4 F: m3 y
            newpopulation(i*2,: )=(population(k(1),: )+population(k(2),: ))/2-beta.*(population(k(1),: )-population(k(2),: ))./2;      %产生第二个子代, r  ]) O1 }2 d- C1 y' {7 Q+ Q: I
        end1 a) ?( `! S/ R2 S

( W' V* A5 \- e8 L9 _4 @- W%-------变异        ; J/ u" ]" L# v5 V
        k=rand(size(newpopulation));    %随机选定要变异的基因位
! z, L( Y' s7 n        miu=rand(size(newpopulation));  %采用多项式变异
- U: p* D$ N3 S! }; @/ O0 }        temp=k<1/poplength & miu<0.5;   %要变异的基因位0 @, D/ g) O2 ^! Q' y7 B% t& r5 g. D7 r0 r
        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);        %变异情况一* g$ X9 ^) k+ V1 O7 ]
        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));  %变异情况二
3 `& B$ E; j& V8 V  a/ f/ r) b
) g* C' e5 q  h2 |- a%-------越界处理/种群合并        
0 r2 X# {8 e1 g* C  e# h# m+ T# Y        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
. _$ [( C0 R. ^+ b* T$ A. k. R% W' B        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理; o& S: o# @" N0 W- `
        newpopulation=[population;newpopulation];                               %合并父子种群/ W3 ~" i8 F- M  [

) e$ _! X, ^& ^- u" W" a%-------计算目标函数值        . Y7 m0 X2 J1 I) {7 h  P' r
        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1; C2 t7 }- E; Z5 ^9 M' m: ]
        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值4 N/ o$ k( p5 ?" ]$ o
        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);
8 l8 H4 I3 E- K/ t" h        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值- m- |% n: M* y0 }# _

7 v* B* T& B! y%-------非支配排序        4 {; h1 X. ?1 [  ^5 q! X  M! O
        fnum=0;                                             %当前分配的前沿面编号
4 G( x; W6 x" D: q8 r, f        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号0 V, ?" [0 J5 C
        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号. S* W2 Z6 O( o
        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序
4 z$ @& v, }6 O% F: ?        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort
$ v1 |: X0 w! P. S            fnum=fnum+1;
7 s' ~3 U+ ^8 I  J. S  F            d=cz;1 u7 y& N3 `6 z& N$ T6 S
            for i=1:size(functionvalue,1)  D3 J9 M9 ^( d) q3 p; a7 h
                if ~d(i). R5 t% r8 @, [9 I, P
                    for j=i+1:size(functionvalue,1)
3 T2 i: M4 p0 `. B                        if ~d(j)9 b% B, E  M, a! r: E
                            k=1;                           
8 Y: z; y& _' s4 n8 I9 f; s                            for m=2:size(functionvalue,2)7 c- W. W9 H" [/ C7 p1 S" S" h5 N
                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)
# C0 E5 }2 y0 N; h                                    k=0;0 ]0 C8 K9 z* [7 @
                                    break- x1 Q( Y6 W0 Z; D
                                end# O0 O2 Y5 Z1 e+ z. o
                            end
9 B0 H' K/ t# {" c                            if k
( \6 C( O8 t; _5 c                                d(j)=true;
3 ^& i6 [% Z7 l$ d                            end/ ?! p  ?9 G9 _. ?8 x* v, s4 F6 y& P
                        end
0 q5 f: y& j. h8 A( c0 D2 h! @                    end
+ K, t* P% @* v1 Q& [6 ~- Z' |* W# ~                    frontvalue(newsite(i))=fnum;0 Q+ b* w4 ^/ j' H2 Q7 L2 y
                    cz(i)=true;
* C8 h9 F: t$ K2 H8 j  T                end4 l% [+ w* C8 g5 d# f5 t
            end" s7 T8 G7 M; T0 a
        end
6 a" f& V) K- W0 F0 v7 P; p/ O! n# L: h( a  v
%-------计算拥挤距离/选出下一代个体        
1 z6 d4 Y* Y" s9 O9 e4 K        fnum=0;                                                                 %当前前沿面
2 U! R4 U* E& m& P5 p* w        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群
9 H; U1 X: H5 p2 H9 m            fnum=fnum+1;) X$ O2 p; v, y
        end        % t# [! S$ K8 C5 W& _% Y
        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数" V& B( l6 r' ], P/ P+ W
        population(1:newnum,: )=newpopulation(frontvalue<=fnum,: );               %将前fnum个面的个体复制入下一代                       
2 r6 q2 s$ L) y  ~        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号
: n# u1 V- d! y: W; B' |/ f& W        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离( Q  V' J" \! Q3 r# Z
        fmax=max(functionvalue(popu,: ),[],1);                                   %popu每维上的最大值
, _% t: V! n) H4 F        fmin=min(functionvalue(popu,: ),[],1);                                   %popu每维上的最小值
# D0 `7 T) A1 H$ ]- D        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离
$ t  ]/ o" ~# O' a            [~,newsite]=sortrows(functionvalue(popu,i));
& ]$ R1 M. U7 T4 U; v. y3 c* W            distancevalue(newsite(1))=inf;
6 a/ t0 N2 n0 k- l" d4 F            distancevalue(newsite(end))=inf;( x* o, @/ k; F& P& m; A% v& ~
            for j=2:length(popu)-1
, g# `! i5 ?& D. A6 m7 v1 [; L                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));
8 t. z, O3 M) \& {/ R: L            end
2 [( n. B/ D6 B- G! c. j5 f' T        end                                      
0 ]- o3 V$ m. i; g& \        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体
' C& H0 t5 P( m        population(newnum+1: popnum,: )=newpopulation(popu(2,1: popnum-newnum),: ); %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        1 y! X+ ~) M! w: ^( J6 R
    end
2 e0 a2 k" S0 H4 N* z; }1 H- P
/ z/ ?" d, J% C& z2 s%---程序输出   
' ]: B8 a7 Q) ?    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时
! V+ K" J! Y# r; P    output=sortrows(functionvalue(frontvalue==1,: ));    %最终结果:种群中非支配解的函数值& B- X7 `' t( V, b, w0 u- c& l# C
    plot(output(:,1),output(:,2),'*b');                 %作图8 y. J  X/ z6 b
    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')) T- O) c8 P. K' y1 a
end( f9 _/ \! A2 ~/ y
- Y5 z3 {& z% R' a' h

  D% Z" w* j8 |1 Y, h4 ]+ g
; y2 |& m7 ^5 {: m0 m# J

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-6 00:31 , Processed in 0.203125 second(s), 24 queries , Gzip On.

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

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

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