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

NSGA2 算法Matlab实现

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 uqHZau 于 2020-6-2 14:09 编辑 4 L: O( W7 ~" _5 H' @2 d# o* H
4 P4 g6 ]/ `' b( R' |
为了能随时了解Matlab主要操作及思想。  R+ _% k. Y' h# B! v3 m& K
/ l: Q2 E7 ?& d- M$ v7 |5 e5 I
故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。 ) f% i3 M7 [6 G  O0 I; \! d7 S
9 P% F( s8 {/ }( P
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
7 d; x: f  o, J①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体; 0 L- A# D. m5 A* t4 G) Y9 ?0 v
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度; ( Y# k8 E$ _5 x
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。( ]! X1 I2 ?. Q

  Z! W7 a$ |# I4 U# qMatlab实现:
! D; _' A9 c7 ?2 V1 F; W# H8 Z% a! ]; z  Q; p  j, Q4 _( y
function NSGAII()
6 n+ b5 I7 k$ B) }3 r% Rclc;format compact;tic;hold on
; C1 i+ H: E2 S( c! L- t9 M4 L
%---初始化/参数设定( l1 Y, o9 D" s& ?7 ^$ D
    generations=100;                                %迭代次数1 I: ?" m, N& ^8 Q, l0 t+ U8 i
    popnum=100;                                     %种群大小(须为偶数)0 S7 j4 y5 Q$ }/ r6 S
    poplength=30;                                   %个体长度
) @" s" `7 U4 N    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值2 f( J) a( O1 K2 }" u8 ~
    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值      x# p2 ~% {; ?! L
    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群
  O, S2 `$ M! e3 \1 _: o
" ]3 Q2 B+ V# ]% k* z0 N%---开始迭代进化8 P9 b4 B$ b( o% Q0 X: Q
    for gene=1:generations                      %开始迭代/ L, O* `; |/ ]% s
6 W% o# ~0 S; N
%-------交叉
7 f$ B" U5 x5 |5 \$ R        newpopulation=zeros(popnum,poplength);  %子代种群
7 Y/ M: t5 g4 M# H- R        for i=1:popnum/2                        %交叉产生子代- m4 o) ]; ?/ j6 P, p
            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法
& I$ F0 U* g( x% Y) I            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代2 x! v5 s5 q% D5 R- x  e
            newpopulation(i*2-1,: )=(population(k(1),: )+population(k(2),: ))/2+beta.*(population(k(1),: )-population(k(2),: ))./2;    %产生第一个子代           3 G. [/ y& m+ [7 R
            newpopulation(i*2,: )=(population(k(1),: )+population(k(2),: ))/2-beta.*(population(k(1),: )-population(k(2),: ))./2;      %产生第二个子代
; D- {: M$ X; q4 }# s' q        end
/ E) q) |1 F6 D  o0 ^
1 _  T' K$ d1 S+ ~%-------变异        ' k0 ?" p& V2 M7 y# K5 t
        k=rand(size(newpopulation));    %随机选定要变异的基因位
/ {) b8 V/ m3 {" u, k4 L        miu=rand(size(newpopulation));  %采用多项式变异6 b  m7 V0 _% ]
        temp=k<1/poplength & miu<0.5;   %要变异的基因位
; x# s1 O/ @& A/ }! p        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);        %变异情况一- _+ `+ L) ^- O6 @) U2 f
        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));  %变异情况二
% d$ O. s. H, @6 s( Q6 `5 p
" Z; |) ?* y* ~0 H2 {%-------越界处理/种群合并        
, V  T! k1 q5 N/ @- F  v+ W- g. V        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
; X- u! Q3 O, ?* T3 W        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理
6 _' D3 t% V5 k7 ~( u2 S4 P7 J        newpopulation=[population;newpopulation];                               %合并父子种群$ I2 |0 u4 P3 ~# Y) Q
3 T' t! e7 }0 C) P
%-------计算目标函数值        2 q* `) k0 m2 K0 {
        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1
1 B& u5 ]' Z6 c, F+ m' n        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值
4 {/ O% q, u) d% n7 V+ J5 }        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);
' ]- r7 F* I# O7 E9 F3 Z9 c        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值
& Q" l1 v) [' y1 q/ H6 z
4 B5 l/ g9 J: t, C2 L+ ^%-------非支配排序        
+ ~, E# Q5 F9 F1 y, W        fnum=0;                                             %当前分配的前沿面编号
3 G7 E# J2 y# f/ Z/ b) }3 n        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号
; z2 n+ @2 r; m+ B4 g        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号- |5 n" v8 |; H. k- x6 V/ T. U: U
        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序
