智能算法终极大比拼,以CEC2005测试函数为例,十种智能算法直接打包带走,不含任何套路!

news2024/11/16 19:47:53

包含人工蜂群(ABC)、灰狼(GWO)、差分进化(DE)、粒子群(PSO)、麻雀优化(SSA)、蜣螂优化(DBO)、白鲸优化(BWO)、遗传算法(GA)、粒子群算法(PSO)基于反向动态学习的差分进化算法,共种算法,直接一文全部搞定!

由于上一篇代码,很多小伙伴留言,说出现了函数安装等运行问题。因此才决定写一篇CEC2005版本的。这个版本的函数无需c++编译器即可使用。

这里说句题外话,函数安装的问题其实在matlab被禁之前,是很好解决的,直接在附加功能添加附件即可。但是被禁之后,安装mingw或者c++编译器,很多刚入门的小伙伴不太会。当然网上有很多教程可以解决,但是咱们的主题是学会智能算法的使用,这里就不再介绍编译器的安装问题啦。

回归正题!CEC2005函数在很多论文中也有提及,毕竟是最经典的国际公认函数测试范例。下面依然是继承上一篇文章的十种智能算法进行测试,没看过这篇文章的小伙伴可以看这里:智能算法终极大比拼,以CEC2017测试函数为例,十种智能算法直接打包带走,不含任何套路!_今天吃饺子的博客-CSDN博客

还是老规矩,不掺杂任何套路,欢迎来我这里白嫖!大家也可以看看别得文章看看是否有所需求,都是可以白嫖的!承诺永久不添加VIP!大家也可以关注v公众号【淘个代码】,第一时间免费获取代码资源!

以CEC2005函数为例,我随意选择了几个函数,每个算法迭代了500次,先上结果图:

 

  

 

 以上几个函数,都是我随机选择的,其他函数我没有一一测试。

接下来到了最关键的上代码阶段!但是,无奈10个算法代码量实在是太大了,这里就截取部分代码啦!大家想要完整版的,可以搜索【淘个代码】公众号回复关键词:“智能算法”。

%%%  智能算法终极大比拼系列  %%%
%% 淘个代码 %%
%% 2023.6.12 %%
%% 微信公众号:淘个代码
%%
clear
clc
close all
addpath(genpath(pwd));
number='F5'; %选定优化函数,自行替换:F1~F23
% [lb,ub,D,y]:下界、上界、维度、目标函数表达式
[lb,ub,D,y]=CEC2005(number);  

N=50; %种群规模
T=500; %最大迭代次数

%%  各类算法  (N,T,lb,ub,D,y)
[OBLDEfMin,OBLDEbestX,OBLDE_curve]=OBL_impDE(y,N,T,lb,ub,D);   %动态反向学习的DE算法
[DEfMin,DEbestX,DE_curve]=DE(y,N,T,lb,ub,D);      %DE算法
[Alpha_score,Alpha_pos,GWO_curve]=GWO(y,N,T,lb,ub,D);   %灰狼算法
pso_curve=PSO(y,N,T,lb,ub,D);  %粒子群算法
[bestchrom,GA_trace]=ga(y,N,T,lb,ub,D); %遗传算法
ABC_trace = ABC(y,N,T,lb,ub,D);      %人工蜂群
[CSO_Best_score,CSO_Best_pos,cso_trace] = CSO(y,N,T,lb,ub,D);  %鸡群算法
[fMin,bestX,DBO_curve]=DBO(y,N,T,lb,ub,D);       %蜣螂优化
[BWO_Best_pos,BWO_Best_score,BWO_curve] = BWO(y,N,T,lb,ub,D);   %白鲸优化算法
%% 麻雀
%设置SSA算法的参数
Params.nVar=D;                           % 优化变量数目
Params.VarSize=[1 Params.nVar];          % Size of Decision Variables Matrix
Params.VarMin=lb;      % 下限值,分别是a,k
Params.VarMax=ub;        % 上限值
Params.MaxIter=T;       % 最大迭代数目
Params.nPop=N;        % 种群规模
[particle3, GlobalBest3,SD,GlobalWorst3,Predator,Joiner] =  SSAInitialization(y,Params,'SSA');  %初始化SSA参数
[GlobalBest,SSA_curve] =  SSA(y,GlobalBest3,GlobalWorst3,SD,Predator,Joiner,Params);  %采用SSA参数优化VMD的两个参数
%由于麻雀算法是将各个参数放进了一个结构体,这里作者不想再去折腾改了,因此麻雀算法单独设计。

