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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
为了能随时了解Matlab主要操作及思想。
故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。
感谢郭伟学长提供的代码。
代码所有权归郭伟学长。
在看Matlab实现之前,请先看一下:NSGA-II多目标遗传算法概述
" D7 z; ?+ W% z# J5 ~
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:6 X1 i9 k* v: v7 d
①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;+ k; [' p0 h+ ^6 s/ ~; c' l
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;
( c. C* W, b) H" l8 b8 ~③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。
& \  V4 l+ E2 R( M' y5 x9 p
/ Y. M( m. o/ W. T& O  eMatlab实现:
' T/ j7 R9 _4 c1 \9 y5 z$ K. w! ]/ G, \1 x" O
MATLAB% @* c  r2 h6 N' q2 H! D. m5 `

% X- b9 @) K8 D5 K5 F9 Yfunction NSGAII(), h1 p, \* M8 H* n+ a
clc;format compact;tic;hold on
# H% ^, n8 \3 w1 Q. i    ' U+ X) d5 H: C/ [) |6 l
%---初始化/参数设定. a: J$ e* w$ ^
    generations=100;                                %迭代次数. A5 V( J. `) E5 I. Z/ E, \
    popnum=100;                                     %种群大小(须为偶数)! a  p0 `" |$ u: e% d' R8 N. k
    poplength=30;                                   %个体长度# c9 Q: W: ~0 N5 a* i
    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值9 \/ p8 Q2 F) d1 j: x! S
    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值    ( o! K$ q* x! F# P  X
    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群
5 |6 s6 b) V3 [( N2 d+ _! I    7 m, J: `# Y. \, D1 V& y1 b
%---开始迭代进化& w) b1 [* ~8 Y& N$ B3 H  K1 ]) [3 v
    for gene=1:generations                      %开始迭代
& f$ D6 `1 q( m7 W! J3 o        / J, ~# ?% a+ a
%-------交叉
% P: k/ G% B3 K) a8 {8 z; z$ c        newpopulation=zeros(popnum,poplength);  %子代种群
9 v8 m3 o. _8 ?/ a& D2 }& E/ M& L        for i=1:popnum/2                        %交叉产生子代
2 G( X- U/ _. b1 g8 ~  i            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法! ]( E9 a9 L2 s* t8 l' W2 n
            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代
$ f+ E( V, k+ a; d            newpopulation(i*2-1,:)=(population(k(1),:)+population(k(2),:))/2+beta.*(population(k(1),:)-population(k(2),:))./2;    %产生第一个子代           ( W2 \# s) v; `; I& x) C& p0 r
            newpopulation(i*2,:)=(population(k(1),:)+population(k(2),:))/2-beta.*(population(k(1),:)-population(k(2),:))./2;      %产生第二个子代% I1 {2 [) V5 v) `7 P! \# k: ?* p! C
        end
4 R* z/ Z" Z& I3 Y        
" A% a& Z) ?& p' R8 f' _%-------变异        
  O3 t& l5 }7 z2 p6 \- M" I6 S        k=rand(size(newpopulation));    %随机选定要变异的基因位
; _$ [9 W4 a1 `. E- d: I3 `        miu=rand(size(newpopulation));  %采用多项式变异( J  O3 s- ]% q) s* o
        temp=k<1/poplength & miu<0.5;   %要变异的基因位
1 `; D5 C! m8 U0 y6 D( @        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);        %变异情况一
4 c4 D1 }' A/ ^0 V! J- Y. a        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));  %变异情况二/ F/ H! v0 @) t- Q9 q% [
        ' F" f0 Z+ u, q* A
%-------越界处理/种群合并        
* c/ o4 h6 P7 ~5 V4 ?* q        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
6 |1 B" o2 }% N        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理
# M' H) o; D9 o) x- @        newpopulation=[population;newpopulation];                               %合并父子种群
* P9 I. {& d+ T        
% l! v2 V9 e! ~# T7 d: S%-------计算目标函数值        
! e% Y* D2 K$ C' A" F; ]9 P        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1
+ s. A' E5 U1 O' [5 e' q        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值
6 k) {  l4 Z7 I1 O        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);# s4 ], K( d% ~- H& ^* S
        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值5 a' i' i+ F2 @2 l7 S' K. P
        
6 g* f) p. U! u+ }+ ?( d, W) ~$ g%-------非支配排序        ) H5 J  X9 m3 p
        fnum=0;                                             %当前分配的前沿面编号
0 f9 Y# B( ^5 ]$ h6 o" @        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号+ j$ U0 ^; E4 U9 q& J- g& W5 O6 D
        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号
  j( i' d3 b% m" a3 m        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序# [: B  o* ]  G% G
        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort
0 o: A8 q3 r5 w6 M  ]            fnum=fnum+1;  p: H: ?4 `1 M7 H
            d=cz;
( Z, K3 }+ w! X8 Z; _3 J" ~" R6 @            for i=1:size(functionvalue,1)2 l# b/ }! e1 I. g& M& L9 x
                if ~d(i)6 r+ v/ ?0 [# n2 Z
                    for j=i+1:size(functionvalue,1)
9 `, s1 I  p3 l; j1 w                        if ~d(j)$ A5 y, \: O) p( i4 C% g2 u
                            k=1;                           
0 Z# [3 E/ B! E$ `$ g7 F1 m$ z                            for m=2:size(functionvalue,2)
7 K) B- B' t. ?& U& U                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)" O2 ]6 a, d3 w$ ], Q
                                    k=0;
7 _* t: i: A" N0 Z7 M+ J7 [                                    break5 X3 Y- r. N) h4 e. v7 i
                                end% ]+ v) U# ^! t7 E
                            end
* B1 e: N/ f7 b6 |; T: C. m" @                            if k6 Z$ N4 s; s" V( K) Q( c
                                d(j)=true;
' K" t# Z% q5 O; @6 [& E5 O                            end  W; Q+ n! a/ v6 q5 L
                        end
1 [7 _4 l1 s( h7 v9 \1 Q- j                    end8 l2 b1 r/ [4 g# T1 L
                    frontvalue(newsite(i))=fnum;2 B6 B: O- i) O) g, G2 r: U2 h
                    cz(i)=true;
) e1 g/ o4 y" {. r. K                end
. c$ l  R" j/ u) |& y6 y1 G            end$ |7 O! l5 W% P4 t* o1 n9 Z* b5 _
        end" B, [9 Z9 s" i* {: r
        
4 D# W1 Y- k; J  V8 [%-------计算拥挤距离/选出下一代个体        ' S7 ?2 x- D; s2 Y' J* L
        fnum=0;                                                                 %当前前沿面" d$ b# d0 M1 N# i4 n
        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群
- w# h1 z8 ~, ]( A5 U. [            fnum=fnum+1;
: U; `" x9 Y( A- f' O* B        end        ' V" @0 I9 ?4 P* n5 W" e) ~
        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数
, s7 p: ^  F4 I* [7 p1 A6 F! e& l. ^        population(1:newnum,:)=newpopulation(frontvalue<=fnum,:);               %将前fnum个面的个体复制入下一代                       8 U. O) }8 R3 i: ~0 L: U6 L
        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号
# R/ _5 Y. s1 J        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离5 G; C7 H. b0 }+ C9 _6 y# J
        fmax=max(functionvalue(popu,:),[],1);                                   %popu每维上的最大值
/ t- U0 d. s  i        fmin=min(functionvalue(popu,:),[],1);                                   %popu每维上的最小值# d; i' i- t* h6 e
        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离
3 G* D2 y# R. s- K* Q0 n% [/ m            [~,newsite]=sortrows(functionvalue(popu,i));
% R' F+ b$ X* E1 {+ t6 B            distancevalue(newsite(1))=inf;
0 Y  w2 A7 F4 d( \            distancevalue(newsite(end))=inf;; Q: C) R, l7 }' F% u
            for j=2:length(popu)-1
0 J! |- O. r+ ^& \                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));
4 e# A; _7 _" D- ]5 Q/ s% P            end) A) A0 y# a2 t
        end                                      
9 [1 I* T: M. M' z6 d! d; R8 M" _        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体
8 e# {6 _5 H8 ^% n" j7 a6 ]        population(newnum+1:popnum,:)=newpopulation(popu(2,1:popnum-newnum),:);        %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        
  ?# {1 b+ w9 m( i1 o7 W$ G    end
2 O  O, U& a, o7 o& F4 S) E( m  j& b4 _' I9 j( q
%---程序输出   
; k2 h7 w. {- j0 ^    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时8 h1 u% O. E" I) C
    output=sortrows(functionvalue(frontvalue==1,:));    %最终结果:种群中非支配解的函数值9 U5 v: k' t- N
    plot(output(:,1),output(:,2),'*b');                 %作图
% S* _; K' {4 w' c- W; F    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')) H" |- J% X0 u: D: T* E9 @6 Y4 A# u
end
; H+ w1 a) l% X8 d7 f
& m: |+ _, Z6 \+ q& s4 B% `
" R" |1 z: w* V! c7 d  V4 n

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-27 19:23 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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