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

NSGA2 算法Matlab实现

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 uqHZau 于 2020-6-2 14:09 编辑 : U% @- A# t) f& g# M. }
6 v! ]3 u/ a, O# W$ g- t6 z* U! L1 Z
为了能随时了解Matlab主要操作及思想。2 D5 |- }, L* X( K4 f2 B3 U

5 J% Q9 ~6 r4 q+ a" L" c! c3 `7 ?故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。 * _, N, T( g" E( o0 V

+ q! R: o, h( a* ?NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
  ~/ J4 P1 O* Y( f0 ^①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体; 0 ^. @& @$ R$ G- R5 ~5 b, ~; T
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;
6 u7 T7 f0 N  E" T③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。, u3 z) p/ k2 ?* \- @

; r. s$ v+ L5 A( Q* b7 l. GMatlab实现:3 S& o! i: o7 V! s- t

% N) {; T5 _3 U- ?0 S/ Z% Zfunction NSGAII()8 H1 d7 _2 J! Z6 _
clc;format compact;tic;hold on( u# d; u+ k3 Q5 `# L5 k4 f

4 R4 T: U" h& C$ B4 A4 ~%---初始化/参数设定
2 z, x) P) k# p    generations=100;                                %迭代次数
5 Q8 T# H! D1 }! O$ W    popnum=100;                                     %种群大小(须为偶数)
' C9 Z/ e, K4 S$ V    poplength=30;                                   %个体长度1 `6 M  E: w7 Z
    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值
% L, E: U$ V, a% \4 E    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值    , e& [8 F, l. P( ~3 I0 Y, D" Y
    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群
1 W# x9 S# B7 p4 q) [/ e$ f
" u1 H9 T. j0 z; j1 I% H%---开始迭代进化% W8 z6 b  A, E3 G. J1 f& n
    for gene=1:generations                      %开始迭代
$ J( J& R' f. |- j+ ?5 v) r  @9 j2 E9 j5 T6 e9 c9 K, M" {
%-------交叉
  V* @9 s' V) h7 ~; |  {        newpopulation=zeros(popnum,poplength);  %子代种群
* A% R# L8 w8 G" V# _: [        for i=1:popnum/2                        %交叉产生子代
7 z" ^' V5 \2 _& h( D            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法/ X# M8 \( Z" f! k+ v1 K9 a& ~
            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代
  l  G( C1 _( O2 ]            newpopulation(i*2-1,: )=(population(k(1),: )+population(k(2),: ))/2+beta.*(population(k(1),: )-population(k(2),: ))./2;    %产生第一个子代           
: p, }0 J: Z* ?            newpopulation(i*2,: )=(population(k(1),: )+population(k(2),: ))/2-beta.*(population(k(1),: )-population(k(2),: ))./2;      %产生第二个子代- j6 s0 L' {- d$ V$ c6 J
        end
4 Y2 K% h& V% ^" Z
7 d# q' Q  P/ S%-------变异        / d( ^( d, P. l$ Z; _# r
        k=rand(size(newpopulation));    %随机选定要变异的基因位* w/ s( }; _( `' b: e
        miu=rand(size(newpopulation));  %采用多项式变异
; ^  H# b, @/ Q3 a# J        temp=k<1/poplength & miu<0.5;   %要变异的基因位
- i6 A- ^4 w$ t9 z  ?        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);        %变异情况一  n6 e5 S. y$ G2 L
        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));  %变异情况二1 l" M$ e9 W9 P. r

( T! u4 O4 ~1 V1 _1 ]: h2 }%-------越界处理/种群合并        
# H0 c, |) l8 A        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
; J% N& w# T6 L- x0 K        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理
6 M( O! y# }1 b5 Z        newpopulation=[population;newpopulation];                               %合并父子种群
! s' [9 f( {2 a% h# r
$ ^% V- r) H5 W0 r4 T%-------计算目标函数值        
2 ]" C) _/ f: v0 c5 r        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1
  ^; B* [" I4 V3 Q) e. d6 _. ?        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值
* Y8 ^/ A1 s8 h9 P9 k5 o; ?& N        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);0 w, H  v7 q7 N( U5 V" I& ~
        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值. ]# M$ j1 `' E

, S3 }  i2 I4 J+ r- r( Y4 g%-------非支配排序        
5 S2 ]: b& c. N* S) U) L/ |        fnum=0;                                             %当前分配的前沿面编号
' D, o5 r- v1 G' h6 y& H        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号
& }6 U0 x6 d( J7 k8 V8 R1 v9 P/ J        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号2 \; r! A. c8 v# l- n! w- M
        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序
( g( u- g5 F) C4 e+ O9 p4 r        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort
# c( l! D  m# q' l- n0 B( m" e/ _            fnum=fnum+1;
7 l& W* C2 d" P- y7 t* B& e8 o            d=cz;
, y3 ^1 I  x9 L3 b            for i=1:size(functionvalue,1)* |% e7 L, e2 f( j0 g: Y. r
                if ~d(i)
0 U7 L7 Y) u' p( Y! G! K7 y$ [                    for j=i+1:size(functionvalue,1)+ H; F2 H% q. y& ~$ ]0 N+ b# d
                        if ~d(j)
) y. v* X- Q2 O5 l                            k=1;                            2 H, d3 E% M. _, S% ]
                            for m=2:size(functionvalue,2)5 o, m7 ], |' Y, x. o! Q
                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)