%% 画图
CNT=50;
k=round(linspace(1,T,CNT)); %随机选50个点
% 注意:如果收敛曲线画出来的点很少,随机点很稀疏,说明点取少了,这时应增加取点的数量,100、200、300等,逐渐增加
% 相反,如果收敛曲线上的随机点非常密集,说明点取多了,此时要减少取点数量
iter=1:1:T;
semilogy(iter(k),ABC_trace(k),'m-x','linewidth',1);
hold on
semilogy(iter(k),GA_trace(k),'Color',[0.6350 0.0780 0.1840],'Marker','d','LineStyle','-','linewidth',1);
hold on
semilogy(iter(k),pso_curve(k),'r-x','linewidth',1);
hold on
semilogy(iter(k),SSA_curve(k),'Color',[0.1 0.3780 0.66],'Marker','+','LineStyle','-.','linewidth',1);
hold on
semilogy(iter(k),GWO_curve(k),'Color',[0.9 0.1 0.6],'Marker','*','LineStyle','-','linewidth',1);
hold on
semilogy(iter(k),cso_trace(k),'Color',[0.1 0.1 0.5],'Marker','p','LineStyle','--','linewidth',1);
hold on
semilogy(iter(k),DBO_curve(k),'Color',[0.6 0.5 0.9],'Marker','x','LineStyle','--','linewidth',1);
hold on
semilogy(iter(k),BWO_curve(k),'Color',[0.7 0.1 0.7],'Marker','>','LineStyle','--','linewidth',1);
hold on
semilogy(iter(k),DE_curve(k),'Color',[0.1 0.6 0.6],'Marker','o','LineStyle','-','linewidth',1);
hold on
semilogy(iter(k),OBLDE_curve(k),'g-x','linewidth',1);
grid on;
title(['函数收敛曲线',number])
xlabel('Iterations');
ylabel('Objective function value');
box on
legend('ABC','GA','PSO','SSA','GWO','CSO','DBO','BWO','DE','OBLDE')

 DE算法:

function [min_f,min_x,trace]=DE(y,NP,G,c,d,D)

%%%%%%%%%%%%%%%%%%%%%%%%设置参数%%%%%%%%%%%
F = 0.8;%变异算子
CR = 0.1;%交叉算子
Xx= c.*ones(1,D );    % Lower limit/bounds/     a vector
Xs= d.*ones(1,D);    % Upper limit/bounds/     a vector
% Xs = repelem(20,D);%变量取值最大
% Xx = repelem(-20,D);%变量取值最小
yz = 1e-6;%阈值

%%%%%%%%%%%%%%%%%%%%%%%%初始化种群%%%%%%%%%%%
x = zeros(NP,D);%初始种群
v = zeros(NP,D);%变异种群
u = zeros(NP,D);%选择种群
% x = Xx+rand(NP,D)*(Xs-Xx);%赋初值
x=initialization(NP,D,Xs,Xx);
%%%%%%%计算目标函数%%%%%%
Ob = zeros(NP,1);%初始化Ob用来存储种群函数值
for m=1:NP
    Ob(m) = y(x(m,:));

end
trace = zeros(G+1,1);%存储每代种群函数值最小
trace(1) = min(Ob);

