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

NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
为了能随时了解Matlab主要操作及思想。
故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。
感谢郭伟学长提供的代码。
代码所有权归郭伟学长。
在看Matlab实现之前,请先看一下:NSGA-II多目标遗传算法概述
( J( |" V$ n# c1 S
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
7 x* ~$ O1 G$ p# I0 n+ w: ?& E①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;
; d; s, s* X3 ^- W$ G②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;
) Q& j7 b# n  s③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。
2 E4 i8 w# o+ V9 t6 P5 P" t' y, X& Y" K0 n
Matlab实现:" v! c4 ~5 D) D4 U
5 j) r/ |' T8 n% ^3 y) o/ F
MATLAB
$ i, i6 |  u1 i$ a: f
/ M4 R/ C0 o. Gfunction NSGAII(); x! L7 j, F) E  f& u$ c5 ?6 U3 B7 U3 B
clc;format compact;tic;hold on6 E1 T9 z0 i1 G( P% `
   
! G0 o1 R. S. U& n9 Q$ b: e%---初始化/参数设定4 V. e. Z+ F1 X( V: F+ v3 z( P. q
    generations=100;                                %迭代次数
0 V4 d" C* z; e5 y* l: H! u    popnum=100;                                     %种群大小(须为偶数)
" {- O3 h* u7 v5 l6 F/ j- y    poplength=30;                                   %个体长度
7 E/ n+ n: c7 j! w' n+ F    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值+ u% v& S$ G; Z% L" j, f
    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值    : s, n1 J2 R, D6 b+ t1 e
    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群
1 q- I/ O$ ]' Q2 l6 b/ G0 u" B   
* `# W8 C6 a+ o3 x$ m%---开始迭代进化
, t8 ^: R  w4 c! T  r    for gene=1:generations                      %开始迭代) ]% \$ j" H1 A' _9 J
        4 U5 {% m5 b, Y# v! w( T& O( q
%-------交叉
6 P9 i+ z7 N' }  W* u+ w        newpopulation=zeros(popnum,poplength);  %子代种群: P4 o+ P5 d. j. Z+ `0 F$ Y2 `. w
        for i=1:popnum/2                        %交叉产生子代
" K% m6 \+ G) g0 k- A9 Y            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法2 n6 R/ k0 l9 D% Y1 i5 v+ y1 A
            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代
. c. s* e  w- ]2 H' W( {6 {. w            newpopulation(i*2-1,:)=(population(k(1),:)+population(k(2),:))/2+beta.*(population(k(1),:)-population(k(2),:))./2;    %产生第一个子代           ) c5 X7 c  _) O; `& z8 b
            newpopulation(i*2,:)=(population(k(1),:)+population(k(2),:))/2-beta.*(population(k(1),:)-population(k(2),:))./2;      %产生第二个子代, W- T  ~, i, z- {2 N; N
        end/ E: I# O* W5 b
        
7 e/ W5 B. O# j3 f6 w%-------变异        
6 f6 f# N  t6 W8 t' r; y        k=rand(size(newpopulation));    %随机选定要变异的基因位2 ?! J$ n& F; k) X+ ^: E' [
        miu=rand(size(newpopulation));  %采用多项式变异$ I) B! k  R5 P5 e2 c" @8 W2 C
        temp=k<1/poplength & miu<0.5;   %要变异的基因位
/ h& D5 u8 Z6 m' x6 u0 n        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);        %变异情况一
( J4 D# V5 C( |6 _/ |. z9 k        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 J1 ^7 c; z1 O9 o; U
        0 Y9 o9 m0 T3 d% G9 f7 D3 E! c
%-------越界处理/种群合并        
- E( `5 d4 P/ I0 s# h% k        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理% k5 Y% p+ B1 t- q9 i; [$ `* F
        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理
8 {" Z# G/ |% o        newpopulation=[population;newpopulation];                               %合并父子种群
# h! b+ t3 e5 k* Y- F  ?, W* r7 C        
7 `: `6 x8 O' B4 l; P% o%-------计算目标函数值        ! l2 N( \1 T7 S& `, Z
        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1, a) W: h9 Q; ^+ a, l& J, q
        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值) K2 r9 l, i' t* w
        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);
' p  K( }5 V$ H0 M        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值) j# T5 l% u: v2 H# ~2 F  K
        
3 R& U3 x5 `) S% W6 U5 _%-------非支配排序        
( o7 l9 E- F3 q9 h. J: ^        fnum=0;                                             %当前分配的前沿面编号
) H) i! N1 ?) Y2 z) l8 T" W        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号* P. x* g/ P8 ^3 x5 @% f0 k
        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号
4 V, ~. ]( i9 T$ q        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序' O3 Z$ }( N; D% Q
        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort3 H" j/ H& @$ G, _" m( G! P7 z$ j
            fnum=fnum+1;. \) L# T% `  F" o
            d=cz;
