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

NSGA2 算法Matlab实现

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 uqHZau 于 2020-6-2 14:09 编辑 / x$ W; l  t: \& T/ ]: y$ i

6 m' a& W* H! F' R: P为了能随时了解Matlab主要操作及思想。
% U3 ~, S) p4 Q' e8 S
" Q2 e7 p2 ^! q( q故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。 2 ]5 Z! m0 B* n: y  W  r: z, {  i& `

  H% C) Q. q* `  D$ ENSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面: , O1 k8 U7 a) E$ Z
①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体; ) {- V$ J& ?5 u& H8 d, V1 u: z1 N
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度; . \  _3 ]5 w( O( H) h5 ?: c
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。- P( a0 L# T$ X5 E% o% o/ F" w4 i
# B' e/ s7 G) y) l7 Z- Y" t: v7 t
Matlab实现:/ Z) p5 }# P3 G9 B; }# _

# ~0 x$ M; j, U$ o( E9 [) `function NSGAII()
+ j$ ^" @3 Y) f  L3 z: [clc;format compact;tic;hold on/ d9 v1 W. ~% Y  m# x3 O4 h

: s4 f) {& h& ]: ?# `%---初始化/参数设定
" L' }; l8 y; }5 G/ d4 K5 L% P! V    generations=100;                                %迭代次数
5 T( y' c& D1 q6 m: E    popnum=100;                                     %种群大小(须为偶数)' U+ b" W, t8 w$ W: Z7 \  y
    poplength=30;                                   %个体长度- u5 f  [. k% x- J( k5 `
    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值
1 ?$ e7 z6 H, ?7 V% F2 A+ b    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值   
- U, G, q  k7 M% l$ h4 B7 p, [2 H1 m    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群
0 C! ^2 J0 H- \3 A4 ~; |0 f* d5 F" X0 D
%---开始迭代进化
- ?; K- H( B& ^' X# x% S    for gene=1:generations                      %开始迭代+ a, P" `' E# K; Q% L( Y

! y' c) Y2 p0 X! z/ c%-------交叉
4 u$ E6 m8 N; b. ^8 \        newpopulation=zeros(popnum,poplength);  %子代种群- N: [- A' h/ y6 c2 _
        for i=1:popnum/2                        %交叉产生子代7 a7 I, f9 [. V7 o% r5 d- b
            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法4 b. i* K1 B* a
            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代
8 L4 \9 Q2 S. q. t            newpopulation(i*2-1,: )=(population(k(1),: )+population(k(2),: ))/2+beta.*(population(k(1),: )-population(k(2),: ))./2;    %产生第一个子代           
; G6 Y; |1 v6 V' I6 v            newpopulation(i*2,: )=(population(k(1),: )+population(k(2),: ))/2-beta.*(population(k(1),: )-population(k(2),: ))./2;      %产生第二个子代9 l# ~' N5 |3 r1 e7 N$ ~
        end
7 P1 Y* c7 \/ }. C
+ i, ]& _) d. A3 a! a%-------变异        
; M1 I7 f0 \# m+ u$ n        k=rand(size(newpopulation));    %随机选定要变异的基因位. `/ y8 e: E/ L* U' x) @/ J  F, i8 }
        miu=rand(size(newpopulation));  %采用多项式变异
9 o9 O- Z- l/ ]8 Q& ?) h# \        temp=k<1/poplength & miu<0.5;   %要变异的基因位. G' Z1 X9 k; Z6 v
        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);        %变异情况一& z" f. u$ t0 z# g: z5 \
        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));  %变异情况二
% D7 B9 N3 K: \9 }" @- a3 @( ^0 H) f3 ~' f9 Z* ?- S, B
%-------越界处理/种群合并        
1 n6 b6 o- X. C        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理' r" N& R; ^& ?1 @( [
        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理
8 t% u7 P: f1 \/ |; {        newpopulation=[population;newpopulation];                               %合并父子种群
) Z3 V# T) G" F
+ W  Z, ]" m! [1 ?%-------计算目标函数值        
+ t# Y0 k1 b8 O( |" B        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT16 Q+ e5 w( S9 ]! c0 x2 D( V! j
        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值' e- R& P" r( G6 f; I& e
        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);0 C4 T$ v! e8 `
        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值+ I! _- D2 h1 K

4 f6 O, G* i* @2 Z% n%-------非支配排序        
- `7 K3 `& O, z. B$ L        fnum=0;                                             %当前分配的前沿面编号" e* S3 R. p& T( L0 I) U+ e. C: ~
        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号
5 a* w6 n4 c0 F7 L/ z  T5 F( B6 z        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号# q6 ]: T, l! c& j# m7 _; u
        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序! S. E  W% i" W4 W& \
        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort# C+ x5 E: z, j8 j" e( L) `9 O5 z& @
            fnum=fnum+1;
