草庐IT

麻雀算法SSA,优化VMD,适应度函数为最小包络熵,包含MATLAB源代码,直接复制粘贴!

今天吃饺子 2023-04-03 原文

首先声明,本篇文章直接包含所有matlab源代码,直接复制粘贴即可运行,全部都是源代码,可以自己更改的源代码!(不是.p文件!!!,浅浅痛斥一下很多文章为了盈利,还给程序加密!谴责!!)都是学生时代走过来的, 大家直接来我这里复制就行了,哪里不懂直接评论区留言,我会一一解答!

好了,废话到此为止!接下来讲正文!

同样以西储大学数据集为例,选用105.mat中的X105_BA_time.mat数据。

首先进行VMD分解,采用麻雀优化算法(SSA)对VMD的两个关键参数(惩罚因子α和模态分解数K)进行优化,以最小包络熵为适应度值。其他智能优化算法同样适用,关键要学会最小包络熵代码的编写,网上的五花八门,这篇文章会对最小包络熵代码进行详细注释。

先上结果图:

实验过程中,会实时显示每次寻优后的最小包络熵值和VMD对应的两个最佳参数。本次寻优共100次(自己可以随意更改寻优次数)。

可以看到寻优100次后,最小包络熵为7.4036,对应两个vmd的最佳参数为122,8,其中惩罚因子为122,模态分解数为8。

 收敛曲线如下所示:

上代码!直接复制粘贴就行!一个脚本,三个函数!

首先是主函数脚本,其中 惩罚因子α的范围是[100-2500],模态分解数K的范围是[3-10]

clear all 
clc
addpath(genpath(pwd))
CostFunction=@(x) Cost(x);        % 适应度函数的调用,包络熵值,详情请看Cost
%设置SSA算法的参数
Params.nVar=2;                           % 优化变量数目
Params.VarSize=[1 Params.nVar];          % Size of Decision Variables Matrix
Params.VarMin=[100 3];      % 下限值,分别是a,k
Params.VarMax=[2500 10];        % 上限值
Params.MaxIter=100;       % 最大迭代数目
Params.nPop=10;        % 种群规模
[particle3, GlobalBest3,SD,GlobalWorst3,Predator,Joiner] =  Initialization(Params,CostFunction,'SSA');  %初始化SSA参数
disp(['***采用SSA算法开始寻优***'])
[GlobalBest,SSA_curve] =  SSA(particle3,GlobalBest3,GlobalWorst3,SD,Predator,Joiner,Params,CostFunction);  %采用SSA参数优化VMD的两个参数
fMin = GlobalBest.Cost;
bestX = GlobalBest.Position;
%画适应度函数图
figure
plot(1:Params.MaxIter,SSA_curve,'Color','r')
title('Objective space')
xlabel('Iteration');
set(gca,'xtick',0:10:Params.MaxIter);
ylabel('Best score obtained so far');
legend('SSA优化VMD')
display(['The best solution obtained by SSA is : ', num2str(round(bestX))]);  %输出最佳位置
display(['The best optimal value of the objective funciton found by SSA is : ', num2str(fMin)]);  %输出最佳适应度值

 然后是SSA的初始化脚本函数(Initialization.m),用于对SSA的粒子进行初始化的

function [particle, GlobalBest,varargout] =  Initialization(Params,CostFunction,name)

nPop = Params.nPop;
VarMin = Params.VarMin;
VarMax = Params.VarMax;
VarSize = Params.VarSize;

%% Initialization
switch name
 
     
    % 麻雀个体    
    case 'SSA'
        
        % 捕食者个体占比
        PredatorRate = 0.5;
        % 警觉者占比
        SDRate = 0.3;
        empty_particle.Position=[];
        empty_particle.Cost=[];

        % 捕食者和加入者
        PredatorNumber = floor(nPop * PredatorRate);
        particle=repmat(empty_particle,nPop ,1);

        % 警觉者
        SDNumber = floor(nPop * SDRate);
        SD = repmat(empty_particle,SDNumber,1);


        GlobalBest.Cost=inf;
        GlobalWorst.Cost = -inf;


        % 初始化
        disp(['***初始化***'])
        for i = 1:nPop
            particle(i).Position = unifrnd(VarMin,VarMax,VarSize);
            particle(i).Cost = CostFunction(particle(i).Position);
            if GlobalBest.Cost > particle(i).Cost
                GlobalBest = particle(i);
            end
            if GlobalWorst.Cost < particle(i).Cost
                GlobalWorst = particle(i);
            end
        end

        % 警觉者初始化
        for i = 1:SDNumber
            SD(i).Position = unifrnd(VarMin,VarMax,VarSize);
            SD(i).Cost = CostFunction(SD(i).Position);   
        end

        % 挑选捕食者和加入者
        [~,index] = sort([particle.Cost]);

        Predator = particle(index(1:PredatorNumber));
        Joiner = particle(index(PredatorNumber+1:end));
        format long;
        disp(['初始化后的最小包络熵为:',num2str(GlobalBest.Cost),',初始化后的最佳参数为:[',num2str(round(GlobalBest.Position)),']'])
        