& H0 b" m2 q7 |6 C" E+ O+ L            for i=1:size(functionvalue,1)
& q* A( O+ Y, c# v/ w* |4 Z" A                if ~d(i)7 W5 U) L0 |- o+ {* _
                    for j=i+1:size(functionvalue,1)
) o' h3 t( E) j: B: C( ]# `& m                        if ~d(j)
" A6 P) x5 p( r; w) E                            k=1;                           
0 [0 F9 p% L) S) O                            for m=2:size(functionvalue,2)
' T6 S3 e0 m& _1 o# |+ C6 |                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)1 q8 D9 e/ Y# C, n
                                    k=0;, I6 k: o. E  b6 a/ f
                                    break. _' {( b' t, t* d* G5 W
                                end
" c7 l9 e6 x) I( o- x- ?8 q                            end& u8 g( d# L- T) d. A" ~. Z
                            if k
2 p% b  i. _! l" y, [. p; S: o                                d(j)=true;0 J; c& i# o* p& L, B
                            end
* C# m, E+ `+ F                        end
# A% X4 M6 U) r/ ]/ l& A  a                    end
2 q1 w9 y. w3 z4 ]& g$ R$ W" @5 a                    frontvalue(newsite(i))=fnum;
7 x0 g/ y' o% [- t' E& D" j$ V+ e: t9 I                    cz(i)=true;& j. v% k4 d) r, N( g& L, ~
                end7 ~1 ^+ D9 ^% z' E" n* `4 B
            end
; ^8 V8 w/ _: t$ w3 \% x        end
- y( E3 [; `( W0 @/ {4 W        % i* @/ |( L7 A" P
%-------计算拥挤距离/选出下一代个体        
8 F* Q8 Z% o7 |; ^9 ^        fnum=0;                                                                 %当前前沿面
" ~. c- l8 I4 j- c  U* I        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群- m8 K5 B. ]! U9 l" a$ d! Z( }
            fnum=fnum+1;1 S2 G; B$ N- v' g. c$ p' J
        end        8 V6 X' H; h: E7 _
        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数7 Y' ~: Y0 n) w8 _8 F
        population(1:newnum,:)=newpopulation(frontvalue<=fnum,:);               %将前fnum个面的个体复制入下一代                       % z8 ?9 Z1 z& [+ c/ @5 O5 @6 b
        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号
. H7 J6 U( b4 J3 B        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离$ F1 H+ I/ R+ ^; b# F. a2 y
        fmax=max(functionvalue(popu,:),[],1);                                   %popu每维上的最大值% U+ D/ P) n3 K4 M8 w+ f+ r- P' a
        fmin=min(functionvalue(popu,:),[],1);                                   %popu每维上的最小值5 w( l* H/ {; P8 l
        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离
/ ]$ d9 l8 q' }0 w* U            [~,newsite]=sortrows(functionvalue(popu,i));
. r) C% O5 E: D" K6 O            distancevalue(newsite(1))=inf;  A$ [' w" ~. }2 J* W3 ^6 O
            distancevalue(newsite(end))=inf;1 n/ _5 S, e; h% B3 N, l5 y
            for j=2:length(popu)-1* c) n6 q4 v4 i9 s# j( G3 k" C, ]8 e
                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));& W9 d% Y7 ~9 S9 Z
            end7 F5 B2 S" L# i% _
        end                                      8 F1 D' }, ?: D1 ^" `" M
        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体; O( T; Z& a7 S7 f  k2 z" W5 m
        population(newnum+1:popnum,:)=newpopulation(popu(2,1:popnum-newnum),:);        %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        
) B5 Z, M1 Q  G5 V    end
) ~( [9 d# m8 r4 C
9 {) @7 k( T; d/ L5 ?" ^; b1 Z, j( L%---程序输出    # P4 r" {1 N2 `$ p& E0 Z
    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时
$ ?# V. d3 K4 q& `1 n    output=sortrows(functionvalue(frontvalue==1,:));    %最终结果:种群中非支配解的函数值  t3 O+ P# V' k9 S/ @
    plot(output(:,1),output(:,2),'*b');                 %作图4 |, J) C) }0 d$ l. c
    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')
% g* H9 d! W% s! p' Xend" A1 N: \* h6 V: _6 x
8 I) F. z4 w5 B2 ]

. H( [0 l3 S) Z! ~8 `

该用户从未签到

2#
发表于 2020-9-16 17:43 | 只看该作者
提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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