差分進化演算法介紹及matlab實現

2022-07-11 19:48:08 字數 3231 閱讀 1820

差分進化演算法是基於群體智慧型理論的優化演算法,是通過群體內個體間的合作與競爭而產生的智慧型優化搜尋演算法,它保留了基於種群的全域性搜尋策略,採用實數編碼、基於差分的簡單變異操作和「一對一」的競爭生存策略,降低了進化計算操作的複雜性。

差分進化演算法是一種自組織最小化方法,利用種群中兩個隨機選擇的不同向量來干擾現有向量,種群中的每乙個向量都要進行干擾。

它通過把種群中的兩個成員之間的加權差向量加到第三個成員上來產生新的引數向量,該操作成為「變異」。

將變異向量的引數與另外預先確定的目標向量引數按一定規則混合來產生實驗向量,該操作成為「交叉」;

若實驗向量的代價函式比目標向量的代價函式低,實驗向量就在下一代中替代目標向量,該操作成為「選擇」;

具體步驟如下:

確定差分進化演算法的控制引數和所要採用的具體策略。控制引數包括:種群數量、變異運算元、交叉運算元、最大進化代數、終止條件等。

隨機產生初始種群,進化代數k=1;

對初始種群進行評價,即計算初始種群中每個個體的目標函式值。

判斷是否達到終止條件或達到最大進化代數;若是,則進化終止,將此時的最佳個體作為解輸出;否則,繼續下一步操作。

進行變異操作和交叉操作,對邊界條件進行處理,得到臨時種群。

對臨時種群進行評價,計算臨時種群中每個個體的目標函式值。

對臨時種群中的個體和原種群中對應的個體,進行「一對一」的選擇操作,得到新種群。

進化代數k=k+1,轉步驟(4).

$$計算函式的最小值,其中個體x的維數n=10.這是乙個簡單的平方和函式,只有乙個極小點x=(0,0,...,0)。$$

%%%%%%%差分進化求函式極值%%%%%%%%%

%%%%%%%初始化%%%%%%%%

clear all;

close all;

clc;

np = 50; %種群的數量

d = 10; %變數的維度

g = 200; %最大進化代數

f0 = 0.4; %初始變異運算元

cr = 0.1; %交叉運算元

xs = 20; %上限

xx = -20; %下限

yz = 10^-6; %閾值

%%%%%%%%賦初值%%%%%%%%%%%%

x = zeros(d,np); %初始種群

v = zeros(d,np); %變異種群

u = zeros(d,np); %選擇種群

x = rand(d,np) * (xs-xx) + xx; %賦初值

%%%%%%%%%%計算目標函式%%%%%%%%%%%

for m = 1:np

ob(m) = func1(x(:,m));

endtrace(1) = min(ob);

%%%%%%%%%差分進化迴圈%%%%%%%%%%

for gen = 1:g

%%%%%%%%%%%變異操作%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%自適應變異運算元%%%%%%%

lamda = exp(1-g/(g+1-gen));

f = f0*2^(lamda);

%%%%%%%%r1,r2,r3和m互不相同%%%%

for m = 1:np

r1 = randi([1,np],1,1);

while(r1 == m)

r1 = randi([1,np],1,1);

endr2 = randi([1,np],1,1);

while (r2 == m) | (r2 == r1)

r2 = randi([1,np],1,1);

endr3 = randi([1,np],1,1);

while (r3 == m) | (r3 == r1 | r3 == r2)

r3 = randi([1,np],1,1);

endv(:,m) = x(:,r1) + f * (x(:,r2) - x(:,r3));

end%%%%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%%%

r = randi([1,np],1,1); %確保必有乙個v(:)進入u(:)中

for n = 1:d

cr = rand(1);

if (cr <= cr) | (n == r)

u(n,:) = v(n,:); %批量操作,替換所有個體第n維

else

u(n,:) = x(n,:);

endend

%%%%%%%%%%%%%%%%邊界條件的處理%%%%%%%%%%%%%%%

for n = 1:d

for m = 1:np

if (u(n,m) < xx) | (u(n,m) > xs)

u(n,m) = rand * (xs - xx) + xx;

endend

end%%%%%%%%%%%%%%%%選擇操作%%%%%%%%%%%%%%%%%%%%

for m = 1:np

ob1(m) = func1(u(:,m));

endfor m = 1:np

if ob1(m) < ob(m)

x(:,m) = u(:,m);

endend

for m = 1:np

ob(m) = func1(x(:,m));

endtrace(gen+1) = min(ob);

if min(ob) < yz

break;

endend%%%%%%%%%%%%%%%%畫圖%%%%%%%%%%%%%%%

figure

plot(trace);

xlabel('迭代次數');

ylabel('目標函式值');

title('de目標函式曲線');

%%%%%%%%%%%%%%適應度函式%%%%%%%%%%

function result = func1(x)

summ = sum(x.^2);

result = summ;

end

差分進化演算法(matlab)

clear all close all clc np 50 d 10 g 200 f0 0.4 初試變異運算元 cr 0.1 交叉運算元 xs 20 xx 20 yz 10 6 閾值 初始化 x zeros d,np 初始種群 v zeros d,np 變異種群 u zeros d,np 選擇種群 ...

差分進化演算法

差分進化演算法在 1997 年日本召開的第一屆國際進化優化計算競賽 iceo 表現突出,已成為進化演算法 ea 的乙個重要分支,很多學者開始研究 de 演算法,並取得了大量成果 2006年 cec 國際會議將其作為專題討論,由此可見 de 演算法已成為學者的研究熱點,具有很大的發展空間.每個個體的優...

差分進化演算法

最近在學習演化演算法 evolutionary algorithm 粒子群演算法和遺傳演算法已經很熟悉了,而差分進化演算法我還沒認真研究過,趁著暑期實訓的機會打算把差分進化演算法做個總結,最後再將這三種演算法做個比較。差分進化演算法是演化演算法的一種,它的思想和遺傳演算法比較像,演算法分為以下幾個流...