|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
为了能随时了解Matlab主要操作及思想。 故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。 感谢郭伟学长提供的代码。 代码所有权归郭伟学长。 " D7 z; ?+ W% z# J5 ~
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:6 X1 i9 k* v: v7 d
①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;+ k; [' p0 h+ ^6 s/ ~; c' l
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;
( c. C* W, b) H" l8 b8 ~③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。
& \ V4 l+ E2 R( M' y5 x9 p
/ Y. M( m. o/ W. T& O eMatlab实现:
' T/ j7 R9 _4 c1 \9 y5 z$ K. w! ]/ G, \1 x" O
MATLAB% @* c r2 h6 N' q2 H! D. m5 `
% X- b9 @) K8 D5 K5 F9 Yfunction NSGAII(), h1 p, \* M8 H* n+ a
clc;format compact;tic;hold on
# H% ^, n8 \3 w1 Q. i ' U+ X) d5 H: C/ [) |6 l
%---初始化/参数设定. a: J$ e* w$ ^
generations=100; %迭代次数. A5 V( J. `) E5 I. Z/ E, \
popnum=100; %种群大小(须为偶数)! a p0 `" |$ u: e% d' R8 N. k
poplength=30; %个体长度# c9 Q: W: ~0 N5 a* i
minvalue=repmat(zeros(1,poplength),popnum,1); %个体最小值9 \/ p8 Q2 F) d1 j: x! S
maxvalue=repmat(ones(1,poplength),popnum,1); %个体最大值 ( o! K$ q* x! F# P X
population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue; %产生新的初始种群
5 |6 s6 b) V3 [( N2 d+ _! I 7 m, J: `# Y. \, D1 V& y1 b
%---开始迭代进化& w) b1 [* ~8 Y& N$ B3 H K1 ]) [3 v
for gene=1:generations %开始迭代
& f$ D6 `1 q( m7 W! J3 o / J, ~# ?% a+ a
%-------交叉
% P: k/ G% B3 K) a8 {8 z; z$ c newpopulation=zeros(popnum,poplength); %子代种群
9 v8 m3 o. _8 ?/ a& D2 }& E/ M& L for i=1:popnum/2 %交叉产生子代
2 G( X- U/ _. b1 g8 ~ i k=randperm(popnum); %从种群中随机选出两个父母,不采用二进制联赛方法! ]( E9 a9 L2 s* t8 l' W2 n
beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代
$ f+ E( V, k+ a; d newpopulation(i*2-1,:)=(population(k(1),:)+population(k(2),:))/2+beta.*(population(k(1),:)-population(k(2),:))./2; %产生第一个子代 ( W2 \# s) v; `; I& x) C& p0 r
newpopulation(i*2,:)=(population(k(1),:)+population(k(2),:))/2-beta.*(population(k(1),:)-population(k(2),:))./2; %产生第二个子代% I1 {2 [) V5 v) `7 P! \# k: ?* p! C
end
4 R* z/ Z" Z& I3 Y
" A% a& Z) ?& p' R8 f' _%-------变异
O3 t& l5 }7 z2 p6 \- M" I6 S k=rand(size(newpopulation)); %随机选定要变异的基因位
; _$ [9 W4 a1 `. E- d: I3 ` miu=rand(size(newpopulation)); %采用多项式变异( J O3 s- ]% q) s* o
temp=k<1/poplength & miu<0.5; %要变异的基因位
1 `; D5 C! m8 U0 y6 D( @ 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 c4 D1 }' A/ ^0 V! J- Y. a 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)); %变异情况二/ F/ H! v0 @) t- Q9 q% [
' F" f0 Z+ u, q* A
%-------越界处理/种群合并
* c/ o4 h6 P7 ~5 V4 ?* q newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
6 |1 B" o2 }% N newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理
# M' H) o; D9 o) x- @ newpopulation=[population;newpopulation]; %合并父子种群
* P9 I. {& d+ T
% l! v2 V9 e! ~# T7 d: S%-------计算目标函数值
! e% Y* D2 K$ C' A" F; ]9 P functionvalue=zeros(size(newpopulation,1),2); %合并后种群的各目标函数值,这里的问题是ZDT1
+ s. A' E5 U1 O' [5 e' q functionvalue(:,1)=newpopulation(:,1); %计算第一维目标函数值
6 k) { l4 Z7 I1 O g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);# s4 ], K( d% ~- H& ^* S
functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值5 a' i' i+ F2 @2 l7 S' K. P
6 g* f) p. U! u+ }+ ?( d, W) ~$ g%-------非支配排序 ) H5 J X9 m3 p
fnum=0; %当前分配的前沿面编号
0 f9 Y# B( ^5 ]$ h6 o" @ cz=false(1,size(functionvalue,1)); %记录个体是否已被分配编号+ j$ U0 ^; E4 U9 q& J- g& W5 O6 D
frontvalue=zeros(size(cz)); %每个个体的前沿面编号
j( i' d3 b% m" a3 m [functionvalue_sorted,newsite]=sortrows(functionvalue); %对种群按第一维目标值大小进行排序# [: B o* ] G% G
while ~all(cz) %开始迭代判断每个个体的前沿面,采用改进的deductive sort
0 o: A8 q3 r5 w6 M ] fnum=fnum+1; p: H: ?4 `1 M7 H
d=cz;
( Z, K3 }+ w! X8 Z; _3 J" ~" R6 @ for i=1:size(functionvalue,1)2 l# b/ }! e1 I. g& M& L9 x
if ~d(i)6 r+ v/ ?0 [# n2 Z
for j=i+1:size(functionvalue,1)
9 `, s1 I p3 l; j1 w if ~d(j)$ A5 y, \: O) p( i4 C% g2 u
k=1;
0 Z# [3 E/ B! E$ `$ g7 F1 m$ z for m=2:size(functionvalue,2)
7 K) B- B' t. ?& U& U if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)" O2 ]6 a, d3 w$ ], Q
k=0;
7 _* t: i: A" N0 Z7 M+ J7 [ break5 X3 Y- r. N) h4 e. v7 i
end% ]+ v) U# ^! t7 E
end
* B1 e: N/ f7 b6 |; T: C. m" @ if k6 Z$ N4 s; s" V( K) Q( c
d(j)=true;
' K" t# Z% q5 O; @6 [& E5 O end W; Q+ n! a/ v6 q5 L
end
1 [7 _4 l1 s( h7 v9 \1 Q- j end8 l2 b1 r/ [4 g# T1 L
frontvalue(newsite(i))=fnum;2 B6 B: O- i) O) g, G2 r: U2 h
cz(i)=true;
) e1 g/ o4 y" {. r. K end
. c$ l R" j/ u) |& y6 y1 G end$ |7 O! l5 W% P4 t* o1 n9 Z* b5 _
end" B, [9 Z9 s" i* {: r
4 D# W1 Y- k; J V8 [%-------计算拥挤距离/选出下一代个体 ' S7 ?2 x- D; s2 Y' J* L
fnum=0; %当前前沿面" d$ b# d0 M1 N# i4 n
while numel(frontvalue,frontvalue<=fnum+1)<=popnum %判断前多少个面的个体能完全放入下一代种群
- w# h1 z8 ~, ]( A5 U. [ fnum=fnum+1;
: U; `" x9 Y( A- f' O* B end ' V" @0 I9 ?4 P* n5 W" e) ~
newnum=numel(frontvalue,frontvalue<=fnum); %前fnum个面的个体数
, s7 p: ^ F4 I* [7 p1 A6 F! e& l. ^ population(1:newnum,:)=newpopulation(frontvalue<=fnum,:); %将前fnum个面的个体复制入下一代 8 U. O) }8 R3 i: ~0 L: U6 L
popu=find(frontvalue==fnum+1); %popu记录第fnum+1个面上的个体编号
# R/ _5 Y. s1 J distancevalue=zeros(size(popu)); %popu各个体的拥挤距离5 G; C7 H. b0 }+ C9 _6 y# J
fmax=max(functionvalue(popu,:),[],1); %popu每维上的最大值
/ t- U0 d. s i fmin=min(functionvalue(popu,:),[],1); %popu每维上的最小值# d; i' i- t* h6 e
for i=1:size(functionvalue,2) %分目标计算每个目标上popu各个体的拥挤距离
3 G* D2 y# R. s- K* Q0 n% [/ m [~,newsite]=sortrows(functionvalue(popu,i));
% R' F+ b$ X* E1 {+ t6 B distancevalue(newsite(1))=inf;
0 Y w2 A7 F4 d( \ distancevalue(newsite(end))=inf;; Q: C) R, l7 }' F% u
for j=2:length(popu)-1
0 J! |- O. r+ ^& \ distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i));
4 e# A; _7 _" D- ]5 Q/ s% P end) A) A0 y# a2 t
end
9 [1 I* T: M. M' z6 d! d; R8 M" _ popu=-sortrows(-[distancevalue;popu]')'; %按拥挤距离降序排序第fnum+1个面上的个体
8 e# {6 _5 H8 ^% n" j7 a6 ] population(newnum+1:popnum,:)=newpopulation(popu(2,1:popnum-newnum),:); %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代
?# {1 b+ w9 m( i1 o7 W$ G end
2 O O, U& a, o7 o& F4 S) E( m j& b4 _' I9 j( q
%---程序输出
; k2 h7 w. {- j0 ^ fprintf('已完成,耗时%4s秒\n',num2str(toc)); %程序最终耗时8 h1 u% O. E" I) C
output=sortrows(functionvalue(frontvalue==1,:)); %最终结果:种群中非支配解的函数值9 U5 v: k' t- N
plot(output(:,1),output(:,2),'*b'); %作图
% S* _; K' {4 w' c- W; F axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')) H" |- J% X0 u: D: T* E9 @6 Y4 A# u
end
; H+ w1 a) l% X8 d7 f
& m: |+ _, Z6 \+ q& s4 B% `
" R" |1 z: w* V! c7 d V4 n |
|