差分進化演算法DE

2021-06-23 06:59:29 字數 3419 閱讀 8090



差分進化演算法de與遺傳演算法ga非常類似,下面是差分進化演算法的步驟:

演算法步驟如下:

初始化

d.選擇

測試函式:

rastrigr

函式  

全域性最優點

: matlab**如下:

function de(gm,f0)

t0 = cputime;

%差分進化演算法程式

%f0是變異率 %gm 最大迭代次數

gm = 10000;

f0 = 0.5;

np = 100;

cr = 0.9; %交叉概率

g= 1; %初始化代數

d = 10; %所求問題的維數

gmin = zeros(1,gm); %各代的最優值

best_x = zeros(gm,d); %各代的最優解

value = zeros(1,np);

%產生初始種群

%xmin = -10; xmax = 100;%帶負數的下界

xmin = -5.12;

xmax = 5.12;

function y = f(v)

%rastrigr 函式

y = sum(v.^2 - 10.*cos(2.*pi.*v) + 10);

endx0 = (xmax-xmin)*rand(np,d) + xmin; %產生np個d維向量

xg = x0;

%%%%%%%%%%%%%----這裡未做評價,不判斷終止條件----%%%%%%%%%%%%%%%%%%%%%%%%

xg_next_1= zeros(np,d); %初始化

xg_next_2 = zeros(np,d);

xg_next = zeros(np,d);

while g <= gm

g %%%%%%%%%%%%%%%%%%%%%%%%----變異操作----%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

for i = 1:np

%產生j,k,p三個不同的數

a = 1;

b = np;

dx = randperm(b-a+1) + a- 1;

j = dx(1);

k = dx(2);

p = dx(3);

%要保證與i不同

if j == i

j = dx(4);

else if k == i

k = dx(4);

else if p == i

p = dx(4);

endend

end%變異運算元

suanzi = exp(1-gm/(gm + 1-g));

f = f0*2.^suanzi;

%變異的個體來自三個隨機父代

son = xg(p,:) + f*(xg(j,:) - xg(k,:));

for j = 1: d

if son(1,j) >xmin & son(1,j) < xmax %防止變異超出邊界

xg_next_1(i,j) = son(1,j);

else

xg_next_1(i,j) = (xmax - xmin)*rand(1) + xmin;

endend

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

for i = 1: np

randx = randperm(d);% [1,2,3,...d]的隨機序列

for j = 1: d

if rand > cr & randx(1) ~= j % cr = 0.9

xg_next_2(i,j) = xg(i,j);

else

xg_next_2(i,j) = xg_next_1(i,j);

endend

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

for i = 1:np

if f(xg_next_2(i,:)) < f(xg(i,:))

xg_next(i,:) = xg_next_2(i,:);

else

xg_next(i,:) = xg(i,:);

endend

%找出最小值

for i = 1:np

value(i) = f(xg_next(i,:));

end[value_min,pos_min] = min(value);

%第g代中的目標函式的最小值

gmin(g) = value_min;

%儲存最優的個體

best_x(g,:) = xg_next(pos_min,:);

xg = xg_next;

trace(g,1) = g;

trace(g,2) = value_min;

g = g + 1;

end[value_min,pos_min] = min(gmin);

best_value = value_min

best_vector = best_x(pos_min,:)

fprintf('de所耗的時間為:%f \n',cputime - t0);

%畫出代數跟最優函式值之間的關係圖

plot(trace(:,1),trace(:,2));

end

結果:

差分進化演算法

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

差分進化演算法

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

差分進化演算法

差分進化演算法是一種全域性最優化的演算法,隨機搜尋,通過引數向量集的隨機擾動實現平行計算,本身輸入遺傳類演算法,借用了一種n m的演算法有點,損失函式有d個引數,他用d 1個頂點的多面體定義目前的搜尋空間,每個頂點 由乙個d維引數向量表示,計算損失函式,區域性最優方法,引入退火的概念,從向量集中獲取...