|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 uqHZau 于 2020-6-2 14:09 编辑 : U% @- A# t) f& g# M. }
6 v! ]3 u/ a, O# W$ g- t6 z* U! L1 Z
为了能随时了解Matlab主要操作及思想。2 D5 |- }, L* X( K4 f2 B3 U
5 J% Q9 ~6 r4 q+ a" L" c! c3 `7 ?故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。 * _, N, T( g" E( o0 V
+ q! R: o, h( a* ?NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
~/ J4 P1 O* Y( f0 ^①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体; 0 ^. @& @$ R$ G- R5 ~5 b, ~; T
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;
6 u7 T7 f0 N E" T③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。, u3 z) p/ k2 ?* \- @
; r. s$ v+ L5 A( Q* b7 l. GMatlab实现:3 S& o! i: o7 V! s- t
% N) {; T5 _3 U- ?0 S/ Z% Zfunction NSGAII()8 H1 d7 _2 J! Z6 _
clc;format compact;tic;hold on( u# d; u+ k3 Q5 `# L5 k4 f
4 R4 T: U" h& C$ B4 A4 ~%---初始化/参数设定
2 z, x) P) k# p generations=100; %迭代次数
5 Q8 T# H! D1 }! O$ W popnum=100; %种群大小(须为偶数)
' C9 Z/ e, K4 S$ V poplength=30; %个体长度1 `6 M E: w7 Z
minvalue=repmat(zeros(1,poplength),popnum,1); %个体最小值
% L, E: U$ V, a% \4 E maxvalue=repmat(ones(1,poplength),popnum,1); %个体最大值 , e& [8 F, l. P( ~3 I0 Y, D" Y
population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue; %产生新的初始种群
1 W# x9 S# B7 p4 q) [/ e$ f
" u1 H9 T. j0 z; j1 I% H%---开始迭代进化% W8 z6 b A, E3 G. J1 f& n
for gene=1:generations %开始迭代
$ J( J& R' f. |- j+ ?5 v) r @9 j2 E9 j5 T6 e9 c9 K, M" {
%-------交叉
V* @9 s' V) h7 ~; | { newpopulation=zeros(popnum,poplength); %子代种群
* A% R# L8 w8 G" V# _: [ for i=1:popnum/2 %交叉产生子代
7 z" ^' V5 \2 _& h( D k=randperm(popnum); %从种群中随机选出两个父母,不采用二进制联赛方法/ X# M8 \( Z" f! k+ v1 K9 a& ~
beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代
l G( C1 _( O2 ] newpopulation(i*2-1,: )=(population(k(1),: )+population(k(2),: ))/2+beta.*(population(k(1),: )-population(k(2),: ))./2; %产生第一个子代
: p, }0 J: Z* ? newpopulation(i*2,: )=(population(k(1),: )+population(k(2),: ))/2-beta.*(population(k(1),: )-population(k(2),: ))./2; %产生第二个子代- j6 s0 L' {- d$ V$ c6 J
end
4 Y2 K% h& V% ^" Z
7 d# q' Q P/ S%-------变异 / d( ^( d, P. l$ Z; _# r
k=rand(size(newpopulation)); %随机选定要变异的基因位* w/ s( }; _( `' b: e
miu=rand(size(newpopulation)); %采用多项式变异
; ^ H# b, @/ Q3 a# J temp=k<1/poplength & miu<0.5; %要变异的基因位
- i6 A- ^4 w$ t9 z ? 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); %变异情况一 n6 e5 S. y$ G2 L
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 l" M$ e9 W9 P. r
( T! u4 O4 ~1 V1 _1 ]: h2 }%-------越界处理/种群合并
# H0 c, |) l8 A newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
; J% N& w# T6 L- x0 K newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理
6 M( O! y# }1 b5 Z newpopulation=[population;newpopulation]; %合并父子种群
! s' [9 f( {2 a% h# r
$ ^% V- r) H5 W0 r4 T%-------计算目标函数值
2 ]" C) _/ f: v0 c5 r functionvalue=zeros(size(newpopulation,1),2); %合并后种群的各目标函数值,这里的问题是ZDT1
^; B* [" I4 V3 Q) e. d6 _. ? functionvalue(:,1)=newpopulation(:,1); %计算第一维目标函数值
* Y8 ^/ A1 s8 h9 P9 k5 o; ?& N g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);0 w, H v7 q7 N( U5 V" I& ~
functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值. ]# M$ j1 `' E
, S3 } i2 I4 J+ r- r( Y4 g%-------非支配排序
5 S2 ]: b& c. N* S) U) L/ | fnum=0; %当前分配的前沿面编号
' D, o5 r- v1 G' h6 y& H cz=false(1,size(functionvalue,1)); %记录个体是否已被分配编号
& }6 U0 x6 d( J7 k8 V8 R1 v9 P/ J frontvalue=zeros(size(cz)); %每个个体的前沿面编号2 \; r! A. c8 v# l- n! w- M
[functionvalue_sorted,newsite]=sortrows(functionvalue); %对种群按第一维目标值大小进行排序
( g( u- g5 F) C4 e+ O9 p4 r while ~all(cz) %开始迭代判断每个个体的前沿面,采用改进的deductive sort
# c( l! D m# q' l- n0 B( m" e/ _ fnum=fnum+1;
7 l& W* C2 d" P- y7 t* B& e8 o d=cz;
, y3 ^1 I x9 L3 b for i=1:size(functionvalue,1)* |% e7 L, e2 f( j0 g: Y. r
if ~d(i)
0 U7 L7 Y) u' p( Y! G! K7 y$ [ for j=i+1:size(functionvalue,1)+ H; F2 H% q. y& ~$ ]0 N+ b# d
if ~d(j)
) y. v* X- Q2 O5 l k=1; 2 H, d3 E% M. _, S% ]
for m=2:size(functionvalue,2)5 o, m7 ], |' Y, x. o! Q
if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)
. [/ J! }: g3 Z( n. { k=0;
* m: e% v! }6 ~1 f5 D; H4 z2 V6 j break7 ]- _: D' |2 B) Z
end0 p' e* k( A$ k# O. r: ~
end
! }5 @$ A' ^" ]5 k7 y. @ if k
R ~8 N" i# z+ ~ d(j)=true;
. k* F# i& k( C7 E, W1 p" n end
y8 u9 b. Q2 G4 p$ \ end: Y1 X) l: S# U2 K. O6 M
end2 C/ _/ Q) j! C" L- f& I. B8 w8 F. z; d# j
frontvalue(newsite(i))=fnum;
: U& i$ k4 n4 d+ `- f cz(i)=true;. ?! C9 H; L i4 I& s
end
. j1 T4 C& U/ e& k2 H+ e end+ D# S) a& t9 [# p c( P+ W6 a. w
end
* a& x1 q7 f" J
- C: ]- C5 d6 C5 M0 h" o- W+ \%-------计算拥挤距离/选出下一代个体 0 W" |8 L8 \; E& C v; @% {: R8 g
fnum=0; %当前前沿面
, Y: |* q4 Y: p* H while numel(frontvalue,frontvalue<=fnum+1)<=popnum %判断前多少个面的个体能完全放入下一代种群
. S4 x+ F$ U3 ? fnum=fnum+1;" _/ f1 f+ [$ B& _! k
end
$ ~/ v1 l! s. O+ d; Z+ a newnum=numel(frontvalue,frontvalue<=fnum); %前fnum个面的个体数
4 i: r. n6 a2 Q) p population(1:newnum,: )=newpopulation(frontvalue<=fnum,: ); %将前fnum个面的个体复制入下一代 - l9 ]/ m: A: V, n' X
popu=find(frontvalue==fnum+1); %popu记录第fnum+1个面上的个体编号
$ G% P9 j9 N- r# b7 l9 w distancevalue=zeros(size(popu)); %popu各个体的拥挤距离$ }- v: J5 |9 K- I; ?
fmax=max(functionvalue(popu,: ),[],1); %popu每维上的最大值% s7 k3 |3 W$ h8 l; `; [
fmin=min(functionvalue(popu,: ),[],1); %popu每维上的最小值# [0 [; z- R; \3 H$ I' l
for i=1:size(functionvalue,2) %分目标计算每个目标上popu各个体的拥挤距离
8 P: h, X3 d$ `9 U3 J# y [~,newsite]=sortrows(functionvalue(popu,i));1 f; d d, y9 B; Y& `7 I
distancevalue(newsite(1))=inf;, d2 u! m. {% n, w
distancevalue(newsite(end))=inf;( w& j n5 C3 H7 L; r1 W
for j=2:length(popu)-1" `& Y% a* P, N; X% ^! n2 M
distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));
' U8 h. u' U$ x7 y7 M end
' _3 T: f# z# b- a l7 { end
8 g3 W& ^4 L- t9 m4 P* h+ l# d8 N+ h popu=-sortrows(-[distancevalue;popu]')'; %按拥挤距离降序排序第fnum+1个面上的个体2 P2 I* M. |1 Z" P x3 I
population(newnum+1: popnum,: )=newpopulation(popu(2,1: popnum-newnum),: ); %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代 6 g& T* V" x8 ~- G
end/ X' T1 {$ {0 C5 z
4 d: O: T/ V2 s9 M3 O$ c%---程序输出
3 u, p! w, @* r fprintf('已完成,耗时%4s秒\n',num2str(toc)); %程序最终耗时2 S- s. b* Y- i, L) l) d
output=sortrows(functionvalue(frontvalue==1,: )); %最终结果:种群中非支配解的函数值
, Q$ }+ D6 X6 x Y9 U plot(output(:,1),output(:,2),'*b'); %作图
+ l0 I* i& {9 ^. v P axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')
; B& s3 K7 M Qend
* H1 ]5 w" b# t
% C7 P" Q& _, K+ C+ [2 s
3 T7 I# D. [& {) t& R/ ~. E& K5 Q, F& v8 E: @
|
|