end 
    

%%  输出
switch name
    case 'SSA'
        varargout{1} = SD;
        varargout{2} = GlobalWorst;
        varargout{3} = Predator;
        varargout{4} = Joiner;
    otherwise
       % varargout{1:4} = []; 
end
end

 接下来是SSA的脚本函数(SSA.m),也是麻雀算法的主体

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

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 = CostFunction(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 = CostFunction(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);
        SD(j).Cost = CostFunction(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(BestCost(i)),',对应最佳参数为:[',num2str(round(GlobalBest.Position)),']'])
   

end
end

最后是适应度函数!(Cost.m),最小包络熵的编写就在此函数中。

function ff = Cost(c)
load 105.mat
X = X105_BA_time(1:2000); %加载西储大学数据的前2000个点
alpha = round(c(1));       % moderate bandwidth constraint:适度的带宽约束/惩罚因子
tau = 0;          % noise-tolerance (no strict fidelity enforcement):噪声容限(没有严格的保真度执行)
K = round(c(2));              % modes:分解的模态数
DC = 0;             % no DC part imposed:无直流部分
init = 1;           % initialize omegas uniformly  :omegas的均匀初始化
tol = 1e-7;     
%--------------- Run actual VMD code:数据进行vmd分解---------------------------
[u, u_hat, omega] = VMD(X, alpha, tau, K, DC, init, tol);
for i = 1:K
	xx= abs(hilbert(u(i,:))); %首先对分解得到的IMF分量进行希尔伯特变换,并求取幅值
	xxx = xx/sum(xx); %
    ssum=0;
    for ii = 1:size(xxx,2)
		bb = xxx(1,ii)*log(xxx(1,ii));  %最小包络熵的计算公式
        ssum=ssum+bb;  %求和运算
    end
    fitness(i,:) = -ssum;   %记着加负号! 也是公式的一部分
end
ff = min(fitness);
end

其中VMD.m本篇文章就不再赘述,需要的小伙伴可以在我的这篇文章中直接粘贴vmd.m程序。(5条消息) VMD分解,matlab代码,包络线,包络谱,中心频率,峭度值,能量熵,近似熵,包络熵,希尔伯特变换,包含所有程序MATLAB代码,-西储大学数据集为例_今天吃饺子的博客-CSDN博客

最后祝愿各位小伙伴,所有代码永不出错! 

觉着不错的给博主留个小赞吧!您的一个小赞就是博主更新的动力!谢谢!

有关麻雀算法SSA,优化VMD,适应度函数为最小包络熵,包含MATLAB源代码,直接复制粘贴!的更多相关文章

  1. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  2. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  3. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  4. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  5. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  6. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  7. c - Ruby - 源代码 - 编码风格 - 2

    查看Ruby代码,它具有以下proc_arity:staticVALUEproc_arity(VALUEself){intarity=rb_proc_arity(self);returnINT2FIX(arity);}更多的是C编码风格问题,但为什么staticVALUE在单独的一行而不是像这样的:staticVALUEproc_arity(VALUEself) 最佳答案 它来自UNIX世界,因为它有助于轻松grep函数的定义:$grep-n'^proc_arity'*.c或使用vim:/^proc_arity

  8. ruby-on-rails - 如何在 Rails 中的不同数据库上执行直接 SQL 代码 - 2

    我正在编写一个Rails应用程序,它将监视某些特定数据库的数据质量。为了做到这一点,我需要能够对这些数据库执行直接SQL查询——这当然与用于驱动Rails应用程序模型的数据库不同。简而言之,这意味着我无法使用通过ActiveRecord基础连接的技巧。我需要连接的数据库在设计时是未知的(即:我不能将它们的详细信息放在database.yaml中)。相反,我有一个模型“database_details”,用户将使用它来输入应用程序将在运行时执行查询的数据库的详细信息。因此与这些数据库的连接实际上是动态的,细节仅在运行时解析。 最佳答案

  9. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  10. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

随机推荐