【优化算法】差分蜂群优化算法(DEABC)【含Matlab源码 1230期】

举报
海神之光 发表于 2022/05/29 01:48:59 2022/05/29
1.1k+ 0 0
【摘要】 一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【优化算法】差分蜂群优化算法(DEABC)【含Matlab源码 1230期】 获取代码方式2: 通过订阅紫极神光博客付费专栏,凭支付凭证,私...

一、获取代码方式

获取代码方式1:
完整代码已上传我的资源:【优化算法】差分蜂群优化算法(DEABC)【含Matlab源码 1230期】

获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

备注:
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、部分源代码

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.

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/121321085

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。