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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
为了能随时了解Matlab主要操作及思想。
故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。
感谢郭伟学长提供的代码。
代码所有权归郭伟学长。
在看Matlab实现之前,请先看一下:NSGA-II多目标遗传算法概述

9 S/ n" e# b/ ]NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
. w4 A, v! C& q9 t$ V①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;
2 L) |" F/ X" f1 b. z7 Z②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;9 U# U2 c' [3 \4 r" D$ s
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。
8 ]3 T- [, g% M1 f3 a
- I7 v7 t6 k- h5 zMatlab实现:
# F9 f& Y% x' O" C$ `  j" w% n% {0 _6 B/ q$ v0 E& X
MATLAB
6 u% @3 X$ J' t: e0 x6 e4 X9 u4 Y5 ]. e& }5 K+ q$ |- F
function NSGAII(): S$ \$ j+ W8 @- F, I7 D
clc;format compact;tic;hold on# \" d7 f) U3 |) x% S& _3 C
    9 L& i: e4 D' R. ]- m
%---初始化/参数设定4 i8 Y  ]1 ^! \9 R& }+ z! [
    generations=100;                                %迭代次数6 R; [  ]4 ?* U- ^  M. X
    popnum=100;                                     %种群大小(须为偶数)1 j3 A% s1 n5 q/ z. f  l2 Z
    poplength=30;                                   %个体长度$ m  P2 o  [8 ^. P9 t
    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值5 k* f0 l8 O3 E/ [- U. h& S
    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值   
8 O6 h% c3 a7 A6 e* p2 m7 T    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群" [2 `6 r& w' h% ^' w
    ' c: n8 c* C& Q" z6 U$ t5 B* t
%---开始迭代进化
& X7 I  D6 ]. s. p' h    for gene=1:generations                      %开始迭代) G! ?" J6 r" X0 M$ D* |" b
        . @" ^! W' |( ~" @
%-------交叉 + N- U3 J8 k0 S" o
        newpopulation=zeros(popnum,poplength);  %子代种群
! g8 O3 ]* I) L2 L        for i=1:popnum/2                        %交叉产生子代
6 d9 ]) i4 G5 Y! u2 b0 Z            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法* s! P7 {4 B  p3 j1 f/ v
            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代
; Y# v3 i& i, Q1 v3 G: M" m3 |            newpopulation(i*2-1,:)=(population(k(1),:)+population(k(2),:))/2+beta.*(population(k(1),:)-population(k(2),:))./2;    %产生第一个子代           1 @( a5 l4 [  A
            newpopulation(i*2,:)=(population(k(1),:)+population(k(2),:))/2-beta.*(population(k(1),:)-population(k(2),:))./2;      %产生第二个子代  L$ j3 L6 ?+ F+ M+ D/ ]; L/ L
        end
