|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
为了能随时了解Matlab主要操作及思想。 故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。 感谢郭伟学长提供的代码。 代码所有权归郭伟学长。 ( 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 ` |
|