& ~5 x5 @) t, r1 y! `; ?: E            d=cz;
- \6 x& ~/ K3 D/ e, |. `/ o            for i=1:size(functionvalue,1)
1 A3 G2 Q8 c0 T                if ~d(i)
: O/ @4 z! D! B1 \5 R+ m8 U1 J                    for j=i+1:size(functionvalue,1)
1 I6 h0 y; g& p" U# \' ^; i( M                        if ~d(j)% @) R) e* j$ n$ _" |
                            k=1;                           
5 h4 F7 @. y* D& S+ O8 J                            for m=2:size(functionvalue,2)
( V- T5 e3 Q' U9 ?                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)
* \8 U' W% A, P- m; O                                    k=0;- X% u& I* ^. v- w* ]
                                    break
9 z5 d/ w7 B* G* s* q# J4 H6 e                                end9 N. l* c; u/ g, `8 r' q3 X
                            end5 t: R7 [! D0 A- I) c+ Q3 _1 U+ N
                            if k# F: ~& Y  y; w; x/ k9 D. I
                                d(j)=true;
, h. C' R0 P; j7 @& [8 c/ u1 ~                            end
6 G" \3 a) K9 \. A9 C. H4 c: f                        end
# u! c1 Z* T6 z# I% ~: @* \" a5 s) _: K                    end; J' T! }" W$ j; _. E6 ^' `
                    frontvalue(newsite(i))=fnum;
4 }5 m; X+ G- j, Z                    cz(i)=true;% @, u; B& u& C8 K
                end0 U% s- `2 X- M& g5 m6 R) \8 y, h. k
            end! n: L% ^& T" }. L5 f
        end
( X, v) x5 W$ }6 g- J
0 o/ t! l0 T" r1 y4 J% K, d5 a: r%-------计算拥挤距离/选出下一代个体        
  Q3 n) v5 D5 J$ S5 d9 w  \' a        fnum=0;                                                                 %当前前沿面
0 c' x6 {) G' G        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群
0 T  q6 Q: C& b9 _5 }- m            fnum=fnum+1;% o: g2 V+ I' Y" L9 x) i
        end        
6 k! N9 _* s1 j6 W$ D' B$ A        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数
1 v9 Y# H* N" M3 R$ C9 M6 w        population(1:newnum,: )=newpopulation(frontvalue<=fnum,: );               %将前fnum个面的个体复制入下一代                       
! R- z# @8 c- a% U; h# B        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号5 D* W& P- _, T$ E
        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离% s$ o/ z4 W- ]9 c# X0 F3 x5 j. p
        fmax=max(functionvalue(popu,: ),[],1);                                   %popu每维上的最大值% Y( I" U6 ]& P
        fmin=min(functionvalue(popu,: ),[],1);                                   %popu每维上的最小值7 ]2 h; j$ r$ a
        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离" A, R: f( A. G: P
            [~,newsite]=sortrows(functionvalue(popu,i));: K" c* @3 s% M+ n* V( ^! F" x; z. A
            distancevalue(newsite(1))=inf;
, s1 ^  X3 o4 v* u1 Y8 G4 p% l& O            distancevalue(newsite(end))=inf;
' [6 V5 a3 ]- L' C            for j=2:length(popu)-1: ^! N9 c5 \' p! ^% \# f
                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));6 @+ d8 S7 I& Z- S& K
            end
  m' a/ B6 J+ U9 t- Y4 o4 y        end                                      ) Y) z( p) j2 P% c" K: E  @' z& ~
        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体- `& c" G9 M9 r
        population(newnum+1: popnum,: )=newpopulation(popu(2,1: popnum-newnum),: ); %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        
1 r3 U1 |6 q& D8 j3 u    end
% n* e. }8 r5 q& w. M5 ]0 v6 K/ r& X4 c1 k2 e# f$ h/ K* C* ?" D" H
%---程序输出    + f% Q7 `* T7 {) Y8 C9 R" K
    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时
" M' h" c, }! Q: O. g, K& ]. _    output=sortrows(functionvalue(frontvalue==1,: ));    %最终结果:种群中非支配解的函数值  m3 ?% g6 D  I  V$ n! y
    plot(output(:,1),output(:,2),'*b');                 %作图
1 A5 S; z& {6 ~9 ?4 T2 `    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')
/ q; z6 t* c  U+ vend
: j1 y0 c4 L# c% e  m+ X; X5 k

4 P. D2 t/ ^$ n, e( s; c+ B
; G8 O. n, `' f- ^, }2 m" r' x# [

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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