. [/ J! }: g3 Z( n. {                                    k=0;
* m: e% v! }6 ~1 f5 D; H4 z2 V6 j                                    break7 ]- _: D' |2 B) Z
                                end0 p' e* k( A$ k# O. r: ~
                            end
! }5 @$ A' ^" ]5 k7 y. @                            if k
  R  ~8 N" i# z+ ~                                d(j)=true;
. k* F# i& k( C7 E, W1 p" n                            end
  y8 u9 b. Q2 G4 p$ \                        end: Y1 X) l: S# U2 K. O6 M
                    end2 C/ _/ Q) j! C" L- f& I. B8 w8 F. z; d# j
                    frontvalue(newsite(i))=fnum;
: U& i$ k4 n4 d+ `- f                    cz(i)=true;. ?! C9 H; L  i4 I& s
                end
. j1 T4 C& U/ e& k2 H+ e            end+ D# S) a& t9 [# p  c( P+ W6 a. w
        end
* a& x1 q7 f" J
- C: ]- C5 d6 C5 M0 h" o- W+ \%-------计算拥挤距离/选出下一代个体        0 W" |8 L8 \; E& C  v; @% {: R8 g
        fnum=0;                                                                 %当前前沿面
, Y: |* q4 Y: p* H        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群
. S4 x+ F$ U3 ?            fnum=fnum+1;" _/ f1 f+ [$ B& _! k
        end        
$ ~/ v1 l! s. O+ d; Z+ a        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数
4 i: r. n6 a2 Q) p        population(1:newnum,: )=newpopulation(frontvalue<=fnum,: );               %将前fnum个面的个体复制入下一代                       - l9 ]/ m: A: V, n' X
        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号
$ G% P9 j9 N- r# b7 l9 w        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离$ }- v: J5 |9 K- I; ?
        fmax=max(functionvalue(popu,: ),[],1);                                   %popu每维上的最大值% s7 k3 |3 W$ h8 l; `; [
        fmin=min(functionvalue(popu,: ),[],1);                                   %popu每维上的最小值# [0 [; z- R; \3 H$ I' l
        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离
8 P: h, X3 d$ `9 U3 J# y            [~,newsite]=sortrows(functionvalue(popu,i));1 f; d  d, y9 B; Y& `7 I
            distancevalue(newsite(1))=inf;, d2 u! m. {% n, w
            distancevalue(newsite(end))=inf;( w& j  n5 C3 H7 L; r1 W
            for j=2:length(popu)-1" `& Y% a* P, N; X% ^! n2 M
                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));
' U8 h. u' U$ x7 y7 M            end
' _3 T: f# z# b- a  l7 {        end                                      
8 g3 W& ^4 L- t9 m4 P* h+ l# d8 N+ h        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体2 P2 I* M. |1 Z" P  x3 I
        population(newnum+1: popnum,: )=newpopulation(popu(2,1: popnum-newnum),: ); %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        6 g& T* V" x8 ~- G
    end/ X' T1 {$ {0 C5 z

4 d: O: T/ V2 s9 M3 O$ c%---程序输出   
3 u, p! w, @* r    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时2 S- s. b* Y- i, L) l) d
    output=sortrows(functionvalue(frontvalue==1,: ));    %最终结果:种群中非支配解的函数值
, Q$ }+ D6 X6 x  Y9 U    plot(output(:,1),output(:,2),'*b');                 %作图
+ l0 I* i& {9 ^. v  P    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')
; B& s3 K7 M  Qend
* H1 ]5 w" b# t
% C7 P" Q& _, K+ C+ [2 s
3 T7 I# D. [& {) t& R/ ~. E& K5 Q, F& v8 E: @

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-23 02:31 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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