%%%%%%%%%%%%%%差分进化循环%%%%%%%%%%%%%
for gen=1:G
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%%%%%%%%
%     %%%%%%%%%自适应变异算子%%%%%%%%%%%%%%
%     lambda = exp(1-G/(G+1-gen));
%     F = F0*2^lambda;
    %%%%%%%%%r1,r2,r3和m互不相同%%%%%%%%%%%
    for m=1:NP
        r = randperm(NP,3);%在种群中随机选择三个序号作为r1,r2,r3
        r1 = r(1);
        r2 = r(2);
        r3 = r(3);
        v(m,:) = x(r1,:) + F*(x(r2,:)-x(r3,:));
    end
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%%%%%%%%%%%%%
    r = randperm(D,1);%随机确定一个维度
    for n=1:D
        cr = rand(1);%产生一个随机数
        if (cr<CR) || (n==r)
            u(:,n) = v(:,n);
        else
            u(:,n) = x(:,n);
        end
    end
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%边界条件的处理%%%%%%%%%%%%%%%%%%%%%%%%%%%
    for n=1:D
        for m=1:NP
            if (u(m,n)<Xx(n)) || (u(m,n)>Xs(n))
                u(m,n) = rand*(Xs(n)-Xx(n))+Xx(n);%超出边界重新赋值
            end
        end
    end
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%选择操作%%%%%%%%%%%%%%%%%%%%%%%%%%%
    Ob1 = zeros(NP,1);
    for m=1:NP
        Ob1(m) = y(u(m,:));

    end
    for m=1:NP
        if Ob1(m)<Ob(m)
            x(m,:) = u(m,:);
        end
    end
    
    %求第G+1代x的值
    for m=1:NP
                Ob(m) =y(x(m,:));

    end
    trace(gen+1) = min(Ob);
%     if min(Ob)<yz
%         break;
%     end
end
[min_f,min_Index] = min(Ob);%找到Ob中最小的值和位置
min_x = x(min_Index,:);%对应最优值的解
end

 麻雀优化算法:

function [ GlobalBest,BestCost] =SSA (y,GlobalBest,GlobalWorst,SD,Predator,Joiner,Params)

MaxIter = Params.MaxIter;
nPop = Params.nPop;
VarMin = Params.VarMin;
VarMax = Params.VarMax;
VarSize = Params.VarSize;
nVar=2;%size(VarSize,2);
BestCost = zeros(1,MaxIter);

%% Main loop
for i = 1:MaxIter
    for j = 1:length(Predator)
        alarm =  randn ;
        ST = randn;
        if alarm < ST
            Predator(j).Position = Predator(j).Position .* exp( -j /MaxIter);
        else
            Predator(j).Position = Predator(j).Position + randn * ones(VarSize);
        end
        Predator(j).Position = max(VarMin,Predator(j).Position);
        Predator(j).Position = min(VarMax,Predator(j).Position);

           Predator(j).Cost =y(Predator(j).Position);

      
    end
      [~,idx] = min([Predator.Cost]);
      BestPredator = Predator(idx);
    % 加入者更新
    for j = 1: nPop - length(Predator)
        if j + length(Predator)> nPop/2
            Joiner(j).Position =  randn .* exp( (GlobalWorst.Position - Joiner(j).Position) / j^2);
            
        else
            A = randi([0,1],1,nVar);
            A(~A) = -1;
            Ahat = A' / (A * A');
                Joiner(j).Position = BestPredator.Position + abs(Joiner(j).Position - BestPredator.Position) * Ahat * ones(VarSize);  
        end
        Joiner(j).Position = max(VarMin,Joiner(j).Position);
        Joiner(j).Position = min(VarMax,Joiner(j).Position);
  
        Joiner(j).Cost =y(Joiner(j).Position);

    end
    
    % 警觉者更新
    for j = 1:length(SD)
        if SD(j).Cost > GlobalBest.Cost
            SD(j).Position = GlobalBest.Position + randn * abs( SD(j).Position - GlobalBest.Position);
        
        elseif SD(j).Cost == GlobalBest.Cost
            SD(j).Position = SD(j).Position + (rand*2-1) * (abs( SD(j).Position - GlobalWorst.Position)./ ((SD(j).Cost - GlobalWorst.Cost) + 0.001));
        end
        SD(j).Position = max(VarMin,SD(j).Position);
        SD(j).Position = min(VarMax,SD(j).Position);


    end
  
    
    
