基于MATLAB的麻雀搜索算法實戰
今天給大家分享麻雀搜索算法的代碼實戰,本次分享主要從算法原理和代碼實戰展開。需要了解更多算法代碼的,可以點擊文章左下角的閱讀全文,進行獲取哦~需要了解智能算法、機器學習、深度學習和信號處理相關理論的可以后臺私信哦,下一期分享的內容就是你想了解的內容~
一、算法原理
麻雀搜索算法(Sparrow Search Algorithm, SSA)。該算法由東華大學的Xue和Shen于2020年提出,該算法通過模擬麻雀種群覓食的行為,在種群中設定發現者、加入者、偵察者 3種身份的個體,通過疊加偵查預警機制,迭代更新群體覓食位置,以獲得全局最優的覓食資源,從而獲得參數的最優解。具有較高的全局尋優和求解能力。麻雀搜索算法的偽代碼如下:
麻雀搜索算法的算法流程圖如下圖所示:
二、代碼實戰
以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學習之家
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















