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

NSGA2 算法Matlab实现

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 uqHZau 于 2020-6-2 14:09 编辑 0 _' E& j- m4 J1 {: i. {
. y* M/ X& H- i: x  F) I, R; Z$ X
为了能随时了解Matlab主要操作及思想。+ z% b0 M9 b& a
/ d# w& }- y8 [- U
故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。 ; N$ t8 R0 w# q
2 Z5 b1 m" u5 U! p0 @/ l* T# A
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面: + b; O' P$ P) b/ y# c
①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;
4 o: o) r# s6 h) s& s②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度; 7 U& B5 D1 o8 m" i
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。) i2 z$ m9 O3 }+ [( \& ^5 ^7 E
7 H1 m! O2 a0 }9 r" [1 @* D# K
Matlab实现:2 i* y8 |; g  m3 ?
& M1 Y4 F% e- G( \# d
function NSGAII(); @( E' E! @9 g0 k4 z& t
clc;format compact;tic;hold on1 ~0 q9 U5 E, b8 I! B: c
8 s5 V4 A: u* c8 F' ]- E
%---初始化/参数设定
  B2 y: u9 G2 x1 M" v8 H: p    generations=100;                                %迭代次数
6 N; Y2 P& `3 [9 m. [* e7 Y& I    popnum=100;                                     %种群大小(须为偶数)  B! `; y+ @0 L- B
    poplength=30;                                   %个体长度
2 i+ E% u$ j$ o* t. h1 M; [    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值3 S$ r. X0 p& L# d  w
    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值   
: \% ~6 l1 @. _    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群
) n9 J' r" c' t6 A4 E: p( G2 C# q! d4 D% O
%---开始迭代进化
: t- V( M4 f# [7 v    for gene=1:generations                      %开始迭代
) L7 A9 A: P9 K, D
0 I% C& K( P/ V; `2 v* Y%-------交叉 * y. p: r* H0 _$ n
        newpopulation=zeros(popnum,poplength);  %子代种群1 n) G5 R* v  f- C$ D
        for i=1:popnum/2                        %交叉产生子代
& ]- G- O3 k9 P            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法+ @, p& V9 x. V  L/ u) w. {
            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代6 r: f. h( U0 z
            newpopulation(i*2-1,: )=(population(k(1),: )+population(k(2),: ))/2+beta.*(population(k(1),: )-population(k(2),: ))./2;    %产生第一个子代           8 W- x/ I. y* A& [
            newpopulation(i*2,: )=(population(k(1),: )+population(k(2),: ))/2-beta.*(population(k(1),: )-population(k(2),: ))./2;      %产生第二个子代
( c  ]+ R4 s& X        end, z1 i" S/ n5 t- X

$ l' j+ o/ c, p# O0 K# ^%-------变异        + t/ \: Y2 X: y2 @, O+ v
        k=rand(size(newpopulation));    %随机选定要变异的基因位, p) q6 t& ]" d: B
        miu=rand(size(newpopulation));  %采用多项式变异
; W8 e, j9 C5 D        temp=k<1/poplength & miu<0.5;   %要变异的基因位
+ r4 c8 Z- |+ ^2 Y' {2 l        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);        %变异情况一! E1 b# M1 g3 s' E. d2 V
        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));  %变异情况二9 n/ Z. q$ \2 T2 I; v

3 V' m! H4 y& _& x' J# ^%-------越界处理/种群合并        
' Q: O, K  V! [3 @0 x  |        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
4 n6 y, n6 C9 M! x  o        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理
" l, Z1 d8 Y- ~. T# o0 r& S! t5 e        newpopulation=[population;newpopulation];                               %合并父子种群* a0 E' @5 y+ P- H! X
7 X$ Q9 F' r( {6 L) U: w
%-------计算目标函数值        
+ |% B. P7 D: V  _        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1$ W- x1 i- J  q; n! _6 R$ }; K
        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值7 a" ]- d( N% L2 b  i$ m
        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);
1 Q1 z( P3 m" c  J- I. K/ u        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值1 t; G# v/ n- q2 S9 D5 N
' a3 u  T; Q7 l- _
%-------非支配排序        2 q6 c& D# c2 T/ H% v
        fnum=0;                                             %当前分配的前沿面编号! C3 @! U+ G% h! d
        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号
4 {% y7 F3 d8 a) S$ l        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号
3 t( p( a, ~" v; X7 s        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序3 D5 d. J$ t5 [  w% r
        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort
9 ]5 {3 v/ {8 a& _8 r            fnum=fnum+1;
3 K. B3 G  z) i: n! q: Q            d=cz;, O2 h# |& z* F5 l7 {. _4 `
            for i=1:size(functionvalue,1)
* C( G( a( m* F( Z                if ~d(i)) t# G+ l4 y. L( I' U
                    for j=i+1:size(functionvalue,1)# d$ P: U( w3 J, ?0 W' z) j
                        if ~d(j)
$ ]9 |7 \9 F1 Y4 P* D                            k=1;                           
3 F$ o+ w% K2 D8 r1 ^# E                            for m=2:size(functionvalue,2)* b- s. o8 E( m( g1 C
                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)
& t0 [( g, l2 Z                                    k=0;
5 f9 T4 w2 }% |/ f+ z                                    break
$ Z* x, w; b& I" m                                end
+ `: V1 _' L$ L3 J0 j% i5 Y                            end, g: B* r1 {% u# {& U" k4 O' G
                            if k" B1 M- p$ [3 R/ H: {: K4 |  \
                                d(j)=true;- c  [8 M: n, R  F
                            end3 O; m( d1 ~' s' A' A2 ]
                        end. f  f8 }: J" P$ G# a' B/ I
                    end. B) h2 f) n! G  P# o
                    frontvalue(newsite(i))=fnum;
0 _! ?2 o; [2 t! A1 `( a                    cz(i)=true;# k/ {8 G- j2 d+ U7 C" y+ S
                end8 p+ {9 w( D+ N
            end
' M9 ^  B) K3 w* U9 j8 e- t        end' F0 V/ V: g4 R* Z

  j& d; ?& `. {) M& A1 g+ n%-------计算拥挤距离/选出下一代个体        
! h: N# H) Q2 V  k        fnum=0;                                                                 %当前前沿面/ c- X- m: \3 s8 _# Q; a; _) `$ [
        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群# A1 X% E$ ?% f" ^
            fnum=fnum+1;8 B0 Z; E4 e( |, @) M
        end        
) d% {' M0 {4 N( I; b/ k        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数
2 m. d. _  m3 M' ]3 ]! v        population(1:newnum,: )=newpopulation(frontvalue<=fnum,: );               %将前fnum个面的个体复制入下一代                       
- Q; u1 i, u  d        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号
! S% \$ [6 F* J. B3 L        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离
9 o. l3 ]' R+ _! s$ C, r        fmax=max(functionvalue(popu,: ),[],1);                                   %popu每维上的最大值
4 x9 ~7 W6 \+ i% K: Z        fmin=min(functionvalue(popu,: ),[],1);                                   %popu每维上的最小值- ]) K+ x/ q, }4 G/ N7 T
        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离8 E# e! D" v9 p  L5 {
            [~,newsite]=sortrows(functionvalue(popu,i));9 H, H( j9 }5 g  j; U- U3 p& w
            distancevalue(newsite(1))=inf;# V5 P* \2 Q- w0 {7 [( I
            distancevalue(newsite(end))=inf;
  W, l. q' _8 y* r& G* o$ w5 d            for j=2:length(popu)-1/ {: h( E# Y+ A9 V# \5 [
                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));  z1 R4 Q& G* f* q. R
            end
. t6 L; z  _" I! o) a        end                                      
% }+ T+ ]% ]1 s& [8 I        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体
) o  n" v' _' f$ d% g+ }        population(newnum+1: popnum,: )=newpopulation(popu(2,1: popnum-newnum),: ); %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        
2 P7 f5 V6 {* V3 E; n" o    end
0 v) M+ ?, Z# U4 l. i; X5 w" ~( Y8 I$ y) R2 s+ i
%---程序输出   
! [) h, z# H- Y& b% v    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时
- i+ d8 ^% C, Z3 f: J0 ?) d- p    output=sortrows(functionvalue(frontvalue==1,: ));    %最终结果:种群中非支配解的函数值
8 g2 x0 T/ d) _$ j8 y$ j    plot(output(:,1),output(:,2),'*b');                 %作图0 J7 R+ W) i; t& E% y
    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1'). m& p: b, @' l4 k
end8 }8 N: D( u+ y( h

7 K3 X7 o' n( [6 x% O0 y
( P: M1 M6 Q; l3 b: N
" B! _+ H: J9 H( V2 @

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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