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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
为了能随时了解Matlab主要操作及思想。
故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。
感谢郭伟学长提供的代码。
代码所有权归郭伟学长。
在看Matlab实现之前,请先看一下:NSGA-II多目标遗传算法概述
/ U4 u( \: r9 f. A: Q
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
* X1 H3 t  u) \! R: p! e2 h7 L: d2 K①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;
4 ?# ^+ ], _  g②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;' t/ b8 _2 w2 c
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。0 r; h' |" T6 w" j, ?

2 v& E& Q$ d; C" v/ w# _) @6 NMatlab实现:
9 `, ?7 G$ ?6 ~: x7 J4 U  E; i0 @# D2 m' o* j, S9 ?
MATLAB4 O: L4 m: w" f* V# J: O
: `* V/ h% E4 x. a# ]$ m/ F1 H1 J
function NSGAII()5 f( r' s& s& F
clc;format compact;tic;hold on
: F  u4 [( _- s3 O   
& H) P: p$ |$ f7 q+ A%---初始化/参数设定
, T, c% n: n" ~    generations=100;                                %迭代次数7 l( L1 T3 p* ]9 R
    popnum=100;                                     %种群大小(须为偶数)+ z% t+ x3 U( W- h
    poplength=30;                                   %个体长度, }9 r( N6 t5 l! N- j4 C
    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值
# V3 n! q; t# ]+ T    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值   
3 D% M" }3 R% N$ m9 o: X; N: G. ~    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群
! G: R  Z( O4 K) o3 a: \( h   
( _7 {% J; G0 [" v4 \+ D/ {%---开始迭代进化
) b  J% _6 M0 I  z6 ?1 v$ E    for gene=1:generations                      %开始迭代
  ~9 s) l6 v: n7 ^        0 F0 k$ D8 s+ k5 F; x% [
%-------交叉 ) V2 E: w+ p9 ~' Y) f# S
        newpopulation=zeros(popnum,poplength);  %子代种群
9 r. H% N% u8 W) T        for i=1:popnum/2                        %交叉产生子代
% l3 k7 `4 M1 a# g5 T3 c) j! L+ W            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法
+ \4 T, b+ A! S, Z6 D( ~7 M            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代
! Z* E6 {# Z3 S* u" o            newpopulation(i*2-1,:)=(population(k(1),:)+population(k(2),:))/2+beta.*(population(k(1),:)-population(k(2),:))./2;    %产生第一个子代           
( g% j) {6 }: t$ a            newpopulation(i*2,:)=(population(k(1),:)+population(k(2),:))/2-beta.*(population(k(1),:)-population(k(2),:))./2;      %产生第二个子代" M* b5 g* ]4 ]* s0 v: {  Y# A
        end
3 o$ b) T5 v% z$ w3 j' c        + `2 \% |( s: Y
%-------变异        
7 p. v1 h2 {6 \        k=rand(size(newpopulation));    %随机选定要变异的基因位
: w4 L5 I" M- R  q+ ~- _& J5 [9 d        miu=rand(size(newpopulation));  %采用多项式变异
1 L- ?8 y) e- D- z5 P1 m        temp=k<1/poplength & miu<0.5;   %要变异的基因位
- ~. c) \- o4 j7 N; _% \  ]        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);        %变异情况一
( K3 |8 Y) J% p8 Y        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));  %变异情况二% B$ {. D1 L  h+ m, Z
        6 e3 L* y9 K4 [6 N
%-------越界处理/种群合并        
+ N6 `4 }6 u/ ]5 _* Y# |% i+ y* I4 d        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
$ x9 w6 w: J* s3 z: N, j        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理0 k) k% _$ s! B
        newpopulation=[population;newpopulation];                               %合并父子种群$ k& T7 v- N" r" O8 H  B  r
        
0 z* o# O) \5 ^# {1 ?%-------计算目标函数值        
9 o1 U! W3 H6 q9 p1 N4 z        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1
. I9 T5 F# F9 V4 o% c! U( T        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值
: X& Z- T+ J* Q3 P) [9 I1 g0 d- J        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);+ X" Z: C2 ]( e  C1 c. J+ ^1 g9 J
        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值5 i* e& a. W0 C, a7 q
        
( M1 P/ }( F+ N' i& ^%-------非支配排序        ; o* _& x& l+ a+ p
        fnum=0;                                             %当前分配的前沿面编号$ R/ g; M" z1 S. F6 e0 T! X7 ?
        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号
' R" c, F1 U6 I2 P* T) I$ z( n! i        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号% n5 K5 R, \" c/ p# D5 n! Y
        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序
) P( h( l2 a. c* I8 D" c9 x0 I& \+ ]        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort6 ~, h/ y) g/ U1 ?/ @! n6 F
            fnum=fnum+1;
5 i! W3 }  Q3 }            d=cz;
: e6 x1 F$ E! y            for i=1:size(functionvalue,1)
7 c0 N7 R+ W- W# q9 D                if ~d(i)
+ `: h' q; E7 I2 S& t                    for j=i+1:size(functionvalue,1)
- ~, Q9 x. M$ D# J                        if ~d(j)
( S, g6 q/ w5 s. O" I                            k=1;                           
) [" L/ G1 o  B+ r+ _                            for m=2:size(functionvalue,2)
- [$ a) t" E0 z9 l6 d4 ?                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)' U/ |2 i2 m; }8 d/ z+ ^8 U$ V" y
                                    k=0;% f: y( b, @7 m4 S" H) L
                                    break$ v6 L4 `: D2 [- ^
                                end
5 x" y) k! F' z  f" |                            end
# n) F; f) `1 u6 U                            if k
% }' u  B6 e* R! I) j. [                                d(j)=true;& f2 I' R( q' {
                            end
# Y! q4 l& V" N$ E& }                        end5 e! D; }4 r9 L& ~* b3 L
                    end. N- f1 t& |- c" E
                    frontvalue(newsite(i))=fnum;
( ?, F7 F# T- }; k3 I: j                    cz(i)=true;
8 k( \) i+ L; f+ L8 ]4 Q3 J) `: q                end0 s% S! G+ ^' f
            end" B% r( g+ m) `$ ^( z
        end
1 A; ^# j3 H. C7 Y2 n' j, ]2 a        6 C" u) }/ ^/ Z7 Z# \
%-------计算拥挤距离/选出下一代个体          I" i) T4 }/ P
        fnum=0;                                                                 %当前前沿面
4 k% M4 S& Q" M  ?$ i' v2 H2 |% y- z3 d        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群
+ @: @0 F1 D! F6 m6 j/ Q3 e, B$ b            fnum=fnum+1;+ g$ l. B, `( K4 z0 [+ v- W  Y
        end        
, R5 i& D1 V8 o! E7 N8 k        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数& M1 S1 C9 D( n0 O% j5 i& K' u* N
        population(1:newnum,:)=newpopulation(frontvalue<=fnum,:);               %将前fnum个面的个体复制入下一代                       % y+ v( p' a- [8 o, H  T( Y
        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号
) ~1 [+ t( T9 N" A! t$ {+ K        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离
- {4 A0 z9 A; _1 C; n& W# H        fmax=max(functionvalue(popu,:),[],1);                                   %popu每维上的最大值
2 ]3 ]+ I2 N% j5 H  e        fmin=min(functionvalue(popu,:),[],1);                                   %popu每维上的最小值) S% S9 v$ r) u/ S0 u
        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离
! M5 K- {& k0 |9 X6 [1 I; V' |            [~,newsite]=sortrows(functionvalue(popu,i));% I8 S* X9 U, w8 }* f
            distancevalue(newsite(1))=inf;" x2 u2 ]6 E; ]' M2 g5 d+ g/ r) T; _
            distancevalue(newsite(end))=inf;
6 ]3 _  V3 I8 b1 H            for j=2:length(popu)-1
% \9 s+ V$ x: K! d  D                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));
; d$ N: T. Y2 ?            end2 Y" g0 X0 \1 Y  i
        end                                      5 \& G$ A8 i' Z5 m
        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体4 \5 g! V0 k8 D1 b# }, e6 i8 K
        population(newnum+1:popnum,:)=newpopulation(popu(2,1:popnum-newnum),:);        %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        
' c% ?' [7 g( U; N( k    end. Q" `) K4 T3 t9 D

  L+ @2 C0 w: G2 j7 S- o2 B5 h%---程序输出   
9 ?5 X! k/ y" M$ ~    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时
8 M2 S- `$ `" ^$ A    output=sortrows(functionvalue(frontvalue==1,:));    %最终结果:种群中非支配解的函数值' Z, A. ~  Q8 ~# q
    plot(output(:,1),output(:,2),'*b');                 %作图
' F5 r  [% W  S! U$ q+ F+ K3 `    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')+ v( B8 J/ n7 u' x& c0 I
end
. w; E) e4 N: X. a4 _* }& G6 k
; l8 V5 h0 c8 e7 P9 }( G; P9 A8 B3 d$ I% z

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-22 05:23 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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