% 更新
particle = [Predator;Joiner;SD];
for m = 1:length(particle)
    if GlobalBest.Cost > particle(m).Cost
        GlobalBest = particle(m);
    end
    if GlobalWorst.Cost < particle(m).Cost
        GlobalWorst = particle(m);
    end
end
 
BestCost(i) = GlobalBest.Cost;
 
% disp(['当前迭代',num2str(i), '最优值为: ', num2str(GlobalBest.Cost)])
%    disp(['第',num2str(i),'次寻优的适应度值为:',num2str(BestCost(i))])
%     disp(['第',num2str(i),'次寻优的最佳位置为:[',num2str(GlobalBest.Position),']'])

end

%% Results

% figure;
% %plot(BestCost,'LineWidth',2);
% semilogy(BestCost,'LineWidth',2);
% xlabel('Iteration');
% ylabel('Best Cost');
% grid on;
end

剩下的,由于篇幅原因,请各位移步v公众号【淘个代码】回复关键词:“智能算法”,即可获取整套代码资料啦!

欢迎大家评论区留言哦!

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/637195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

赋能矿山 | KaiwuDB 智慧矿山解决方案

行业背景 随着勘探和矿产开发技术的提高以及能源需求量的大幅增加&#xff0c;矿山开发速度持续加快。随之而来的诸多弊端&#xff0c;如矿山资源综合利用率低、管理方式粗放、安全和环境污染等问题日益突出&#xff0c;使得矿业智能化建设迫在眉睫。 近年来&#xff0c;政府…

【算法与数据结构】160、LeetCode相交链表

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题题目蛮长的。说的大概意思就是对比指针地址&#xff0c;只要相等了&#xff0c;那就是相交节点。…

华为OD机试之执行时长(Java源码)

执行时长 题目描述 为了充分发挥GPU算力&#xff0c;需要尽可能多的将任务交给GPU执行&#xff0c;现在有一个任务数组&#xff0c;数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。 假设GPU最多一次执行n个任务&#xff0c;一次执行耗时1秒&#xff0c;在保证GPU不空…

论文解读 | 机器人路径跟踪的受控纯追踪法

原创 | 文 BFT机器人 01 摘要 这篇文章是关于机器人路径跟踪的受控纯追踪算法的研究。文章介绍了传统的纯追踪算法以及相关变体&#xff0c;并提出了受控纯追踪算法作为本文的主要贡献。该算法旨在适应实际环境中的服务和工业移动机器人&#xff0c;提供方法来调整机器人的平移…

关于spring boot报javax/servlet/MultipartConfigElement错误以及的问题

springboot在启动时报java.lang.NoClassDefFoundError: javax/servlet/MultipartConfigElement 解决方法&#xff1a;将pom.xml文件中的provided删掉

盛元广通生物化学重点实验室化学品信息化安全管理系统

生物化学重点实验室是国家基础研究和高技术研究的重要基地&#xff0c;是培养和造就高层次创新型人才的重要基地。为保障实验室化学品安全使用&#xff0c;实验人员可通过现场或移动端管理系统实现化学品安全使用与存储。盛元广通生物化学重点实验室化学品信息化安全管理系统具…

方波信号拆分及合成

1. 前言 数字处理器产生的都是方波信号&#xff0c; 做EMC会有各种高频率的辐射超标。比如下图为EMC测试辐射图&#xff0c;其中480MHz左右频率超标&#xff0c;那么就需要分析这个频率是谁产生的&#xff0c;但是整个系统都没有谁使用了这么高的频率信号。但是一般根据经验都知…

