1 内容介紹
單目标優化,多目标優化和限制優化問題在數學和工程領域普遍存在,且變得越來越複雜.進化計算是求解此類問題的有效方法,近年來,差分進化(Differential Evolution,DE)算法在進化計算領域受到越來越多的關注.差分進化算法是一種基于種群優化的随機優化技術,擁有結構簡單,易于實作,魯棒性強等優點.DE算法已被廣泛應用于許多領域.
2 部分代碼
%根據文章《Differential Evolution Algorithm With Strategy Adaptation for Global Numerical Optimization》的算法:ALGORITHMIC DESCRIPTION OF DE
%測試函數求值用函數testFun(x,FunIndex)
%變異向量用函數mutation(X,bestX,F,mutationStrategy)
%交叉向量用函數crossover(X,V,CR,crossStrategy)
%mutation
%mutatinotallow=1:DE/rand/1,
%mutatinotallow=2:DE/best/1,
%mutatinotallow=3:DE/rand-to-best/1,
%mutatinotallow=4:DE/best/2,
%mutatinotallow=5:DE/rand/2.
%crossover
%crossStrategy=1:binomial crossover
%crossStrategy=2:Exponential crossover
clear
close all
maxIteratinotallow=1000;%最大疊代次數
Generatinotallow=0;%進化代數,或者目前疊代代數
Xmax=30;%搜尋上界,可以根據需要改為向量形式
Xmin=-30;%搜尋下界
Dim=30;%個體維數
NP=50;%population size,種群規模
F=0.5;%scaling factor 縮放因子
CR=0.3;%crossover rate 交叉機率
FunIndex=3;%測試方程索引,不同值對應不同的測試函數
mutatinotallow=1;%變異政策
crossStrategy=1;%交叉政策
%%
%step1 初始化
%X represent population
%Generatinotallow=0;
X=(Xmax-Xmin)*rand(NP,Dim)+Xmin;%X行代表個體i,列代表個體i的次元j
%%
%step2 mutation,crossover,selection
while Generation<maxIteration
%求bestX
for i=1:NP
fitnessX(i)=testFun(X(i,:),FunIndex);%fitnessX表示X的适應值
end
[fitnessbestX,indexbestX]=min(fitnessX);
bestX=X(indexbestX,:);%bestX表示最優值對應的位置
%%
%step2.1 mutation
%mutatinotallow=1:DE/rand/1,
%mutatinotallow=2:DE/best/1,
%mutatinotallow=3:DE/rand-to-best/1,
%mutatinotallow=4:DE/best/2,
%mutatinotallow=5:DE/rand/2,
%産生為每一個個體Xi,G 産生一個變異向量Vi,G。G代表進化代數
V=mutation(X,bestX,F,mutationStrategy);
%%
%step2.2 crossover
%crossStrategy=1:binomial crossover
%crossStrategy=2:Exponential crossover
%産生為每一個個體Xi,G 産生一個交叉向量Ui,G。G代表進化代數
U=crossover(X,V,CR,crossStrategy);
%%
%step2.3 selection
for i=1:NP
fitnessU(i)=testFun(U(i,:),FunIndex);
if fitnessU(i)<=fitnessX(i)
X(i,:)=U(i,:);
fitnessX(i)=fitnessU(i);
if fitnessU(i)<fitnessbestX
bestX=U(i,:);
fitnessbestX=fitnessU(i);
end
end
end
%%
Generatinotallow=Generation+1;
bestfitnessG(Generation)=fitnessbestX;
end
%%
%畫圖
plot(bestfitnessG);
optValue=num2str(fitnessbestX);
Locatinotallow=num2str(bestX);
disp(strcat('the optimal value','=',optValue));
disp(strcat('the best location','=',Location));