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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

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

3 b" Y8 o! R' s2 G8 jNSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:0 E6 a: r& ~9 g+ l4 T2 N( O/ t
①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;
, R' c0 y) a: ]. l+ A( _9 a& u②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;7 g# y! i/ _: W
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。2 x- N2 e; j$ m  Y8 i
2 o# l; N. K; r9 t- ?  e- A7 P% S) D
Matlab实现:
( q% B1 J" U; C7 Z* B  d5 w
8 c* [9 `/ f" s  Y5 a# K, Y7 D- JMATLAB
; j8 P# J8 \/ q. M, e4 ]1 V( V! `) L7 \; O4 n: d' s2 ], ~4 h
function NSGAII()
/ d7 H! R9 p6 \7 Wclc;format compact;tic;hold on
- W& V4 w0 |$ G2 E2 v+ s0 u4 A   
1 r9 D2 q0 j+ h( ]; _%---初始化/参数设定5 T" x  g6 _: l
    generations=100;                                %迭代次数/ b4 d- `- L7 |5 h
    popnum=100;                                     %种群大小(须为偶数)
) I. ], U" S: W- g0 k    poplength=30;                                   %个体长度
2 T: o1 U* g- m2 d    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值
: y, h- Y) I  G" O1 O    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值   
6 J7 s1 z2 s3 [    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群, a$ {! \7 m0 o! E
   
! V8 [1 O- c! v+ N- C, N" k%---开始迭代进化
2 N. t% p* D. e    for gene=1:generations                      %开始迭代
+ ^( }! t- A. C9 S* S        + p$ b% G: Q  J( K- {+ Y3 S: G( q
%-------交叉
; C1 t# s8 ]# s$ m- e6 p! ~        newpopulation=zeros(popnum,poplength);  %子代种群7 G' K. c# i8 J/ F
        for i=1:popnum/2                        %交叉产生子代
4 o. T* w  d6 W9 F4 m            k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法; Q! |( G6 u1 z+ g% g
            beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代
/ R' @8 I& B  O, Q8 B, Q            newpopulation(i*2-1,:)=(population(k(1),:)+population(k(2),:))/2+beta.*(population(k(1),:)-population(k(2),:))./2;    %产生第一个子代           
1 F& g1 J+ t1 R4 {4 z9 G( ^            newpopulation(i*2,:)=(population(k(1),:)+population(k(2),:))/2-beta.*(population(k(1),:)-population(k(2),:))./2;      %产生第二个子代- ~* g. E4 c4 t! k) C5 S3 F: G
        end8 v8 T2 Q* [5 n% Z4 O5 l
        
7 u  L! A) N7 j%-------变异        
2 ], c8 O6 H! \: P        k=rand(size(newpopulation));    %随机选定要变异的基因位! k2 S+ ~' w8 {7 G6 S
        miu=rand(size(newpopulation));  %采用多项式变异
8 g; C/ f& [+ \4 t: h3 s        temp=k<1/poplength & miu<0.5;   %要变异的基因位
# _! r4 R2 Z" ^  o        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 E0 w4 I" l+ H0 g! z
        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));  %变异情况二
! v* i; A6 O( `        0 [6 x  m7 @' g9 n0 Z
%-------越界处理/种群合并        & n6 a' N5 M) j5 o3 i8 z
        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
) g) @3 B7 Z, G/ A8 A$ t" A        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理0 w5 L9 j4 ~% G- c1 o& Q# N
        newpopulation=[population;newpopulation];                               %合并父子种群
, O( q% h6 C; `8 T        ) z" f6 G6 z- u6 a3 g
%-------计算目标函数值        + x8 Y; b# `. @, `
        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1- f+ x4 _4 A& u: `. K1 r' U
        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值
2 n9 W1 [9 X1 ]0 C        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);
3 j. e, A5 c, N) y        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值
1 M8 g+ n1 n6 t. o7 Y        
' p# G! i+ L  U- l, S; B% e% y%-------非支配排序        + e) X& b' ~7 i. I1 t6 ~
        fnum=0;                                             %当前分配的前沿面编号' C. E' G. e! F5 S0 C" {0 Y) g+ j6 ^
        cz=false(1,size(functionvalue,1));                  %记录个体是否已被分配编号
: t. A6 \  Y! K        frontvalue=zeros(size(cz));                         %每个个体的前沿面编号# b; H. I) }) [* j# s
        [functionvalue_sorted,newsite]=sortrows(functionvalue);    %对种群按第一维目标值大小进行排序! O+ b) ^- R6 z0 i
        while ~all(cz)                                      %开始迭代判断每个个体的前沿面,采用改进的deductive sort
* o+ J* t4 G4 h4 W1 D. l' U9 ^            fnum=fnum+1;" k  Y- v/ r$ _% P- u" G
            d=cz;
