ES算法
ES(Evolutionary Strategy)
在20世紀60年代初,柏林工業(yè)大學(xué)的I. Rechenberg和H.-P. Schwefel等在進行風(fēng)洞實驗時,由于在設(shè)計中描述物體形狀的參數(shù)難以用傳統(tǒng)的方法進行優(yōu)化,從而他們利用生物變異的思想來隨機地改變參數(shù)值并獲得了較好的結(jié)果。隨后,他們便對這種方法進行了深入的研究和發(fā)展,形成了演化計算的另一個分支—演化策略。
關(guān)鍵理念:“演化的演化”
以個體的變異算子為主,重組算子為輔
認為變異強度是演化的關(guān)鍵,稱為演化策略參數(shù)
將演化策略參數(shù)納入演化本身,不斷優(yōu)化參數(shù)
個體表示:
(x1,x2,…,xn,σ1,σ2,…,σn),前面的x為一個個體n維,而后面的σ為此個體的各個維度變異強度。一個個體的強度可以相同
接下來介紹ES算法的主要部分——變異和生存選擇:
ES算法的變異對于使用這個算法的人來說也是非常友好的,因為它也和EP一樣直接給出了公式:
當μ個父代個體的都產(chǎn)生了子代,那么就會存在μ+μ個個體,如何從這μ+μ個個體中選出下一代呢?這個就是生存選擇索要解決的事情,我們可以采用(μ+μ)隨機q競爭選擇,也可以簡單排序擇優(yōu)選擇。
當然ES相較于EP還多了一個重組,這里的重組對于變量部分是全局重組,要想重組出一個子代,那就要隨機選取2倍維度數(shù)量的父代然后從每兩個父代中誕生子代的每一維,至于怎么誕生,可以從兩個父代的第隨機個維隨機選擇一個。 策略部分的重組則是采用這兩個父代的第隨機個維的均值。當然重組這個模塊對于演化策略似乎并不是太重要。
有了這些東西我們就可以編出相應(yīng)的代碼:
function [answer,best]=ESpro(fun)
global popnum ubound lbound vs dim cost times
best=inf;
answer=zeros(times,cost/popnum);
for i=1:times[X,D]=initpop();for j=1:(cost/popnum) [newX,newD]=rcb(X,D);[newX,newD]=variant(newX,newD);[luck,fa]=selecsur(X,newX);x=[X;newX];X=x(luck,:);d=[D;newD];D=d(luck);last=keepbest(fa);answer(i,j)=last;if last<bestbest=last;endend
endfunction [X,D]=initpop()
X=unifrnd(lbound,ubound,popnum,dim);
D=unifrnd(0,ubound,popnum,1);
endfunction [newX,newD]=rcb(X,D)
newX=zeros(popnum,dim);
for i1=1:popnumfor j1=1:dimselect=randperm(popnum,2); %隨機選出兩個父代個體的下標choose=X(select,:); %提取被選中的父代個體newX(i1,j1)=choose(unidrnd(2),j1); %重被選中的父代個體中隨機選擇一個end
end
newD=zeros(popnum,1);
for i2=1:popnumselect=randperm(length(D),2);choose=D(select);newD(i2)=mean(choose);
end
endfunction [newX,newD]=variant(X,D)
newX=zeros(popnum,dim);
newD=zeros(popnum,1);
rho0=randn();
rho=randn(popnum,1);
for i3=1:popnum newD(i3)=D(i3)*exp(sqrt(2*popnum)*rho0+sqrt(2*sqrt(popnum))*rho(i3));if newD(i3)<vsnewD(i3)=vs;endfor j3=1:dimnewX(i3,j3)=X(i3,j3)+newD(i3)*randn();end
end
endfunction f=fit(X)
f=zeros(length(X),1);
for i4=1:length(X)f(i4)=fun(X(i4,:));
end
endfunction [luck,fa]=selecsur(X,newX)
X=[X;newX];
f=fit(X);
[~,b]=sort(f);
luck=b(1:length(b)/2);
fa=f(luck);
end
end
function best=keepbest(X)
best=min(X);
end
測試branin函數(shù):
global popnum ubound lbound vs dim cost times
popnum=50; %種群數(shù)量
ubound=15; %個體維度大小上限
lbound=-5; %個體維度大小下限
vs=0.3; %變異強度臨界值
dim=2; %個體維度大小
cost=20000; %計算代價
times=30; %重復(fù)計算次數(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]=ESpro(fun) %best為ES找到的最優(yōu)值,answer為每次計算得到的最好結(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é)
- 上一篇: DE算法
- 下一篇: 深入理解BP神经网络的细节