|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 uqHZau 于 2020-6-2 14:09 编辑
0 G- H" v! J) |* p, X4 Z R, \$ @' U* K* o! Y, _/ e
为了能随时了解Matlab主要操作及思想。# u' e9 B+ i% ]' ?* f) C0 u
& q! {% u n ~" L4 Y. W* w2 v
故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。
# x: x% ~' s% y, a1 h4 v1 Q; Y5 b1 u; v. b
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
3 W# O$ u: G( P) ?6 L. e+ b①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;
3 c- Z& Y* i) f, D) L- l; e2 I②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;
2 \" O( ]5 c8 e③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。$ {8 N* G; O: e- n! j+ k
8 R) n6 P m( M( a X1 q9 q; f2 J# @Matlab实现:
) H' ]7 M8 C7 f F5 R- P0 O5 m: k0 x5 v% C) X
function NSGAII()+ H, q* N+ P" T7 Z5 K) _
clc;format compact;tic;hold on- {6 M0 S, n% G2 S
% ^0 ]3 }6 H# F1 _% P%---初始化/参数设定
* B7 H+ S: M- g9 z( P, [ generations=100; %迭代次数9 c- W; Q9 o2 g; N
popnum=100; %种群大小(须为偶数)/ e6 x9 y( z$ ]7 p' e
poplength=30; %个体长度
/ O/ M& V& H9 L minvalue=repmat(zeros(1,poplength),popnum,1); %个体最小值
* w$ e! y1 ?) f& L2 T3 I maxvalue=repmat(ones(1,poplength),popnum,1); %个体最大值
, \/ V; S' V' g. j8 S$ J population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue; %产生新的初始种群
2 N2 `2 f# [5 c
. U+ d" W. Z& C) m%---开始迭代进化" @" `2 L! N* t4 z( x6 `
for gene=1:generations %开始迭代
+ } G% I4 W1 \8 N& d
' u6 G; k! H/ P& a+ Z1 G%-------交叉 ' J9 S" N( e7 a2 X7 M9 C
newpopulation=zeros(popnum,poplength); %子代种群 F- Z( P9 W( g/ i1 x! ?& l' y
for i=1:popnum/2 %交叉产生子代- Q6 K3 O" }+ Y/ f5 T* l4 ?/ ~
k=randperm(popnum); %从种群中随机选出两个父母,不采用二进制联赛方法 I' ^& e, c; N/ r k5 q" d
beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代
$ L2 W; a4 x$ m: k: ` newpopulation(i*2-1,: )=(population(k(1),: )+population(k(2),: ))/2+beta.*(population(k(1),: )-population(k(2),: ))./2; %产生第一个子代 8 y% p( X9 Q4 F: m3 y
newpopulation(i*2,: )=(population(k(1),: )+population(k(2),: ))/2-beta.*(population(k(1),: )-population(k(2),: ))./2; %产生第二个子代, r ]) O1 }2 d- C1 y' {7 Q+ Q: I
end1 a) ?( `! S/ R2 S
( W' V* A5 \- e8 L9 _4 @- W%-------变异 ; J/ u" ]" L# v5 V
k=rand(size(newpopulation)); %随机选定要变异的基因位
! z, L( Y' s7 n miu=rand(size(newpopulation)); %采用多项式变异
- U: p* D$ N3 S! }; @/ O0 } temp=k<1/poplength & miu<0.5; %要变异的基因位0 @, D/ g) O2 ^! Q' y7 B% t& r5 g. D7 r0 r
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); %变异情况一* g$ X9 ^) k+ V1 O7 ]
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)); %变异情况二
3 `& B$ E; j& V8 V a/ f/ r) b
) g* C' e5 q h2 |- a%-------越界处理/种群合并
0 r2 X# {8 e1 g* C e# h# m+ T# Y newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
. _$ [( C0 R. ^+ b* T$ A. k. R% W' B newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理; o& S: o# @" N0 W- `
newpopulation=[population;newpopulation]; %合并父子种群/ W3 ~" i8 F- M [
) e$ _! X, ^& ^- u" W" a%-------计算目标函数值 . Y7 m0 X2 J1 I) {7 h P' r
functionvalue=zeros(size(newpopulation,1),2); %合并后种群的各目标函数值,这里的问题是ZDT1; C2 t7 }- E; Z5 ^9 M' m: ]
functionvalue(:,1)=newpopulation(:,1); %计算第一维目标函数值4 N/ o$ k( p5 ?" ]$ o
g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);
8 l8 H4 I3 E- K/ t" h functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值- m- |% n: M* y0 }# _
7 v* B* T& B! y%-------非支配排序 4 {; h1 X. ?1 [ ^5 q! X M! O
fnum=0; %当前分配的前沿面编号
4 G( x; W6 x" D: q8 r, f cz=false(1,size(functionvalue,1)); %记录个体是否已被分配编号0 V, ?" [0 J5 C
frontvalue=zeros(size(cz)); %每个个体的前沿面编号. S* W2 Z6 O( o
[functionvalue_sorted,newsite]=sortrows(functionvalue); %对种群按第一维目标值大小进行排序
4 z$ @& v, }6 O% F: ? while ~all(cz) %开始迭代判断每个个体的前沿面,采用改进的deductive sort
$ v1 |: X0 w! P. S fnum=fnum+1;
7 s' ~3 U+ ^8 I J. S F d=cz;1 u7 y& N3 `6 z& N$ T6 S
for i=1:size(functionvalue,1) D3 J9 M9 ^( d) q3 p; a7 h
if ~d(i). R5 t% r8 @, [9 I, P
for j=i+1:size(functionvalue,1)
3 T2 i: M4 p0 `. B if ~d(j)9 b% B, E M, a! r: E
k=1;
8 Y: z; y& _' s4 n8 I9 f; s for m=2:size(functionvalue,2)7 c- W. W9 H" [/ C7 p1 S" S" h5 N
if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)
# C0 E5 }2 y0 N; h k=0;0 ]0 C8 K9 z* [7 @
break- x1 Q( Y6 W0 Z; D
end# O0 O2 Y5 Z1 e+ z. o
end
9 B0 H' K/ t# {" c if k
( \6 C( O8 t; _5 c d(j)=true;
3 ^& i6 [% Z7 l$ d end/ ?! p ?9 G9 _. ?8 x* v, s4 F6 y& P
end
0 q5 f: y& j. h8 A( c0 D2 h! @ end
+ K, t* P% @* v1 Q& [6 ~- Z' |* W# ~ frontvalue(newsite(i))=fnum;0 Q+ b* w4 ^/ j' H2 Q7 L2 y
cz(i)=true;
* C8 h9 F: t$ K2 H8 j T end4 l% [+ w* C8 g5 d# f5 t
end" s7 T8 G7 M; T0 a
end
6 a" f& V) K- W0 F0 v7 P; p/ O! n# L: h( a v
%-------计算拥挤距离/选出下一代个体
1 z6 d4 Y* Y" s9 O9 e4 K fnum=0; %当前前沿面
2 U! R4 U* E& m& P5 p* w while numel(frontvalue,frontvalue<=fnum+1)<=popnum %判断前多少个面的个体能完全放入下一代种群
9 H; U1 X: H5 p2 H9 m fnum=fnum+1;) X$ O2 p; v, y
end % t# [! S$ K8 C5 W& _% Y
newnum=numel(frontvalue,frontvalue<=fnum); %前fnum个面的个体数" V& B( l6 r' ], P/ P+ W
population(1:newnum,: )=newpopulation(frontvalue<=fnum,: ); %将前fnum个面的个体复制入下一代
2 r6 q2 s$ L) y ~ popu=find(frontvalue==fnum+1); %popu记录第fnum+1个面上的个体编号
: n# u1 V- d! y: W; B' |/ f& W distancevalue=zeros(size(popu)); %popu各个体的拥挤距离( Q V' J" \! Q3 r# Z
fmax=max(functionvalue(popu,: ),[],1); %popu每维上的最大值
, _% t: V! n) H4 F fmin=min(functionvalue(popu,: ),[],1); %popu每维上的最小值
# D0 `7 T) A1 H$ ]- D for i=1:size(functionvalue,2) %分目标计算每个目标上popu各个体的拥挤距离
$ t ]/ o" ~# O' a [~,newsite]=sortrows(functionvalue(popu,i));
& ]$ R1 M. U7 T4 U; v. y3 c* W distancevalue(newsite(1))=inf;
6 a/ t0 N2 n0 k- l" d4 F distancevalue(newsite(end))=inf;( x* o, @/ k; F& P& m; A% v& ~
for j=2:length(popu)-1
, g# `! i5 ?& D. A6 m7 v1 [; L distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));
8 t. z, O3 M) \& {/ R: L end
2 [( n. B/ D6 B- G! c. j5 f' T end
0 ]- o3 V$ m. i; g& \ popu=-sortrows(-[distancevalue;popu]')'; %按拥挤距离降序排序第fnum+1个面上的个体
' C& H0 t5 P( m population(newnum+1: popnum,: )=newpopulation(popu(2,1: popnum-newnum),: ); %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代 1 y! X+ ~) M! w: ^( J6 R
end
2 e0 a2 k" S0 H4 N* z; }1 H- P
/ z/ ?" d, J% C& z2 s%---程序输出
' ]: B8 a7 Q) ? fprintf('已完成,耗时%4s秒\n',num2str(toc)); %程序最终耗时
! V+ K" J! Y# r; P output=sortrows(functionvalue(frontvalue==1,: )); %最终结果:种群中非支配解的函数值& B- X7 `' t( V, b, w0 u- c& l# C
plot(output(:,1),output(:,2),'*b'); %作图8 y. J X/ z6 b
axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')) T- O) c8 P. K' y1 a
end( f9 _/ \! A2 ~/ y
- Y5 z3 {& z% R' a' h
D% Z" w* j8 |1 Y, h4 ]+ g
; y2 |& m7 ^5 {: m0 m# J |
|