DE算法
DE(Differential Evolution)
差分進(jìn)化算法是一種新興的進(jìn)化計(jì)算技術(shù)。它是由Storn等人于1995年提出的,和其它演化算法一樣,DE是一種模擬生物進(jìn)化的隨機(jī)模型,通過(guò)反復(fù)迭代,使得那些適應(yīng)環(huán)境的個(gè)體被保存了下來(lái)。但相比于進(jìn)化算法,DE保留了基于種群的全局搜索策略,采用實(shí)數(shù)編碼、基于差分的簡(jiǎn)單變異操作和一對(duì)一的競(jìng)爭(zhēng)生存策略,降低了遺傳操作的復(fù)雜性。
關(guān)鍵理念:初為GA的變種,后自稱一派
和GA,EP,ES不同,DE不是生物學(xué)啟發(fā)的。
個(gè)體表示:
一般用實(shí)數(shù)編碼,(x1,x2,…,xn)就是它的個(gè)體表達(dá)形式。
接下來(lái)介紹DE算法的各個(gè)部分:
父代個(gè)體選擇:
基向量選擇:一般有三種選擇方式,1.隨機(jī)從種群中選擇一個(gè)個(gè)體。2.選擇當(dāng)前種群最好的個(gè)體。3.選擇當(dāng)前個(gè)體(DE的處理一般是對(duì)種群分個(gè)處理)。 產(chǎn)生差向量:一般可以產(chǎn)生1個(gè)或2個(gè)差向量,從種群中隨機(jī)選取兩個(gè)或多個(gè)個(gè)體相減產(chǎn)生。
重組:
產(chǎn)生實(shí)驗(yàn)向量:選擇當(dāng)前要更新的個(gè)體與變異向量交叉重組。隨機(jī)產(chǎn)生一個(gè)概率值當(dāng)它小于重組閾值時(shí)將變異向量賦給試驗(yàn)向量否則將當(dāng)前個(gè)體賦給試驗(yàn)向量 產(chǎn)生變異向量:可以是當(dāng)前基向量,或者是當(dāng)前個(gè)體。需要保持試驗(yàn)向量至少有一維是來(lái)自變異向量的。
變異:
變異這部分有專門的公式:
當(dāng)然理論上來(lái)說(shuō)步長(zhǎng)因子需要保持兩性,如果設(shè)為整個(gè)種群同一個(gè)值在實(shí)驗(yàn)中似乎影響也不大。
存活選擇:
當(dāng)前子代如果好于父代,則存活。
有了這些東西我們就可以編出相應(yīng)的代碼:
function [answer,best]=DE(fun)
global popnum ubound lbound dim F cost times
best=inf;
answer=zeros(times,cost/popnum);
for i=1:timesX=initpop();thebest=inf;for j=1:cost/popnumfor k=1:popnum[BV,DV]=PS(X);TV=variant(X(k,:),BV,DV);X(k,:)=selecsur(X(k,:),TV);endanswer(i,j)=thebest;if thebest<bestbest=thebest;endend
endfunction X=initpop()
X=unifrnd(lbound,ubound,popnum,dim);
endfunction [BV,DV]=PS(X) %父代選擇
BV=X(unidrnd(popnum),:); %隨機(jī)選取一個(gè)個(gè)體作為基向量
DV=diff(X(randperm(popnum,3),:)); %隨機(jī)生成兩個(gè)差向量
end function TV=variant(X,BV,DV) %變異
MV=BV+F*mean(DV);
TV=zeros(1,dim);
flag=0;
for i1=1:dimif rand()<0.8TV(i1)=MV(i1);flag=1;elseTV(i1)=X(i1);endif flag==0n=unidrnd(dim);TV(n)=MV(n);end
end
endfunction f=fit(X) %適應(yīng)值函數(shù)f=fun(X);
end function luck=selecsur(X,newX) %生存選擇
new=fit(newX);
old=fit(X);
if new<oldgood=new;luck=newX;
elsegood=old;luck=X;
end
if good<thebestthebest=good;
end
end
end
測(cè)試branin函數(shù):
global popnum ubound lbound vs dim cost times F
popnum=50; %種群數(shù)量
ubound=15; %個(gè)體維度大小上限
lbound=-5; %個(gè)體維度大小下限
F=0.7 %統(tǒng)一的步長(zhǎng)
vs=0.3; %變異強(qiáng)度臨界值
dim=2; %個(gè)體維度大小
cost=20000; %計(jì)算代價(jià)
times=30; %重復(fù)計(jì)算次數(shù)
fun=@(x)(x(2)-(5.1/(4*pi^2))*x(1)^2+5*x(1)/pi-6)^2+10*(1-1/(8*pi))*cos(x(1))+10;
[answer,best]=DE(fun) %best為DE找到的最優(yōu)值,answer為每次計(jì)算得到的最好結(jié)果變化矩陣
plt(answer);
function plt(answer) %繪制L曲線圖
hisbest=reshape(answer',1,size(answer,1)*size(answer,2));
hisbest(1)=max(hisbest);
for k=2:length(hisbest)if hisbest(k)>hisbest(k-1)hisbest(k)=hisbest(k-1);end
end
for t=2:length(hisbest)hisbest(t)=(hisbest(t)+hisbest(t-1)*(t-1))/t;
end
plot(log(hisbest));
hold on
end
結(jié)果如下:
總結(jié)