|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 uqHZau 于 2020-6-2 14:09 编辑 4 L: O( W7 ~" _5 H' @2 d# o* H
4 P4 g6 ]/ `' b( R' |
为了能随时了解Matlab主要操作及思想。 R+ _% k. Y' h# B! v3 m& K
/ l: Q2 E7 ?& d- M$ v7 |5 e5 I
故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。 ) f% i3 M7 [6 G O0 I; \! d7 S
9 P% F( s8 {/ }( P
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
7 d; x: f o, J①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体; 0 L- A# D. m5 A* t4 G) Y9 ?0 v
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度; ( Y# k8 E$ _5 x
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。( ]! X1 I2 ?. Q
Z! W7 a$ |# I4 U# qMatlab实现:
! D; _' A9 c7 ?2 V1 F; W# H8 Z% a! ]; z Q; p j, Q4 _( y
function NSGAII()
6 n+ b5 I7 k$ B) }3 r% Rclc;format compact;tic;hold on
; C1 i+ H: E2 S( c! L- t9 M4 L
%---初始化/参数设定( l1 Y, o9 D" s& ?7 ^$ D
generations=100; %迭代次数1 I: ?" m, N& ^8 Q, l0 t+ U8 i
popnum=100; %种群大小(须为偶数)0 S7 j4 y5 Q$ }/ r6 S
poplength=30; %个体长度
) @" s" `7 U4 N minvalue=repmat(zeros(1,poplength),popnum,1); %个体最小值2 f( J) a( O1 K2 }" u8 ~
maxvalue=repmat(ones(1,poplength),popnum,1); %个体最大值 x# p2 ~% {; ?! L
population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue; %产生新的初始种群
O, S2 `$ M! e3 \1 _: o
" ]3 Q2 B+ V# ]% k* z0 N%---开始迭代进化8 P9 b4 B$ b( o% Q0 X: Q
for gene=1:generations %开始迭代/ L, O* `; |/ ]% s
6 W% o# ~0 S; N
%-------交叉
7 f$ B" U5 x5 |5 \$ R newpopulation=zeros(popnum,poplength); %子代种群
7 Y/ M: t5 g4 M# H- R for i=1:popnum/2 %交叉产生子代- m4 o) ]; ?/ j6 P, p
k=randperm(popnum); %从种群中随机选出两个父母,不采用二进制联赛方法
& I$ F0 U* g( x% Y) I beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代2 x! v5 s5 q% D5 R- x e
newpopulation(i*2-1,: )=(population(k(1),: )+population(k(2),: ))/2+beta.*(population(k(1),: )-population(k(2),: ))./2; %产生第一个子代 3 G. [/ y& m+ [7 R
newpopulation(i*2,: )=(population(k(1),: )+population(k(2),: ))/2-beta.*(population(k(1),: )-population(k(2),: ))./2; %产生第二个子代
; D- {: M$ X; q4 }# s' q end
/ E) q) |1 F6 D o0 ^
1 _ T' K$ d1 S+ ~%-------变异 ' k0 ?" p& V2 M7 y# K5 t
k=rand(size(newpopulation)); %随机选定要变异的基因位
/ {) b8 V/ m3 {" u, k4 L miu=rand(size(newpopulation)); %采用多项式变异6 b m7 V0 _% ]
temp=k<1/poplength & miu<0.5; %要变异的基因位
; x# s1 O/ @& A/ }! p 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) ^- O6 @) U2 f
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)); %变异情况二
% d$ O. s. H, @6 s( Q6 `5 p
" Z; |) ?* y* ~0 H2 {%-------越界处理/种群合并
, V T! k1 q5 N/ @- F v+ W- g. V newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
; X- u! Q3 O, ?* T3 W newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理
6 _' D3 t% V5 k7 ~( u2 S4 P7 J newpopulation=[population;newpopulation]; %合并父子种群$ I2 |0 u4 P3 ~# Y) Q
3 T' t! e7 }0 C) P
%-------计算目标函数值 2 q* `) k0 m2 K0 {
functionvalue=zeros(size(newpopulation,1),2); %合并后种群的各目标函数值,这里的问题是ZDT1
1 B& u5 ]' Z6 c, F+ m' n functionvalue(:,1)=newpopulation(:,1); %计算第一维目标函数值
4 {/ O% q, u) d% n7 V+ J5 } g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);
' ]- r7 F* I# O7 E9 F3 Z9 c functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值
& Q" l1 v) [' y1 q/ H6 z
4 B5 l/ g9 J: t, C2 L+ ^%-------非支配排序
+ ~, E# Q5 F9 F1 y, W fnum=0; %当前分配的前沿面编号
3 G7 E# J2 y# f/ Z/ b) }3 n cz=false(1,size(functionvalue,1)); %记录个体是否已被分配编号
; z2 n+ @2 r; m+ B4 g frontvalue=zeros(size(cz)); %每个个体的前沿面编号- |5 n" v8 |; H. k- x6 V/ T. U: U
[functionvalue_sorted,newsite]=sortrows(functionvalue); %对种群按第一维目标值大小进行排序
0 t. Z1 f j* _2 [$ d, h7 ] while ~all(cz) %开始迭代判断每个个体的前沿面,采用改进的deductive sort
" W! B9 x6 p/ g7 a fnum=fnum+1;
4 d, c+ J u- `0 ` d=cz;
" w2 K- \/ V( q! B. ? for i=1:size(functionvalue,1)
8 m. v% ]( U8 b+ I# N- K if ~d(i)1 W8 V& L$ D, X7 Y0 T. c
for j=i+1:size(functionvalue,1) M6 k! h1 f- |' M' f
if ~d(j)5 L: o: N. ^9 F$ ?. x
k=1; 7 \5 s/ v' c- x0 k- k
for m=2:size(functionvalue,2)
5 A( {" } x) \) V5 I7 q) z1 x! x if functionvalue_sorted(i,m)>functionvalue_sorted(j,m) M4 w" `' x" ~# B2 t. F0 [
k=0;
9 l K- O) M( z8 G8 Q [) A% Y break
4 m X- @& c- N7 x2 w9 C end
2 r' z# q& d2 I8 k end
! i6 q1 t7 X, |) Y: g/ ^5 P if k) N" }, e9 M, T0 }2 T$ V% O
d(j)=true;
' R$ J* \5 a) ~5 A end% {* B- V. r/ b6 r2 O
end9 d: Y t! f8 Y9 H& d5 k6 x
end7 q5 |3 _; S* }
frontvalue(newsite(i))=fnum;1 f) Y# g# B) V; i' x
cz(i)=true;; V% d8 m4 ^! N: N1 S& p
end
" S7 D, M; @( h end
6 R/ p7 Y9 O8 Z1 J; ] end
; e$ Y* i9 r5 l7 c) K7 E" j; K, |& q* |& X
%-------计算拥挤距离/选出下一代个体 * D9 n: D/ g/ p p4 P5 a! ]) q
fnum=0; %当前前沿面
- Y1 J( J$ r+ Q8 S/ v3 m0 t while numel(frontvalue,frontvalue<=fnum+1)<=popnum %判断前多少个面的个体能完全放入下一代种群
W7 z: x2 g7 Q, M) n' j fnum=fnum+1;1 E7 h f, a" M# o* |
end
3 d2 y5 u" ] h3 w newnum=numel(frontvalue,frontvalue<=fnum); %前fnum个面的个体数
8 l3 ~' D( A: b% H* d8 v$ M+ [- _ population(1:newnum,: )=newpopulation(frontvalue<=fnum,: ); %将前fnum个面的个体复制入下一代
8 j, q9 |, J' }- u1 \, j popu=find(frontvalue==fnum+1); %popu记录第fnum+1个面上的个体编号3 F! h1 w" {2 V9 D+ \, K
distancevalue=zeros(size(popu)); %popu各个体的拥挤距离8 g! Q F9 f6 t1 G7 G6 r; W2 \
fmax=max(functionvalue(popu,: ),[],1); %popu每维上的最大值" n) ^3 _9 O- I* o3 t5 t
fmin=min(functionvalue(popu,: ),[],1); %popu每维上的最小值
/ g% Z2 C8 ^, y+ l+ q. ?, Y for i=1:size(functionvalue,2) %分目标计算每个目标上popu各个体的拥挤距离
4 C" W! A' h7 x9 ^: f6 Q- I& @: o( A# S [~,newsite]=sortrows(functionvalue(popu,i));0 W/ }$ Q+ t5 K- X; \
distancevalue(newsite(1))=inf;
! w+ K' }; ^( L. f; N. ?5 j distancevalue(newsite(end))=inf;0 L3 [, Z g" e' k0 ^+ R" M
for j=2:length(popu)-1
8 c! l7 I* g e& b1 R+ H distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));
4 q; _* m: m5 F2 o% k4 I7 v, P4 q) G" A end3 \& j. I1 b2 ^
end ' E! M5 V. i Z- d t: D' N
popu=-sortrows(-[distancevalue;popu]')'; %按拥挤距离降序排序第fnum+1个面上的个体
& y5 x( D+ P. E population(newnum+1: popnum,: )=newpopulation(popu(2,1: popnum-newnum),: ); %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代
8 R. k/ K; v6 A. j end
, i3 z! v7 I0 J2 v
# I0 K7 e+ o9 b8 v& s- a m' n7 S%---程序输出 4 E- ~. j. D5 e; J0 x. s# Z
fprintf('已完成,耗时%4s秒\n',num2str(toc)); %程序最终耗时
0 H7 n n) Z/ U- p output=sortrows(functionvalue(frontvalue==1,: )); %最终结果:种群中非支配解的函数值
! A' F2 F$ j1 _- }4 K: N7 p plot(output(:,1),output(:,2),'*b'); %作图4 d3 o8 b3 g& r6 Y+ x9 _! m
axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')
4 r- M/ g" t% p& Y# G9 Qend
- u; ~/ [3 D B7 j8 c; ]. O1 H" ]( i/ U, q$ l4 s
" g* L! [9 V" p: C, H5 u2 w, k/ D1 r- a! P0 y3 [/ j* V- ?$ u, @7 h
|
|