麻雀搜索优化算法MATLAB实现,SSA-BP网络

对于麻雀搜索算法的介绍,网上已经有不少资料了,这边公布SSA的matlab实现

下面展示SSA算法的核心代码以及详细注解

% 麻雀搜索算法函数定义

% 输入:种群大小(pop),最大迭代次数(Max_iter),搜索空间下界(lb),搜索空间上界(ub),问题维度(dim),目标函数(fobj)

% 输出:最优适应度值(Best_score),最优位置(Best_pos),每次迭代的最优适应度值(curve)

function [Best_score,Best_pos,curve]=SSA(pop,Max_iter,lb,ub,dim,fobj)

% 预警值

ST = 0.7;

% 发现者的比例

PD = 0.4;

% 意识到有危险麻雀的比重

SD = 0.2;

% 计算发现者数量和意识到有危险麻雀数量

PDNumber = round(pop*PD);

SDNumber = round(SD*PD);

% 种群初始化

X0=initialization(pop,dim,ub,lb);

X = X0;

% 计算初始适应度值

fitness = zeros(1,pop);

for i = 1:pop

   fitness(i) =  fobj(X(i,:));

end

% 对适应度值进行升序排序,找到最优和最差的适应度值

[fitness, index]= sort(fitness);

BestF = fitness(1);

WorstF = fitness(end);

% 更新全局最优适应度值

GBestF = fitness(1);

% 根据适应度值的排序结果,重新排列种群中的麻雀

for i = 1:pop

    X(i,:) = X0(index(i),:);

end

% 初始化记录每次迭代的最优适应度值的数组

curve=zeros(1,Max_iter);

% 记录全局最优位置

GBestX = X(1,:);

% 初始化新的种群位置

X_new = X;

% 迭代开始