0 t. Z1 f  j* _2 [$ d, h7 ]        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort
" W! B9 x6 p/ g7 a            fnum=fnum+1;
4 d, c+ J  u- `0 `            d=cz;
" w2 K- \/ V( q! B. ?            for i=1:size(functionvalue,1)
8 m. v% ]( U8 b+ I# N- K                if ~d(i)1 W8 V& L$ D, X7 Y0 T. c
                    for j=i+1:size(functionvalue,1)  M6 k! h1 f- |' M' f
                        if ~d(j)5 L: o: N. ^9 F$ ?. x
                            k=1;                            7 \5 s/ v' c- x0 k- k
                            for m=2:size(functionvalue,2)
5 A( {" }  x) \) V5 I7 q) z1 x! x                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)  M4 w" `' x" ~# B2 t. F0 [
                                    k=0;
9 l  K- O) M( z8 G8 Q  [) A% Y                                    break
4 m  X- @& c- N7 x2 w9 C                                end
2 r' z# q& d2 I8 k                            end
! i6 q1 t7 X, |) Y: g/ ^5 P                            if k) N" }, e9 M, T0 }2 T$ V% O
                                d(j)=true;
' R$ J* \5 a) ~5 A                            end% {* B- V. r/ b6 r2 O
                        end9 d: Y  t! f8 Y9 H& d5 k6 x
                    end7 q5 |3 _; S* }
                    frontvalue(newsite(i))=fnum;1 f) Y# g# B) V; i' x
                    cz(i)=true;; V% d8 m4 ^! N: N1 S& p
                end
" S7 D, M; @( h            end
6 R/ p7 Y9 O8 Z1 J; ]        end
; e$ Y* i9 r5 l7 c) K7 E" j; K, |& q* |& X
%-------计算拥挤距离/选出下一代个体        * D9 n: D/ g/ p  p4 P5 a! ]) q
        fnum=0;                                                                 %当前前沿面
- Y1 J( J$ r+ Q8 S/ v3 m0 t        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群
  W7 z: x2 g7 Q, M) n' j            fnum=fnum+1;1 E7 h  f, a" M# o* |
        end        
3 d2 y5 u" ]  h3 w        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数
8 l3 ~' D( A: b% H* d8 v$ M+ [- _        population(1:newnum,: )=newpopulation(frontvalue<=fnum,: );               %将前fnum个面的个体复制入下一代                       
8 j, q9 |, J' }- u1 \, j        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号3 F! h1 w" {2 V9 D+ \, K
        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离8 g! Q  F9 f6 t1 G7 G6 r; W2 \
        fmax=max(functionvalue(popu,: ),[],1);                                   %popu每维上的最大值" n) ^3 _9 O- I* o3 t5 t
        fmin=min(functionvalue(popu,: ),[],1);                                   %popu每维上的最小值
/ g% Z2 C8 ^, y+ l+ q. ?, Y        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离
4 C" W! A' h7 x9 ^: f6 Q- I& @: o( A# S            [~,newsite]=sortrows(functionvalue(popu,i));0 W/ }$ Q+ t5 K- X; \
            distancevalue(newsite(1))=inf;
! w+ K' }; ^( L. f; N. ?5 j            distancevalue(newsite(end))=inf;0 L3 [, Z  g" e' k0 ^+ R" M
            for j=2:length(popu)-1
8 c! l7 I* g  e& b1 R+ H                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));
4 q; _* m: m5 F2 o% k4 I7 v, P4 q) G" A            end3 \& j. I1 b2 ^
        end                                      ' E! M5 V. i  Z- d  t: D' N
        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体
& y5 x( D+ P. E        population(newnum+1: popnum,: )=newpopulation(popu(2,1: popnum-newnum),: ); %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        
8 R. k/ K; v6 A. j    end
, i3 z! v7 I0 J2 v
# I0 K7 e+ o9 b8 v& s- a  m' n7 S%---程序输出    4 E- ~. j. D5 e; J0 x. s# Z
    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时
0 H7 n  n) Z/ U- p    output=sortrows(functionvalue(frontvalue==1,: ));    %最终结果:种群中非支配解的函数值
! A' F2 F$ j1 _- }4 K: N7 p    plot(output(:,1),output(:,2),'*b');                 %作图4 d3 o8 b3 g& r6 Y+ x9 _! m
    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')
4 r- M/ g" t% p& Y# G9 Qend
- u; ~/ [3 D  B7 j8 c; ]. O1 H" ]( i/ U, q$ l4 s

" g* L! [9 V" p: C, H5 u2 w, k/ D1 r- a! P0 y3 [/ j* V- ?$ u, @7 h

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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