mysql-explain-其他

eq_ref 主键和唯一索引的所有部分被连接使用&#xff0c;最多只会返回一条符合条件的记录【主键关联查询】 ref: 根节点二分查找 没有使用唯一索引&#xff0c;而是走了普通索引【二级索引】或者唯一索引的部分前缀&#xff0c;有可能查出多个符合条件的行。 range 范围扫…

全网最全的Python教程(非常详细),从零基础入门到上岗!

Python的火&#xff0c;有目共睹。Python陆续登上了IEEE、PYPL排行榜单之首&#xff0c;对于Python的崛起TIOBE排行榜也给予了回应&#xff1a;由于全球流行度在过去一年中涨幅最高&#xff01; 同时人工智能的兴起&#xff0c;也给了Python无限可能&#xff0c;让Python越来越…

Systick实现中断-GD32

定时器中断-GD32 include "gd32f10x.h" #include "systick.h" #include "LED.h"volatile static uint32_t delay_reload; volatile static uint32_t delay_value;/*!\brief configure systick\param[in] none\param[out] none\retval …

asp.net试卷自动生成系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net试卷自动生成系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net试卷自动生成系统VS开发sq…

Java 泛型:概念、语法和应用

文章目录 一、什么是 Java 泛型&#xff1f;二、为什么要使用泛型三、Java 泛型的语法四、Java 泛型的应用五、Java 泛型的示例六、总结 随着 Java 编程语言的不断发展和更新&#xff0c;Java 1.5 版本引入了一项全新的特性——Java 泛型&#xff08;Java Generic&#xff09;&…

Classic AUTOSAR专题 | I/O模块简介

书接上回&#xff0c;上期专题内容中小怿介绍了Classic AUTOSAR之存储模块&#xff0c;相信大家对存储以及NvM已经有了初步的认识了解。接下来我们将继续介绍Classic AUTOSAR专题之I/O模块&#xff0c;同时感兴趣的小伙伴还请持续关注后续内容~ 01 AUTOSAR I/O功能概述 I/O(Inp…

2023年6月DAMA-CDGA/CDGP数据治理工程师认证这里报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

深度学习应用篇-自然语言处理-命名实体识别[9]:BiLSTM+CRF实现命名实体识别、实体、关系、属性抽取实战项目合集(含智能标注)【下篇】

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

ZYNQ 7020 开发板开机检测

拿到开发板后检测开发板能否正常工作。 检测需要的工具&#xff1a;电脑、显示器(有HDMI接口)、HDMI线、鼠标、键盘、网线、USB转串口驱动软件。 在检测之前&#xff0c;先要在自己的电脑上安装好终端工具和USB转串口的驱动软件。 终端工具我安装的是 MobaXterm。 USB转串口的驱…

深入理解JavaScript模块化开发

前言&#xff1a; 随着JavaScript应用程序的复杂性不断增加&#xff0c;模块化开发成为了一种必备的技术。通过将代码划分为模块&#xff0c;我们可以提高代码的可维护性、可重用性和可扩展性。在本文中&#xff0c;我们将深入探讨JavaScript模块化开发的概念、优势和不同的模块…

热门自定义报表系统推荐,哪款自定义报表系统更功能更强大?

随着企业管理的日益复杂&#xff0c;越来越多的企业需要一款高效、灵活、易用的自定义报表系统来满足其各种报表制作和数据分析需求。然而&#xff0c;在众多自定义报表系统中&#xff0c;哪款更加强大&#xff1f;今天&#xff0c;我将向大家推荐5款热门自定义报表系统&#x…

设施设备管理系统

凡尔码搭建设施设备管理系统是一种为企业和机构提供维护和管理设备、设施、建筑物和环境等设施的系统。它通过自动化设施的巡检计划、保养计划、通知和维护任务&#xff0c;使设施维护管理的工作更高效率、更科学化&#xff0c;并提高了设施设备的可靠性和使用价值。该系统具有…