差異進化算法
同遺傳算法一樣,差異進化算法包含變異和交叉操作,但同時相較於遺傳算法的選擇操作,差異進化算法採用一對一的淘汰機制來更新種群。由於差異進化算法在連續域最佳化問題的優勢已獲得廣泛套用,並引發進化算法研究領域的熱潮。差異進化算法由Storn以及Price 提出,算法的原理採用對個體進行方向擾動,以達到對個體的函式值進行下降的目的,同其他進化算法一樣,差異進化算法不利用函式的梯度信息,因此對函式的可導性甚至連續性沒有要求,適用性很強。同時,算法與粒子群最佳化有相通之處,但因為差異進化算法在一定程度上考慮了多變數間的相關性,因此相較於粒子群最佳化在變數耦合問題上有很大的優勢。算法的實現參考實現代碼部分。實現代碼(MATLAB)
ticF=0.9;
CR=.1;
n=2;%問題維數,以簡單的球函式為目標函式
NP=30;
lu=[-10,-10;10,10];%求解空間的上下界
LB=repmat(lu(1,:),NP,1);
UB=repmat(lu(2,:),NP,1);
%用於生成隨機選擇個體的表
tab=1:NP;tab=tab(ones(1,NP),:)';
dig=1:NP;D=(dig-1)*NP+(1:NP);
tab(D)=[];
tab=reshape(tab,NP-1,[])';
TAB=tab;
%測試次數
TIMES=10;
Solve=zeros(1,TIMES);
numOfevol=zeros(1,TIMES);
fortime=1:TIMES
%
Result=[];%記錄結果
rand('seed',sum(100*clock));
%
X=LB+rand(NP,n).*(UB-LB);
U=X;
%%
fit=fitness(X);%首次評價
FES=NP;
whileFES<n*10000
%產生隨機個體參與變異
tab=TAB;
rand1=floor(rand(NP,1)*(NP-1))+1;
rand2=floor(rand(NP,1)*(NP-2))+2;
rand3=floor(rand(NP,1)*(NP-3))+3;
RND1=(rand1-1)*NP+(1:NP)';
RND2=(rand2-1)*NP+(1:NP)';
RND3=(rand3-1)*NP+(1:NP)';
r1=tab(RND1);tab(RND1)=tab(:,1);
r2=tab(RND2);tab(RND2)=tab(:,2);
r3=tab(RND3);
%rand/one/變異模式
V=X(r1,:)+F.*(X(r2,:)-X(r3,:));
%越界檢驗
BL=V<LB;V(BL)=2*LB(BL)-V(BL);
BLU=V(BL)>UB(BL);BL(BL)=BLU;V(BL)=UB(BL);
BU=V>UB;V(BU)=2*UB(BU)-V(BU);
BUL=V(BU)<LB(BU);BU(BU)=BUL;V(BU)=LB(BU);
%交叉操作
J_=mod(floor(rand(NP,1)*n),n)+1;
J=(J_-1)*NP+(1:NP)';
C=rand(NP,n)<CR;
U(J)=V(J);
U(C)=V(C);
%評價子代
fit_=fitness(U);
%比較並競爭
S=fit_<fit;
X(S,:)=U(S,:);
fit(S)=fit_(S);
%記錄函式評價次數
FES=FES+NP;
%記錄結果(用於繪圖,並不是算法必要環節)
Result=[Result,min(fit)];
end
Solve(time)=min(fit);
%試驗次數
plot(log10(Result),'b');holdon;
end
disp(['求解結果:',num2str(Solve)]);
toc
%附上球函式代碼(新建一個M檔案即可)
functionY=fitness(X)
Y=sum(X.^2,2);