for i = 1: Max_iter

    disp(['第',num2str(i),'次迭代'])

    BestF = fitness(1);

    WorstF = fitness(end);

    % 麻雀的行为更新

   for j = 1:PDNumber

      if(rand(1)<ST)

          % 麻雀降低飞行高度以避免风险

          X_new(j,:) = X(j,:).*exp(-j/(rand(1)*Max_iter));

      else

          % 麻雀在原有位置上添加随机扰动,以模拟发现者的搜索行为

          X_new(j,:) = X(j,:) + randn()*ones(1,dim);

      end     

   end

   

   for j = PDNumber+1:pop

        if(j>(pop - PDNumber)/2 + PDNumber)

          % 麻雀向全局最优麻雀靠近,以模拟麻雀的跟随行为

          X_new(j,:)= randn().*exp((X(end,:) - X(j,:))/j^2);

        else

          % 麻雀向局部最优麻雀靠近,以模拟麻雀的跟随行为

          A = ones(1,dim);

          for a = 1:dim

            if(rand()>0.5)

                A(a) = -1;

            end

          end

          AA = A'*inv(A*A');     

          X_new(j,:)= X(1,:) + abs(X(j,:) - X(1,:)).*AA';

       end

   end

   

   % 对于意识到有危险的麻雀,进行特殊的行为更新

   Temp = randperm(pop);

   SDchooseIndex = Temp(1:SDNumber);

   for j = 1:SDNumber

       if(fitness(SDchooseIndex(j))>BestF)

           % 如果适应度值大于当前最优值,麻雀向全局最优麻雀靠近

           X_new(SDchooseIndex(j),:) = X(1,:) + randn().*abs(X(SDchooseIndex(j),:) - X(1,:));

      ```matlab

       elseif(fitness(SDchooseIndex(j))== BestF)

           % 如果适应度值等于当前最优值,麻雀进行随机行为

           K = 2*rand() -1;

           X_new(SDchooseIndex(j),:) = X(SDchooseIndex(j),:) + K.*(abs( X(SDchooseIndex(j),:) - X(end,:))./(fitness(SDchooseIndex(j)) - fitness(end) + 10^-8));

       end

   end

   

   % 边界控制,防止麻雀飞出搜索空间

   for j = 1:pop

       for a = 1: dim

           if length(ub)>1

               if(X_new(j,a)>ub(a))

                   X_new(j,a) =ub(a);

               end

               if(X_new(j,a)<lb(a))

                   X_new(j,a) =lb(a);

               end

           else

                if(X_new(j,a)>ub)

                   X_new(j,a) =ub;

               end

               if(X_new(j,a)<lb)

                   X_new(j,a) =lb;

               end

           end

       end

   end

   

   % 更新位置

   for j=1:pop

     fitness_new(j) = fobj(X_new(j,:));

   end

   

   for j = 1:pop

    if(fitness_new(j) < GBestF)

       % 更新全局最优适应度值和位置

       GBestF = fitness_new(j);

        GBestX = X_new(j,:);   

    end

   end

   

   X = X_new;

   fitness = fitness_new;

   

   % 根据新的适应度值,重新排序种群

   [fitness, index]= sort(fitness);

   BestF = fitness(1);

   WorstF = fitness(end);

   for j = 1:pop

      X(j,:) = X(index(j),:);

   end

   

   % 记录当前迭代的最优适应度值

   curve(i) = GBestF;

    disp(['current iteration is: ',num2str(i), ', best fitness is: ', num2str(GBestF)])

end

% 返回全局最优位置和最优适应度值

Best_pos =GBestX;  

Best_score = curve(end);

end

将SSA应用到BP神经网络优化上,优化结果图如下:

具体思路为:

1.清理环境:开始时,代码清理了MATLAB环境,关闭了所有图窗,清空了所有变量和命令行,以确保开始一个全新的会话。

2.导入数据:导入一个名为“数据集.xlsx”的Excel文件,并对数据进行了分析。数据集被分为训练集和测试集,其中80%的数据用作训练集。

3.数据归一化:为了使网络训练更有效,数据被归一化到0和1之间。

4.创建和配置神经网络:创建了一个新的前馈神经网络,其中隐藏层的节点数为15。然后,设置了网络的训练参数,包括训练次数、目标误差和学习率。

5.麻雀搜索算法(SSA)的应用:SSA是一种优化算法,用于寻找最优的权重和阀值以初始化神经网络。SSA模拟了麻雀的捕食行为,麻雀通过在搜索空间内搜索食物源来找到最优解。

6.网络训练和预测:用SSA找到的最优初始权重和阀值训练网络,并对训练集和测试集进行预测。

7.反归一化:预测完成后,数据被反归一化,以便可以与原始数据进行比较。

8.评估模型性能:计算了均方根误差(RMSE)、决定系数(R2)、均方误差(MSE)、剩余预测残差(RPD)、平均绝对误差(MAE)和平均绝对百分比误差(MAPE)来评估模型的性能。

9.结果可视化:最后,通过各种图形(包括预测结果、误差直方图、优化曲线、线性拟合图等)对结果进行了可视化。

完整的代码实现以及数据集见:

GitHub - dazhiwang233/matlab-implementation-of-SSA-BP-network: SSA-BP网络的matlab实现

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS实现空心的“尖角”

大家好&#xff0c;我是南宫&#xff0c;来分享一个昨天解决的问题。 我记得之前刷面试题的时候&#xff0c;CSS面试题里面赫然有一题是“如何用CSS实现三角形”&#xff0c;我觉得这个问题确实很经典&#xff0c;我上的前端培训班当初就讲过。 大概思路如下&#xff1a; 先…

想分析全国用电及煤气、液化石油气供应利用情况,这部分数据对你有帮助!

随着经济的发展和人民生活水平的提高&#xff0c;能源的需求量越来越大。其中&#xff0c;电力和煤气、液化石油气等能源的供应利用情况与我们的日常生活息息相关。 今天我们根据《中国城市统计年鉴》统计的中国地级及以上城市的煤气及液化石油气供应及利用情况的指标&#xff…

洗内裤的小洗衣机买啥牌子的?性价比婴儿洗衣机推荐

在近些年来&#xff0c;人们对生活和健康的要求越来越高&#xff0c;所以内衣洗衣机也走进了人们的视线&#xff0c;许多研究显示&#xff0c;单纯的手洗是不能彻底消除体内的细菌的&#xff0c;而机洗则可以有效地消除大部分的细菌&#xff0c;但是机洗内衣裤对洗衣机的卫生要…

MySQL数据库入门到大牛_基础_11_数据处理之增删改

本章将会介绍DML中的增删改查操作&#xff0c;增删改泛泛来讲是针对表中数据的修改。 文章目录 1. 插入数据1.1 实际问题1.2 方式1&#xff1a;VALUES的方式添加1.3 方式2&#xff1a;将查询结果插入到表中 2. 更新数据3. 删除数据4. 小结5. MySQL8新特性&#xff1a;计算列6. …

如何正确复制CSDN文章到自己的博客

1.csdn 文章页面&#xff0c;按f12打开浏览器开发者工具 2.按ctrl f 找 "article_content" 3.在该元素源代码上右键 “Copy”->“Copy element” 4.新建一个txt文件,把你粘贴的东西复制进去,然后再把文件名的后缀改为html,然后打开html文件,把里面的内容ctrlA全部…

【腾讯云云上实验室-向量数据库】腾讯云开创新时代,发布全新向量数据库Tencent Cloud VectorDB

前言 随着人工智能、数据挖掘等技术的飞速发展&#xff0c;海量数据的存储和分析越来越成为重要的研究方向。在海量数据中找到具有相似性或相关性的数据对于实现精准推荐、搜索等应用至关重要。传统关系型数据库存在一些缺陷&#xff0c;例如存储效率低、查询耗时长等问题&…

VSCode配置用户代码段以及常用快捷键汇总

一&#xff1a;前言 VSCode 是一款由微软开发的轻量级编辑器&#xff0c;可以安装插件和兼容多种语言。其本身已经是目前前端开发所使用的主流软件。那么在开发过程中&#xff0c;我们经常要写很多重复性的代码&#xff0c;比如当你去新建一个 .vue 页面的时候&#xff0c;往往…

服务器中了elbie勒索病毒解决办法,elbie勒索病毒解密数据恢复

科技技术的不断发展&#xff0c;为企业的生产运营提供了极大便利&#xff0c;但网络安全威胁也不断增加&#xff0c;近期云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的服务器中了elbie勒索病毒&#xff0c;导致系统瘫痪&#xff0c;所有业务无法正常开展&#xff…

全球首款容器计算产品重磅发布,激活上云用云新范式

云布道师 10 月 31 日&#xff0c;杭州云栖大会上&#xff0c;阿里云云原生应用平台负责人丁宇宣布&#xff0c;阿里云容器计算服务 ACS 正式发布&#xff01;ACS 将大幅降低企业和开发者用云门槛&#xff0c;真正将 Serverless 理念大规模落地。 容器计算服务 ACS&#xff0c…

【CodeTop】TOP 100 刷题 11-20

文章目录 11. 二叉树的层序遍历题目描述代码与解题思路 12. 搜索旋转排序数组题目描述代码与解题思路 13. 买卖股票的最佳时机题目描述代码和解题思路 14. 岛屿数量题目描述代码与解题思路 15. 环形链表题目描述代码与解题思路 16. 有效的括号题目描述代码与解题思路 17. 合并两…

使用 millis() 函数作为延迟的替代方法(电位器控制延迟时间)

接线图&#xff1a; 代码&#xff1a; unsigned long currentMillis 0; unsigned long previousMillis_LED1 0; unsigned long LED1_delay0; unsigned long previousMillis_LED2 0; unsigned long LED2_delay0; #define LED1 3 #define LED2 9 #define P1 A2 …