/ ?& A) l# G0 [2 k            for i=1:size(functionvalue,1)
6 W. X4 j$ h; S6 H/ L                if ~d(i)
' _6 w; w; R& u4 R7 E                    for j=i+1:size(functionvalue,1)
1 u* x. ?/ N8 ]+ w" N                        if ~d(j)
; Z1 X- D* B4 |) w2 I' W' h                            k=1;                            ; W. c- A: O, [$ z
                            for m=2:size(functionvalue,2)
6 A# o! O8 }: O, q5 z) ?* ~                                if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)4 r. T5 N4 F( N% A( J! v
                                    k=0;1 Q$ M7 f# f; K+ v3 A1 w4 ~. w' f
                                    break
& y" \5 H2 i0 K' X) M: z4 a( t                                end
8 A/ b+ S; s/ S7 C; ^                            end
$ k1 Y+ U  T6 A. O; J2 v" x                            if k4 m3 Z0 h/ Y! M. h
                                d(j)=true;
$ }4 a: `/ k2 ]# u                            end# Z5 X: b2 @) |" p
                        end
8 M+ \8 Z! f8 c* e  {8 x4 i                    end
5 {2 S6 g: {; h; `2 N                    frontvalue(newsite(i))=fnum;
  y% v$ P, N4 G4 z7 b                    cz(i)=true;
5 V: n2 ^) j  k1 t& q2 l' {                end
" o1 O7 s' V/ x" T) c, f            end4 h1 X# i8 Z+ j, T
        end! k. W5 ~; g8 M( O/ |
        & s4 k; W$ N8 b: B" a% x
%-------计算拥挤距离/选出下一代个体        
% l5 z2 }# s+ r        fnum=0;                                                                 %当前前沿面. i2 G  ~# n! v6 Z0 m
        while numel(frontvalue,frontvalue<=fnum+1)<=popnum                      %判断前多少个面的个体能完全放入下一代种群3 K- Q( v( c" M' Y% H
            fnum=fnum+1;0 ^6 w7 O) {: ]! C: N
        end        
+ X1 r% o" S4 Z! c% H        newnum=numel(frontvalue,frontvalue<=fnum);                              %前fnum个面的个体数
' ?( O4 ]' s3 X6 P3 w        population(1:newnum,:)=newpopulation(frontvalue<=fnum,:);               %将前fnum个面的个体复制入下一代                       & `1 Z/ a/ O& e1 M. L
        popu=find(frontvalue==fnum+1);                                          %popu记录第fnum+1个面上的个体编号
' B, h5 K. ~" [" \        distancevalue=zeros(size(popu));                                        %popu各个体的拥挤距离, \2 H- a% c. ?7 @7 ?
        fmax=max(functionvalue(popu,:),[],1);                                   %popu每维上的最大值
# H+ W! w! J7 B) r% |$ P6 F        fmin=min(functionvalue(popu,:),[],1);                                   %popu每维上的最小值5 l, M+ s0 r9 Z' d/ [$ [- u
        for i=1:size(functionvalue,2)                                           %分目标计算每个目标上popu各个体的拥挤距离
' q6 W3 g$ @# ]. B0 T) k            [~,newsite]=sortrows(functionvalue(popu,i));
3 f" x( P& E- t. m0 f            distancevalue(newsite(1))=inf;+ v1 T' K- G/ ?0 s  g6 G3 L
            distancevalue(newsite(end))=inf;
( w* R1 B2 }( n, [7 e1 C            for j=2:length(popu)-1/ L% J: K4 I4 f# x7 ^! b- M
                distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));/ E0 z: p( \1 _% {4 t4 X) N
            end1 d2 L) Q9 \! R4 a
        end                                      1 z% h  ?* J. P/ |% a
        popu=-sortrows(-[distancevalue;popu]')';                                %按拥挤距离降序排序第fnum+1个面上的个体
8 ?! r' `! E! ~" H4 E: g        population(newnum+1:popnum,:)=newpopulation(popu(2,1:popnum-newnum),:);        %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代        
2 }5 I9 ]  P8 T6 J# k. T    end
3 D  _! D# H' ]! i1 I0 u
9 i+ @- Q% i* U* V* l% o%---程序输出    / d3 M, \' i. ~) }' C6 C
    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时$ _) s  d1 h/ w2 ~( M8 C2 v
    output=sortrows(functionvalue(frontvalue==1,:));    %最终结果:种群中非支配解的函数值
/ A" M7 h( V, c" ]7 G- f- W    plot(output(:,1),output(:,2),'*b');                 %作图
" A! q! l6 V+ F6 o! z    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')- {, M6 E0 B- }8 }9 c
end$ }4 f9 R5 a$ K, g8 X( j/ B- a

) v" j5 v/ O+ E% a' |8 m- M2 k2 S5 Q3 p5 p7 p/ [

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-13 05:42 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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