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

NSGA2 算法Matlab实现

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 uqHZau 于 2020-6-2 14:09 编辑
# D; @, b! p5 `* k3 R6 F- o  \& w% r' X/ I& x
为了能随时了解Matlab主要操作及思想。7 n8 I1 M( q- B! x# R

! ~9 f' O/ i: B) k( H+ Q故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。 ) ]1 [2 u/ f: q' R5 @# i7 t7 }: ~
0 P9 J! ?8 i% Q! L
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
% [% q( N# ^5 Z8 C①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;
- V: n3 I. D" [$ [②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;
* b% p" l. |- V: V2 a2 z! X2 ?③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。
. a6 x0 T! w/ ~% E, ?( z4 u1 A9 O* v& q! g8 \+ L7 U
Matlab实现:
% Y7 @' {, r$ @
" Y) c; x- U) zfunction NSGAII()$ Y1 `0 i- a' N: ^6 E
clc;format compact;tic;hold on$ d0 c; k/ r' v6 L8 _
4 J* C, b* ~# Y* _0 m; U
%---初始化/参数设定' [6 v% D* F4 }0 y
    generations=100;                                %迭代次数) ~8 K2 k. v6 x
    popnum=100;                                     %种群大小(须为偶数)
3 t$ u* T6 ^* B9 ~& j  s+ T  ]' q    poplength=30;                                   %个体长度% L. f" G, |) ]$ H4 b6 c6 b
    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值
! n! I4 w8 {% D  k    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值    2 v9 D! m& a+ m' z/ m+ M) `/ P2 ~
    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群
+ [2 C* i9 p, s; L1 y2 ~% x. P; R* [/ T- D4 @  t& l$ G
%---开始迭代进化
* w5 D# r: T8 Y6 N/ R* {& i    for gene=1:generations                      %开始迭代0 E" U) B1 A+ n  u

- z1 M& S4 V6 ?%-------交叉 2 Z3 w( b7 B2 k/ |! `) ]
        newpopulation=zeros(popnum,poplength);  %子代种群  f' U& i+ O( e+ S' n& a  v
        for i=1:popnum/2                        %交叉产生子代2 _, ]3 Q, x$ M# w! e+ E& ]
            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法
0 ~* g' ^+ b/ B; E$ i$ p& i            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代8 S7 x1 ]! [/ K6 y/ \6 M
            newpopulation(i*2-1,: )=(population(k(1),: )+population(k(2),: ))/2+beta.*(population(k(1),: )-population(k(2),: ))./2;    %产生第一个子代           ( Q7 V  j2 n. Z* @% Y1 Y' j
            newpopulation(i*2,: )=(population(k(1),: )+population(k(2),: ))/2-beta.*(population(k(1),: )-population(k(2),: ))./2;      %产生第二个子代+ k$ y/ A6 j! c; t/ l" Q8 P; T! E# @0 z
        end
& K& T% M% {9 t8 ^9 q# l
' q$ z8 v3 a" ]& s0 @4 `, T. y%-------变异        
) @: @7 R7 p  a, c! N        k=rand(size(newpopulation));    %随机选定要变异的基因位+ A" D  m, m+ U: |
        miu=rand(size(newpopulation));  %采用多项式变异( R: I$ d6 p% y( E- D: M
        temp=k<1/poplength & miu<0.5;   %要变异的基因位
2 m. `. x3 x* C! 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);        %变异情况一# F% m$ C7 b. m7 m  n( ^
        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* M2 }% u9 B9 d" @+ J8 I
2 F, G2 K$ a8 J
%-------越界处理/种群合并        ( a1 N# w4 y+ A9 C$ H
        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
+ g: q' @& C  I, R. ^7 F        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理& s7 ^4 o2 M+ I- Y5 |* n+ ]
        newpopulation=[population;newpopulation];                               %合并父子种群
$ v, r7 V4 o1 e' M1 U
' _) d8 ^- l* d%-------计算目标函数值        
$ s' z9 J( [; T        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1
( q# ~' b( k7 y* O        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值$ A& `5 @# S+ A, m
        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);! b  [2 e/ d3 r3 U- D1 ~) O
        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值) c" f2 j+ E& D: r; L

& c8 k  b& K# T' J" G$ D%-------非支配排序        
" X$ p% t+ M( Z3 q- l- s, m        fnum=0;                                             %当前分配的前沿面编号' V* v/ O3 A; g4 [
        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号
& f. T# Q- Q: n5 ?$ Y' @3 z        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号* _) a/ {$ o1 {
        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序
$ F. s( N) @, N& |( m; O        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort
6 I' J  @, d, J, @            fnum=fnum+1;' P% F: }. q" V3 v1 O% F
            d=cz;
: L4 ^  ^+ K; W8 w4 [7 J) B            for i=1:size(functionvalue,1)7 p$ N/ v. w( J0 d
                if ~d(i)
  n) I3 U) _7 P0 D0 w: k7 D                    for j=i+1:size(functionvalue,1)$ M; w6 t. @" C# z! L& ~& E+ L
                        if ~d(j)* w6 A5 n( p" T% F, E) d2 n# F
                            k=1;                            , X6 |; `* [' o" `9 t& H! u' [) E
                            for m=2:size(functionvalue,2)
% N5 i2 c7 l! c6 I9 c8 T4 q                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)
; A2 N( s" u3 Y                                    k=0;! S$ n1 {9 S4 O$ ?& H
                                    break3 I9 G0 `7 C0 b
                                end
$ i1 W- ~1 g  R5 }) K                            end
% G; s6 J) ?2 J$ x+ n) }- c$ E* q                            if k
, ^+ f0 z& ~/ A* C5 w                                d(j)=true;
3 D2 u/ Z3 ~! ?7 N                            end4 [) C2 @$ i2 @/ W5 ]
                        end
' p: G. m2 m! D6 M                    end
- {5 L& N; K* b+ u, s                    frontvalue(newsite(i))=fnum;- J; H6 Q/ g1 v4 u6 B
                    cz(i)=true;
+ v4 C; Y1 ~3 ^6 [& m& B6 A$ u                end" x. ~7 E2 ]: H
            end6 Q8 F2 |) [; |# V# {, r
        end7 Y9 G* @& V& o
5 Y/ W) `# s- d7 E
%-------计算拥挤距离/选出下一代个体        ) v, J: w2 P6 Q4 g0 `$ ]. C& i, U# o
        fnum=0;                                                                 %当前前沿面
% b: ]% {3 M3 O        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群$ f: [; Q! S! e5 w, z
            fnum=fnum+1;
8 U4 v7 v+ k7 ?8 `        end        " v& b/ F7 x7 f  [6 ?4 l
        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数
1 [3 Q% h0 o& G' P8 x/ W        population(1:newnum,: )=newpopulation(frontvalue<=fnum,: );               %将前fnum个面的个体复制入下一代                       . }/ L; Z! p& [0 }2 S# I4 i
        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号
: E9 U0 G- p" G& T        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离* M! O( Z8 d$ Q/ R( L* Z; A
        fmax=max(functionvalue(popu,: ),[],1);                                   %popu每维上的最大值+ Y& }0 j. b2 ~# J/ q4 N& d; [9 r3 i
        fmin=min(functionvalue(popu,: ),[],1);                                   %popu每维上的最小值7 |0 z; _# c( U" R7 A6 u1 h
        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离5 |: K- c8 @+ d- ]4 J
            [~,newsite]=sortrows(functionvalue(popu,i));! _) C5 U# Q1 O' e5 a3 T( K/ \; b0 u
            distancevalue(newsite(1))=inf;: ~' I" f3 {' ~* A( H' n- Z
            distancevalue(newsite(end))=inf;
$ Y- q: e/ @8 u: i' Y            for j=2:length(popu)-11 q- l/ r3 o% _, u. x
                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));0 ?( c/ w' U, Q
            end
: p( C( L5 h, ]        end                                      
- V! q7 L2 m9 [. L, M- F# S: c        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体
, H7 n0 l1 f; ^& ?        population(newnum+1: popnum,: )=newpopulation(popu(2,1: popnum-newnum),: ); %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        
2 C8 i' ?, u& E    end
5 y- ~$ V, g- U; x& ?
. S4 B3 K% H. Y; H: M%---程序输出   
- [4 T! x' r& U4 w; ^% R- H    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时
1 S$ }' l* a# h# x( ], b9 V% p7 I    output=sortrows(functionvalue(frontvalue==1,: ));    %最终结果:种群中非支配解的函数值; W) ^1 L* D, C' z5 C3 I
    plot(output(:,1),output(:,2),'*b');                 %作图6 N. F% T0 f% G: E
    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')  v. l2 Q% x, B7 l2 ]. P3 W
end9 Q  M/ \. k+ ]' D( G5 {
  `" W% |% J' p6 C* ]4 T0 K

! |3 p$ T# a. U0 P" G# j& D$ k6 F+ z# S' V2 S

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 03:52 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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