基于MATLAB的麻雀搜索算法實戰

    今天給大家分享麻雀搜索算法的代碼實戰,本次分享主要從算法原理和代碼實戰展開。需要了解更多算法代碼的,可以點擊文章左下角的閱讀全文,進行獲取哦~需要了解智能算法、機器學習、深度學習和信號處理相關理論的可以后臺私信哦,下一期分享的內容就是你想了解的內容~

   一、算法原理

    麻雀搜索算法(Sparrow Search Algorithm, SSA)。該算法由東華大學的Xue和Shen于2020年提出,該算法通過模擬麻雀種群覓食的行為,在種群中設定發現者、加入者、偵察者 3種身份的個體,通過疊加偵查預警機制,迭代更新群體覓食位置,以獲得全局最優的覓食資源,從而獲得參數的最優解。具有較高的全局尋優和求解能力。麻雀搜索算法的偽代碼如下:

基于MATLAB的麻雀搜索算法實戰的圖1

        麻雀搜索算法的算法流程圖如下圖所示:

基于MATLAB的麻雀搜索算法實戰的圖2

二、代碼實戰

        以SSA優化DBN手寫數字集分類為例

%%主函數

%

clc;

clear;

close all;

addpath('D:\學習資料\DBN11\SSA2')%%記得更換路徑

addpath('D:\學習資料\DBN11\DBN')

load mnist_uint8;

 

train_x = double(train_x) / 255;

test_x  = double(test_x)  / 255;

train_y = double(train_y);

test_y  = double(test_y);

% [train_x,train_y,test_x,test_y,RealTrainYlabel,RealTestLabel] = TrainTestSplit(0.8);

%

[Params,CostFunction] = ParameterDefinition(train_x,train_y);

% %% SSA

[particle, GlobalBest,SD,GlobalWorst,Predator,Joiner] =  Initialization(Params,CostFunction,'SSA');

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

%%SSA函數

function [particle,GlobalBest] =  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 = 3;

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(GlobalBest.Cost)])

end

%% Results

figure;

%plot(BestCost,'LineWidth',2);

semilogy(BestCost,'LineWidth',2);

xlabel('Iteration');

ylabel('Best Cost');

grid on;

end

實驗結果:

基于MATLAB的麻雀搜索算法實戰的圖3
基于MATLAB的麻雀搜索算法實戰的圖4

    完整代碼后臺回復獲取哦

    部分知識來源于網絡,如有侵權請聯系作者刪除~

    今天的分享就到這里了,后續想了解智能算法、機器學習、深度學習和信號處理相關理論的可以后臺私信哦~希望大家多多轉發點贊加收藏,你們的支持就是我源源不斷的創作動力!

作 者 | 華 夏

編 輯 | 華 夏

校 對 | 華 夏

文章來源:matlab學習之家

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1