差分進化演算法(matlab)

2021-10-01 13:04:09 字數 1562 閱讀 4804

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)=func2(x(:,m));

endtrace(1)=min(ob);

for gen=1:g

lamda=exp(1-g/(g+1-gen));%自適應變異運算元

f=f0*2^(lamda);

%r1 r2 r3 互相不同

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 (r2==m)|(r2==r1)|(r3==r2)

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

endv(:,m)=x(:,r1)+f*(x(:,r2)-x(:,r3));%變異操作

end%交叉操作

r=randi([1,d],1,1);

for n=1:d

cr=rand(1);

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

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

else

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

endend

%邊界處理

for n=1:d

for m=1:np

if(u(n,m)xs)

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

endend

endfor m=1:np%新生臨時種群

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

endfor m=1:np

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

endend

for m=1:np

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

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

if min(ob(m))break

endend[sort,index]=sort(ob);

x=x(:,index);

x=x(:,1);

y=min(ob);

figure

plot(trace);

xlabel('迭代次數');

ylabel('目標函式值');

ttle('目標函式曲線');

差分進化演算法

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

差分進化演算法

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

差分進化演算法

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