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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

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

; \4 R. m9 |1 RNSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
3 w2 A" C# x1 P9 u$ J  X①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;6 M5 [8 x" i8 h3 g
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;: E# P4 t3 l1 |8 `* i( T
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。" [# _! k( e; k2 a8 a* F; Z

3 v0 p- E6 M/ F& a9 lMatlab实现:
! \0 O" s4 p9 a3 R
8 b6 Z: F3 a0 l0 XMATLAB' ?- U5 [; @  O. [: H6 A, I
: l) m0 `9 n4 G( A, k7 K1 n
function NSGAII()
# W( E' h0 X1 u) Iclc;format compact;tic;hold on
4 G. s8 f) ~5 ~; o    2 h# Q# b' k% q/ p2 i
%---初始化/参数设定
  ^5 I2 A4 u  w    generations=100;                                %迭代次数6 K7 r7 C# `) K3 a" e
    popnum=100;                                     %种群大小(须为偶数)  R, o" r% U7 W0 q& A, N- E
    poplength=30;                                   %个体长度: [7 p# y, ^% Y' h4 X( l; Q) H
    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值
* T7 }% H+ V  s3 _- Q2 Y    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值   
* Y/ N  W8 P. c  E    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群/ n6 t1 V1 W# f, y# W# V
      W& y3 N9 _3 z) J  o
%---开始迭代进化
) Q/ _+ [$ C6 o+ F% H" U    for gene=1:generations                      %开始迭代+ D2 _+ D; u7 q
        + T9 j; n2 Z* u' I1 x! o: h
%-------交叉
! z$ D& Q& g4 S  R5 o        newpopulation=zeros(popnum,poplength);  %子代种群
/ L) m2 A4 c- S2 b        for i=1:popnum/2                        %交叉产生子代
+ _$ o# _  N4 H' b7 X4 W7 y            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法0 f7 n: {  M. t7 J9 x
            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代( [! i8 \5 K7 K4 R! G
            newpopulation(i*2-1,:)=(population(k(1),:)+population(k(2),:))/2+beta.*(population(k(1),:)-population(k(2),:))./2;    %产生第一个子代           + ], E" u5 f2 }( G% X4 ^: z
            newpopulation(i*2,:)=(population(k(1),:)+population(k(2),:))/2-beta.*(population(k(1),:)-population(k(2),:))./2;      %产生第二个子代6 n" X" G9 q1 x( C
        end3 d: Z( ~; B% y- ^0 B& o
        . H2 ^4 Q/ |0 w& ?! N% D
%-------变异        
0 n" z( Y8 j" D& q        k=rand(size(newpopulation));    %随机选定要变异的基因位
/ v. _/ K7 D4 t        miu=rand(size(newpopulation));  %采用多项式变异
& t9 H! n9 C/ _6 M9 g        temp=k<1/poplength & miu<0.5;   %要变异的基因位
. ?7 g6 K* k; l' ?9 I        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);        %变异情况一
0 D* p; ^5 F  e        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));  %变异情况二
4 x/ r4 ^& x- n0 G  H        5 i+ l9 X0 j; z* N9 Q6 y
%-------越界处理/种群合并        
' q% @7 W" |" o. g: `1 _; p        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理& D! n6 W2 Z: J4 B% v: k8 y
        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理- P/ [) D9 m6 o
        newpopulation=[population;newpopulation];                               %合并父子种群
* w! `: A' w/ ?( O) ~6 Y5 j        9 T6 \3 ~% @% ?* ?( f
%-------计算目标函数值        6 F6 Z  D. ^# l+ H* K
        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1
4 `+ }" d& T* H4 k! v/ d3 I        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值
5 U0 ^# F- y3 s% J0 b; ?+ _: `        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);; {8 w. K- B! Q* b. V3 G' b2 d; s
        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值2 O9 ^5 K; ]" _" ^
        
