小白在bilibili中有matlab代碼講解,感興趣的讀者見網址:https://www.bilibili.com/video/BV1Ez411b7SJ
一、前言
之前提到過PSO算法,它作爲進化算法的入門算法,具有參數少,實現簡單,收斂性強的特點。但是,“早熟”這一特點在PSO算法中最爲致命,它使得算法極容易陷入局部最優,算法性能也會因此而急劇下降。因此,差分進化算法(DE)應運而生,同樣的,DE也是一種基礎算法,但是它的多樣性更強,不容易出現早熟現象,在一般優化中更加實用。
二、算法流程
1.初始化種羣,評價出適應度值,並找出全局最優位置與最優適應度值。
2.進入優化,generation+1。
3.變異。爲了保證多樣性,變異中需要選擇的隨機粒子不應與當前更新粒子相同。變異策略通常有以下5種:
變異向量V,F爲縮放因子,通常設置爲0.5。
(1)DE/rand/1
上式中有三個隨機位置,r1,r2,r3是不等於i的不相同的隨機數,種羣多樣性提高,相應的,其收斂性會降低。
(2)DE/best/1
Xbest是種羣最優位置,在上式中有着指導作用,能夠提升粒子的收斂性。
(3)DE/rand-to-best/1
個人認爲,上式在多樣性和收斂性之間的制衡效果較好。兩個隨機位置用於開發,最優位置用來指導。它能適用於一般優化問題,但是對於大規模優化這種需要強收斂效果的問題可能不太適用。
(4)DE/best/2
(5)DE/rand/2
上式包含5個不同的隨機粒子,種羣的開發能力較強,提高了種羣多樣性。
4.交叉。U爲交叉向量,CR是交叉概率。CR的值越大,發生交叉的概率越大,通常CR=0.3。
(1)二項式交叉
%NP:種羣個數;Dim:維度;V:變異向量;U:交叉向量;
for i=1:NP
jRand=randi([1,Dim]); %jRand∈[1,Dim]
for j=1:Dim
k=rand;
if k<=CR||j==jRand
%j==jRand是爲了確保至少有一個U(i,j)=V(i,j)
U(i,j)=V(i,j);
else
U(i,j)=X(i,j);
end
end
end
(2)指數交叉
for i=1:NP
j=randi([1,Dim]);%j∈[1,Dim]
L=0;
U(i,:)=X(i,:);
k=rand;
while(k<CR && L<Dim)
U(i,j)=V(i,j);
j=j+1;
if(j>Dim)
j=1;
end
L=L+1;
end
end
5.評價進化的新粒子U,適應度值爲fitnessU,根據U的適應度值的高低載進行以下篩選。
if fitnessU(i)<fitnessX(i)
X(i,:)=U(i,:);
fitnessX(i)=fitnessU(i);
end
6.更新最佳位置及適應度值,進入下一代循環stesp2。
三、總結
DE算法的實現比較簡單,算法的靈活性較強,不同方法的變異交叉會有不同的實驗效果。對於DE算法的改進也非常多,很多改進方法使得其性能突飛猛進,個人認爲是一個比較普遍且適應性強的一個基礎算法。