|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 uqHZau 于 2020-6-2 14:09 编辑 0 _' E& j- m4 J1 {: i. {
. y* M/ X& H- i: x F) I, R; Z$ X
为了能随时了解Matlab主要操作及思想。+ z% b0 M9 b& a
/ d# w& }- y8 [- U
故本文贴上NSGA-Ⅱ算法Matlab实现(测试函数为ZDT1)。 ; N$ t8 R0 w# q
2 Z5 b1 m" u5 U! p0 @/ l* T# A
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面: + b; O' P$ P) b/ y# c
①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;
4 o: o) r# s6 h) s& s②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度; 7 U& B5 D1 o8 m" i
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。) i2 z$ m9 O3 }+ [( \& ^5 ^7 E
7 H1 m! O2 a0 }9 r" [1 @* D# K
Matlab实现:2 i* y8 |; g m3 ?
& M1 Y4 F% e- G( \# d
function NSGAII(); @( E' E! @9 g0 k4 z& t
clc;format compact;tic;hold on1 ~0 q9 U5 E, b8 I! B: c
8 s5 V4 A: u* c8 F' ]- E
%---初始化/参数设定
B2 y: u9 G2 x1 M" v8 H: p generations=100; %迭代次数
6 N; Y2 P& `3 [9 m. [* e7 Y& I popnum=100; %种群大小(须为偶数) B! `; y+ @0 L- B
poplength=30; %个体长度
2 i+ E% u$ j$ o* t. h1 M; [ minvalue=repmat(zeros(1,poplength),popnum,1); %个体最小值3 S$ r. X0 p& L# d w
maxvalue=repmat(ones(1,poplength),popnum,1); %个体最大值
: \% ~6 l1 @. _ population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue; %产生新的初始种群
) n9 J' r" c' t6 A4 E: p( G2 C# q! d4 D% O
%---开始迭代进化
: t- V( M4 f# [7 v for gene=1:generations %开始迭代
) L7 A9 A: P9 K, D
0 I% C& K( P/ V; `2 v* Y%-------交叉 * y. p: r* H0 _$ n
newpopulation=zeros(popnum,poplength); %子代种群1 n) G5 R* v f- C$ D
for i=1:popnum/2 %交叉产生子代
& ]- G- O3 k9 P k=randperm(popnum); %从种群中随机选出两个父母,不采用二进制联赛方法+ @, p& V9 x. V L/ u) w. {
beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代6 r: f. h( U0 z
newpopulation(i*2-1,: )=(population(k(1),: )+population(k(2),: ))/2+beta.*(population(k(1),: )-population(k(2),: ))./2; %产生第一个子代 8 W- x/ I. y* A& [
newpopulation(i*2,: )=(population(k(1),: )+population(k(2),: ))/2-beta.*(population(k(1),: )-population(k(2),: ))./2; %产生第二个子代
( c ]+ R4 s& X end, z1 i" S/ n5 t- X
$ l' j+ o/ c, p# O0 K# ^%-------变异 + t/ \: Y2 X: y2 @, O+ v
k=rand(size(newpopulation)); %随机选定要变异的基因位, p) q6 t& ]" d: B
miu=rand(size(newpopulation)); %采用多项式变异
; W8 e, j9 C5 D temp=k<1/poplength & miu<0.5; %要变异的基因位
+ r4 c8 Z- |+ ^2 Y' {2 l 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); %变异情况一! E1 b# M1 g3 s' E. d2 V
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)); %变异情况二9 n/ Z. q$ \2 T2 I; v
3 V' m! H4 y& _& x' J# ^%-------越界处理/种群合并
' Q: O, K V! [3 @0 x | newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
4 n6 y, n6 C9 M! x o newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理
" l, Z1 d8 Y- ~. T# o0 r& S! t5 e newpopulation=[population;newpopulation]; %合并父子种群* a0 E' @5 y+ P- H! X
7 X$ Q9 F' r( {6 L) U: w
%-------计算目标函数值
+ |% B. P7 D: V _ functionvalue=zeros(size(newpopulation,1),2); %合并后种群的各目标函数值,这里的问题是ZDT1$ W- x1 i- J q; n! _6 R$ }; K
functionvalue(:,1)=newpopulation(:,1); %计算第一维目标函数值7 a" ]- d( N% L2 b i$ m
g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);
1 Q1 z( P3 m" c J- I. K/ u functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值1 t; G# v/ n- q2 S9 D5 N
' a3 u T; Q7 l- _
%-------非支配排序 2 q6 c& D# c2 T/ H% v
fnum=0; %当前分配的前沿面编号! C3 @! U+ G% h! d
cz=false(1,size(functionvalue,1)); %记录个体是否已被分配编号
4 {% y7 F3 d8 a) S$ l frontvalue=zeros(size(cz)); %每个个体的前沿面编号
3 t( p( a, ~" v; X7 s [functionvalue_sorted,newsite]=sortrows(functionvalue); %对种群按第一维目标值大小进行排序3 D5 d. J$ t5 [ w% r
while ~all(cz) %开始迭代判断每个个体的前沿面,采用改进的deductive sort
9 ]5 {3 v/ {8 a& _8 r fnum=fnum+1;
3 K. B3 G z) i: n! q: Q d=cz;, O2 h# |& z* F5 l7 {. _4 `
for i=1:size(functionvalue,1)
* C( G( a( m* F( Z if ~d(i)) t# G+ l4 y. L( I' U
for j=i+1:size(functionvalue,1)# d$ P: U( w3 J, ?0 W' z) j
if ~d(j)
$ ]9 |7 \9 F1 Y4 P* D k=1;
3 F$ o+ w% K2 D8 r1 ^# E for m=2:size(functionvalue,2)* b- s. o8 E( m( g1 C
if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)
& t0 [( g, l2 Z k=0;
5 f9 T4 w2 }% |/ f+ z break
$ Z* x, w; b& I" m end
+ `: V1 _' L$ L3 J0 j% i5 Y end, g: B* r1 {% u# {& U" k4 O' G
if k" B1 M- p$ [3 R/ H: {: K4 | \
d(j)=true;- c [8 M: n, R F
end3 O; m( d1 ~' s' A' A2 ]
end. f f8 }: J" P$ G# a' B/ I
end. B) h2 f) n! G P# o
frontvalue(newsite(i))=fnum;
0 _! ?2 o; [2 t! A1 `( a cz(i)=true;# k/ {8 G- j2 d+ U7 C" y+ S
end8 p+ {9 w( D+ N
end
' M9 ^ B) K3 w* U9 j8 e- t end' F0 V/ V: g4 R* Z
j& d; ?& `. {) M& A1 g+ n%-------计算拥挤距离/选出下一代个体
! h: N# H) Q2 V k fnum=0; %当前前沿面/ c- X- m: \3 s8 _# Q; a; _) `$ [
while numel(frontvalue,frontvalue<=fnum+1)<=popnum %判断前多少个面的个体能完全放入下一代种群# A1 X% E$ ?% f" ^
fnum=fnum+1;8 B0 Z; E4 e( |, @) M
end
) d% {' M0 {4 N( I; b/ k newnum=numel(frontvalue,frontvalue<=fnum); %前fnum个面的个体数
2 m. d. _ m3 M' ]3 ]! v population(1:newnum,: )=newpopulation(frontvalue<=fnum,: ); %将前fnum个面的个体复制入下一代
- Q; u1 i, u d popu=find(frontvalue==fnum+1); %popu记录第fnum+1个面上的个体编号
! S% \$ [6 F* J. B3 L distancevalue=zeros(size(popu)); %popu各个体的拥挤距离
9 o. l3 ]' R+ _! s$ C, r fmax=max(functionvalue(popu,: ),[],1); %popu每维上的最大值
4 x9 ~7 W6 \+ i% K: Z fmin=min(functionvalue(popu,: ),[],1); %popu每维上的最小值- ]) K+ x/ q, }4 G/ N7 T
for i=1:size(functionvalue,2) %分目标计算每个目标上popu各个体的拥挤距离8 E# e! D" v9 p L5 {
[~,newsite]=sortrows(functionvalue(popu,i));9 H, H( j9 }5 g j; U- U3 p& w
distancevalue(newsite(1))=inf;# V5 P* \2 Q- w0 {7 [( I
distancevalue(newsite(end))=inf;
W, l. q' _8 y* r& G* o$ w5 d for j=2:length(popu)-1/ {: h( E# Y+ A9 V# \5 [
distancevalue(newsite(j))=distancevalue(newsite(j))+(functionvalue(popu(newsite(j+1)),i)-functionvalue(popu(newsite(j-1)),i))/(fmax(i)-fmin(i)); z1 R4 Q& G* f* q. R
end
. t6 L; z _" I! o) a end
% }+ T+ ]% ]1 s& [8 I popu=-sortrows(-[distancevalue;popu]')'; %按拥挤距离降序排序第fnum+1个面上的个体
) o n" v' _' f$ d% g+ } population(newnum+1: popnum,: )=newpopulation(popu(2,1: popnum-newnum),: ); %将第fnum+1个面上拥挤距离较大的前popnum-newnum个个体复制入下一代
2 P7 f5 V6 {* V3 E; n" o end
0 v) M+ ?, Z# U4 l. i; X5 w" ~( Y8 I$ y) R2 s+ i
%---程序输出
! [) h, z# H- Y& b% v fprintf('已完成,耗时%4s秒\n',num2str(toc)); %程序最终耗时
- i+ d8 ^% C, Z3 f: J0 ?) d- p output=sortrows(functionvalue(frontvalue==1,: )); %最终结果:种群中非支配解的函数值
8 g2 x0 T/ d) _$ j8 y$ j plot(output(:,1),output(:,2),'*b'); %作图0 J7 R+ W) i; t& E% y
axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1'). m& p: b, @' l4 k
end8 }8 N: D( u+ y( h
7 K3 X7 o' n( [6 x% O0 y
( P: M1 M6 Q; l3 b: N
" B! _+ H: J9 H( V2 @ |
|