這兩天在看M.Tim Jones的《人工智能》,書中不僅介紹原理,並且都有相應的c代碼實現。html
雖然代碼不徹底,不過缺乏的部分徹底能夠本身補完。算法
差別演化和昨天實現的PSO很相似,都屬於優化算法。函數
算法步驟:優化
1.設定種羣個體個數和須要迭代的次數。固然也能夠設定條件,而後判斷是否中止迭代。人工智能
2.定義交叉機率CR,個體有必定機率進行變異,若是變異則進行第3步,若是不變異則下一代個體和當前個體同樣。spa
3.在種羣中隨機選出三個互不相同的個體進行變異,變異公式以下(有博士論文總結了一大堆變異公式):code
Xi,g+1=Xr1,g+F(Xr2,g-Xr3,g)htm
其中X是種羣中個體特徵向量,這裏就是x和y座標。g是種羣的代數。i表明當前個體,r1,r2,r3是和i不一樣,而且也互不相同的個體。blog
4.計算變異後個體的適應度,若是變異後適應度不如變異前,那麼將變異後個體從新恢復爲變異前個體。get
5.比較變異後個體適應度和種羣最優個體適應度,將適應度高的個體賦給種羣最優個體。
最後固然仍是須要目標函數才能計算適應度。
算法結果以下圖,小綠點表明種羣最優個體適應度:
matlab代碼以下:
main.m
clear all;close all;clc; [x y]=meshgrid(-100:100,-100:100); sigma=50; img = (1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2)); %目標函數,高斯函數 mesh(img); hold on; n=20; %種羣個體的數量 %初始化種羣,定義結構體 par=struct([]); for i=1:n par(i).x=-100+200*rand(); %個體的x特徵在[-100 100]隨機初始化 par(i).y=-100+200*rand(); %個體的y特徵在[-100 100]隨機初始化 par(i).fit=0; %個體適應度爲0初始化 end par_best=par(1); %初始化種羣中最佳個體 for k=1:100 %迭代次數 plot3(par_best.x+100,par_best.y+100,par_best.fit,'g*'); %畫出最佳個體的位置,+100爲相對偏移 [par par_best]=select_and_recombine(par,par_best,n); %差別演化函數 end
select_and_recombine.m
function [next_par par_best]=select_and_recombine(par,par_best,n) F=0.5; %加速因子 CR=0.8; %變異率 next_par=par; %新種羣 for i=1:n while 1 %在原種羣中任選三個互不相同的個體進行交叉變異 r1=floor(1+20*rand()); r2=floor(1+20*rand()); r3=floor(1+20*rand()); if i~=r1 && i~=r2 && i~=r3 &&... r1~=r2 && r1~=r3 && r2~=r3 break; end end if rand()<CR %變異率,能夠對每個特徵分別設置,我這裏要變一塊兒變了 next_par(i).x=par(r1).x+F*(par(r2).x-par(r3).x); %交叉變異準則 next_par(i).y=par(r1).y+F*(par(r2).y-par(r3).y); end %計算變異後個體的適應度 next_par(i).fit=compute_fit(next_par(i)); %若是新個體沒有變異前個體適應度高,新個體還原爲舊個體 if par(i).fit>next_par(i).fit next_par(i)=par(i); end %若是變異後適應度高於種羣最高適應個體,則更新種羣適應度最高個體 if next_par(i).fit>par_best.fit par_best=next_par(i); end end end
compute_fit.m
function re=compute_fit(par) x=par.x; y=par.y; sigma=50; if x<-100 || x>100 || y<-100 || y>100 re=0; %超出範圍適應度爲0 else %不然適應度按目標函數求解 re=(1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2)); end end