- 代码是自己写的,如果对代码中有疑问或者不正确的地方,请评论留言,谢谢。
- 差分进化算法的matlab源码,这里只对单目标连续问题做研究,离散问题目前没有涉及,下面是标准差分进化算法的matlab源码,里面的函数是单目标的sphere函数。这份代码只是更好的理解差分进化算法(DE)的原理和迭代的过程。
问题:单目标sphere函数
运行效果:
源码里关于参数的设置是看过一些sci改进的DE论文中提到的对参数合理的设置。
matlab源码(单目标sphere函数):
%标准差分进化算法matlab源码
clear; %删除工作区中的所有变量
close all; %关闭所有图形窗口
clc; %清除命令窗口的内容
%控制变量的设置,这里要求的是单目标的sphere函数
Np=160; %Np在(5D,10D)之间
F=0.1; %F的设定在0.0和1.0附近
Cr=0.5; %Cr的设定在(0.4,0.9)之间
Algebra=100;
Dimension=30;
Generation=1;
scope_min=-100; %测试函数的解空间
scope_max=100;
%初始化种群变量
variation=zeros(Np,Dimension);
trial=zeros(Np,Dimension);
%进行初始化操作并且评估种群的适应值
initial=rand(Np,Dimension)*(scope_max-scope_min)+scope_min;
for i=1:Np
adapt_value_1(i)=sum(initial(i,:).^2);
end
trace(Generation)=min(adapt_value_1); %记录代数和每代最优解之间的关系
%进行变异->交叉->选择的迭代
while(Generation<=Algebra)
for j=1:Np
dx=randperm(Np);
if dx(1)==j,dx(1)=dx(4);
elseif dx(2)==j,dx(2)=dx(4);
elseif dx(3)==j,dx(2)=dx(4);
end
variation(j,:)=initial(dx(1),:)+F*(initial(dx(2),:)-initial(dx(3),:));
%对变异种群的个体进行是否在解空间中做判断
for m=1:Dimension
if variation(j,m)<scope_min || variation(j,m)>scope_max
variation(j,m)=rand*(scope_max-scope_min)+scope_min;
end
end
for n=1:Dimension
cr=rand(1);
if cr<Cr || dx(5)==n
trial(j,n)=variation(j,n);
else
trial(j,n)=initial(j,n);
end
end
adapt_value_2(j)=sum(trial(j,:).^2);
end
for q=1:Np
if adapt_value_2(q)<=adapt_value_1(q)
initial(q,:)=trial(q,:);
end
adapt_value_1(q)=sum(initial(q,:).^2);
end
Generation=Generation+1;
trace(Generation)=min(adapt_value_1);
end
figure(1);
plot(trace);
xlabel('进化代数');
ylabel('适应值');