# c" Y$ B: X1 @, [. S0 W2 @) p1 T%-------非支配排序        8 i" U0 [) o+ \" j# Z. b
        fnum=0;                                             %当前分配的前沿面编号# }  C% ?% a- n% K+ R; F( o8 g
        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号& q7 [$ t5 P5 O- R
        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号
9 b! p2 U% R" V! w        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序% o$ E$ E8 d+ I0 b" |. \# M
        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort9 z$ U0 G) \: U4 L2 v9 _
            fnum=fnum+1;- {  Z# R5 W0 W4 K
            d=cz;& W0 j9 {+ B' y
            for i=1:size(functionvalue,1)
2 E7 T" w7 Y! K: P9 I                if ~d(i), C6 G' \) V- n
                    for j=i+1:size(functionvalue,1)
8 n' T6 a( H* X' R                        if ~d(j)9 w$ s: m6 @0 l8 c* {
                            k=1;                           
& K( T- s) i7 }$ N( ]* n% u+ E                            for m=2:size(functionvalue,2)
3 [6 G5 E' T/ N3 |; l                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m). g7 T; z7 U7 O5 j( O
                                    k=0;
" X9 r; D9 }  l8 Q                                    break4 z: ]" C  B6 A
                                end
4 a7 Z2 C# }/ @* ?" l                            end. F, S  ?$ q4 n0 T# L# Z: ]9 _4 h
                            if k9 C/ d! W, h* s" X
                                d(j)=true;
3 z. @; x+ Y( o; H2 Q4 w6 _: D                            end
' m( H2 g# v: [) x( E7 w* L  E# N, ?                        end
1 g3 @; ^3 L" [                    end2 F; I9 i, x! j# B% ]4 b0 Y" r
                    frontvalue(newsite(i))=fnum;
# M; _# e& z/ [                    cz(i)=true;/ s; s! i! h' k3 x/ ?- ?2 `2 h, Y
                end
: R+ a- e' u1 h/ w  y' n: Y. H            end$ c& m( a) {& i! j
        end/ k$ T) Q0 L3 g" [, r( q+ F2 c
        . ?& L4 L. G2 K* T$ F2 |
%-------计算拥挤距离/选出下一代个体        
# @, V3 A( [) n) ^( _        fnum=0;                                                                 %当前前沿面3 I6 y) C1 _7 U, x7 Z+ _
        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群" [3 Z# S4 u  o8 S& L9 A
            fnum=fnum+1;3 [  V' ^& v; e. i7 ]. j1 h
        end        
2 U8 x7 |$ E7 W% O        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数: C. p4 A. A! i8 w" v# s) `
        population(1:newnum,:)=newpopulation(frontvalue<=fnum,:);               %将前fnum个面的个体复制入下一代                       
% n. }) h( l9 O        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号* q% c# n/ @# B
        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离- U) L  _3 G  {) N0 l9 R
        fmax=max(functionvalue(popu,:),[],1);                                   %popu每维上的最大值/ |" B4 j5 m% A
        fmin=min(functionvalue(popu,:),[],1);                                   %popu每维上的最小值& E# k, N2 [+ _. C0 i( l- ~
        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离
5 b4 T' ~7 ~/ R" t/ P9 e! @) T4 o            [~,newsite]=sortrows(functionvalue(popu,i));$ V% A7 I' k7 n/ ]# T
            distancevalue(newsite(1))=inf;! D# b; [6 k0 x  ?
            distancevalue(newsite(end))=inf;
1 _0 X! s( ^/ c! G/ ^* @3 t( P            for j=2:length(popu)-1
$ F" E4 h0 P+ ?: Y2 q2 H                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));) y4 s: z+ _  i: w' [
            end
6 L0 W  A* F0 {' h1 s9 @        end                                      1 g5 c, C$ m0 n, P0 W2 d" B" E
        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体9 j3 d# E8 K. k) I/ Q) S
        population(newnum+1:popnum,:)=newpopulation(popu(2,1:popnum-newnum),:);        %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        1 }$ W9 e- y; [
    end
% _6 @/ ?& _3 E4 Q9 Y, ?" h7 i& s; R" y; G
%---程序输出   
+ m' |3 z! z$ c4 i$ [    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时
3 [' t: R# B# |) P7 E3 O8 v; x$ Z    output=sortrows(functionvalue(frontvalue==1,:));    %最终结果:种群中非支配解的函数值; j3 X, L! A  s0 A$ f6 }8 u
    plot(output(:,1),output(:,2),'*b');                 %作图
# N! v( q0 h- [* z2 Z2 |, O    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')# i+ W& |' H2 U) @: K% @
end
  n/ o$ v9 D/ C4 g  M0 O; ~* `+ j# s2 P" k9 n* D8 u5 P
' D- r7 ^* h0 J7 p- K# k+ u

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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