一、获取代码方式
获取代码方式1:
完整代码已上传我的资源:【优化算法】差分蜂群优化算法(DEABC)【含Matlab源码 1230期】
二、部分源代码
clear
clc
close all
%% 首先选择一个函数进行寻优
objfun=@f1;ub=100; lb=-100;%sphere 全局最小值为0
objfun=@f2;lb=-600; ub=600;%griewank 全局最小值为0
objfun=@f3;lb=-100; ub=100;%rastrigin 全局最小值为0
objfun=@f4;lb=-10; ub=10;%rosenbrock 全局最小值为0
%%
d=2;
max_iter=2500;
sizepop=20;
%%
%1 粒子群
[pso_position,pso_fitness,pso_trace]=pso(objfun,d,max_iter,sizepop,ub,lb);
%2 遗传算法
[ga_position,ga_fitness,ga_trace]=ga(objfun,d,max_iter,sizepop,ub,lb);
%2 差分进化算法
[de_position,de_fitness,de_trace]=de1(objfun,d,max_iter,sizepop,ub,lb);
%3 蜂群算法
[abc_position,abc_fitness,abc_trace]=abc(objfun,d,max_iter,sizepop,ub,lb);
% 差分蜂群
[deabc_position ,deabc_fitness,deabc_trace]=DEABC(objfun,d,max_iter,sizepop,ub,lb);
%%
figure
plot(pso_trace(:,1))
hold on
plot(ga_trace(:,1))
plot(de_trace(:,1))
plot(abc_trace(:,1))
plot(deabc_trace(:,1))
legend('PSO','GA','DE','ABC','DEABC')
xlabel('迭代数')
ylabel('适应度值/函数值')
%%
figure
plot(log10(pso_trace(:,1)),'b-')
hold on
plot(log10(ga_trace(:,1)),'r-')
plot(log10(de_trace(:,1)),'g-')
plot(log10(abc_trace(:,1)),'k-')
plot(log10(deabc_trace(:,1)),'m-')
legend('PSO','GA','DE','ABC','DEABC')
xlabel('迭代数')
ylabel('适应度值/log10(函数值)')
img =gcf; %获取当前画图的句柄
print(img, '-dpng', '-r600', './img.png') %即可得到对应格式和期望dpi的图像
function [best,cf,gen]=DEABC(objfun,D,n,popsize,ub,lb);
fit.objfun=objfun;fit.ub=ub; fit.lb=lb;
%参数设置
popsize;%种群数
n;% 种群混合次数
dim=D;%待优化的变量的维数
%% 初始化种群
%随机分配k个种群给DE popsize-k给ABC
k=ceil(popsize*rand);
while k<3 | mod(k, 2)~= 0 | k==popsize| k>popsize-3 %注:abc的种群必须是偶数,且要大于4
k=ceil(popsize*rand);
end
N1=k;
N2=popsize-k;
pop_de=rand(N1,dim)*(ub-lb)+lb;
pop_pso=rand(N2,dim)*(ub-lb)+lb;
%计算适应度值
for i=1:N1
f_de(i)=objfun(pop_de(N1,:));
end
for i=1:N2
f_pso(i)=objfun(pop_pso(N2,:));
end
%设置初始最优位置
if min(f_de)<min(f_pso)
[fgbest r]=min(f_de);
best=pop_de(r,:);
else
[fgbest r]=min(f_pso);
best=pop_pso(r,:);
end
function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)
%本函数完成交叉操作
% pcorss input : 交叉概率
% lenchrom input : 染色体的长度
% chrom input : 染色体群
% sizepop input : 种群规模
% ret output : 交叉后的染色体
for i=1:sizepop %每一轮for循环中,可能会进行一次交叉操作,染色体是随机选择的,交叉位置也是随机选择的,%但该轮for循环中是否进行交叉操作则由交叉概率决定(continue控制)
% 随机选择两个染色体进行交叉
pick=rand(1,2);
while prod(pick)==0
pick=rand(1,2);
end
index=ceil(pick.*sizepop);
% 交叉概率决定是否进行交叉
pick=rand;
while pick==0
pick=rand;
end
if pick>pcross
continue;
end
% 随机选择交叉位
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同
pick=rand; %交叉开始
v1=chrom(index(1),pos);
v2=chrom(index(2),pos);
chrom(index(1),pos)=pick*v2+(1-pick)*v1;
chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束
% 判断边界条件
for j=1:lenchrom
if chrom(index(1),j)>bound(2)|chrom(index(1),j)<bound(1)
chrom(index(1),j)=bound(1)+(bound(2)-bound(1))*rand;
end
end
for j=1:lenchrom
if chrom(index(2),j)>bound(2)|chrom(index(2),j)<bound(1)
chrom(index(2),j)=bound(1)+(bound(2)-bound(1))*rand;
end
end
end
ret=chrom;
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.