0 C5 _: a: V: W        ! [! J1 V9 T  n: R
%-------变异        
1 {7 D; d) B! p+ Y        k=rand(size(newpopulation));    %随机选定要变异的基因位
0 u8 D1 Q3 _* k% z' a        miu=rand(size(newpopulation));  %采用多项式变异
* Q- q- n$ q3 I- y/ Q        temp=k<1/poplength & miu<0.5;   %要变异的基因位; ]* l) M; Y7 `0 u" G1 w( v* 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);        %变异情况一, L" p  B: M5 K. M, S& x' j- F$ t
        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));  %变异情况二
- [: k' [' V, i          \: q( T8 r: {! F/ {
%-------越界处理/种群合并        
8 l  h( {: d0 ^9 z        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理, x; Q1 T2 h+ u& [" [" B
        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理1 M* m& P& I4 w) ^9 R3 J
        newpopulation=[population;newpopulation];                               %合并父子种群
7 w6 @( w2 h2 v" H        - C9 U: J' q1 O! r
%-------计算目标函数值        : H0 Z( E' }6 g! R8 R
        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1
; T: j2 q& z8 J! E5 T  z( r        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值
" J. a5 q$ Y. b6 i7 X9 U# d        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);
) Q( k: S( ?4 V        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值
! ^; d8 i8 y; U7 H# B) A1 c        ( Z- ?+ `: V0 ]# i. N
%-------非支配排序        9 E1 d3 ~: o( h$ A6 C" u  R0 j5 p
        fnum=0;                                             %当前分配的前沿面编号% [* y5 O$ [* e
        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号
! V* J% N+ b- T$ p        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号# y6 p7 K8 @8 `. f
        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序
$ J* ^# Q) H) S; M0 n3 T/ @        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort0 N6 `9 ?8 l* j# X) w9 q* I' m. `0 A
            fnum=fnum+1;1 r! I: [; `4 V
            d=cz;9 q& k1 N4 u- B8 _: j& Q  f
            for i=1:size(functionvalue,1)
4 i( I+ g  J) h9 P& i) c                if ~d(i)
& G, m; ?! O! J' z+ c                    for j=i+1:size(functionvalue,1)
- ?7 z5 u* s* \% e0 b) o0 j                        if ~d(j)
( m2 i* w1 a* [$ K( u                            k=1;                           
  u0 J$ @" C) q% ]                            for m=2:size(functionvalue,2)  [% x) Z7 n# r3 {. l: j& O
                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)
5 i* N" S( d% \' F8 {                                    k=0;
. u8 D3 I$ F$ y4 V$ m9 ^                                    break, ~5 s. J/ C! _# h( `
                                end
: s$ ~% Q0 {. N: Q, f( H                            end2 Z1 G% X  T- v! J( F- t3 I6 Z. S
                            if k
" L& ~  R8 t$ h& M                                d(j)=true;( \2 r# d0 m0 a$ t
                            end7 `7 ]8 w2 J, f5 F" |1 n) x
                        end
! F6 |: ~1 f  ?/ ~                    end
! s" W  D5 n# P1 k                    frontvalue(newsite(i))=fnum;
' q5 z( a, v; [" o                    cz(i)=true;8 m7 N9 ]/ O8 \! q! j
                end
+ X4 W8 k& x; |            end) Y: v& W8 r, Z: X
        end1 y7 L. l4 K; ~/ l' I9 x7 U) t
        
) u7 T( _5 F% s%-------计算拥挤距离/选出下一代个体        
" N+ C( j2 T' p5 U5 j0 `        fnum=0;                                                                 %当前前沿面. C- f8 O4 \) T" H# x+ c
        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群
0 v, B" ]+ y2 k* `: K$ O  T            fnum=fnum+1;/ K2 k! b6 c: |5 d: C; |. b
        end        & n  x) Z. N& J8 n% Y0 u
        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数
/ G+ B" c0 ?9 U  B8 J        population(1:newnum,:)=newpopulation(frontvalue<=fnum,:);               %将前fnum个面的个体复制入下一代                       & ~- P% x; }8 {$ V! g( m6 Z
        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号, _( s3 G! V3 U+ R& ?2 Q
        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离
/ M3 z0 q8 e# O( ~        fmax=max(functionvalue(popu,:),[],1);                                   %popu每维上的最大值- B% K7 g- X" e" F' `
        fmin=min(functionvalue(popu,:),[],1);                                   %popu每维上的最小值
- L5 Y4 o8 L( n" N2 D+ _9 p" w) T        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离) d$ U0 `6 O4 T/ u8 L& y5 }- T
            [~,newsite]=sortrows(functionvalue(popu,i));
" M& J9 r3 ~! Q- O            distancevalue(newsite(1))=inf;5 \" g& W5 t+ h
            distancevalue(newsite(end))=inf;9 ]0 b7 `% Z. O8 i2 m4 G8 B
            for j=2:length(popu)-1
3 X! x- C5 V- ~- y1 Y! V                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));8 g7 o# r4 Z* t1 A1 }; X' \* a7 t
            end
8 {* N/ O; j2 y% O        end                                      
% o. n# U( j, G2 K        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体: ~# W4 M  b9 ]2 [. s
        population(newnum+1:popnum,:)=newpopulation(popu(2,1:popnum-newnum),:);        %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        9 l" l1 p/ I) Z% D, b; V9 W6 w+ s6 O
    end0 k4 q$ K" n* ^/ X8 I( w9 J9 T0 C
- M/ ]: M( t- J7 u
%---程序输出    8 G+ B1 {$ S1 g0 T& g; }
    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时
. `# A7 j7 d7 b2 s; s! t* [' L& X" H+ `    output=sortrows(functionvalue(frontvalue==1,:));    %最终结果:种群中非支配解的函数值% ~/ h4 i6 S3 r( u/ u2 t, }
    plot(output(:,1),output(:,2),'*b');                 %作图
! {+ Z7 r3 q" J5 B! l# ]  `    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')* H# w$ ?& @+ [2 [% Z: H
end2 a3 l% X! H7 U! V! h% k; F' x

/ w/ U; L9 `: b! E. E6 ?: C: G3 x+ F1 {. u

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-6 22:29 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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