(含源码)麻雀搜索算法(SSA)的原理和matlab实现

这篇具有很好参考价值的文章主要介绍了(含源码)麻雀搜索算法(SSA)的原理和matlab实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、算法原理

研究表明,圈养的麻雀存在两种不同类型:发现者和加入者。发现者在种群中负责寻找食物并为整个麻雀种群提供觅食区域和方向,而加入者则是利用发现者来获取食物。在生活中我们仔细观察会发现,当群体中有麻雀发现周围有捕食者时,此时群体中一个或多个个体会发出啁啾声,一旦发出这样的声音整个种群就会立即躲避危险,进而飞到其它的安全区域进行觅食。这样的麻雀被称为警觉者。

麻雀搜索算法就是利用麻雀的这种生物特性进行迭代寻优的优化算法。

(含源码)麻雀搜索算法(SSA)的原理和matlab实现

(含源码)麻雀搜索算法(SSA)的原理和matlab实现

(含源码)麻雀搜索算法(SSA)的原理和matlab实现

(含源码)麻雀搜索算法(SSA)的原理和matlab实现 警觉者的位置更新策略如下:

(含源码)麻雀搜索算法(SSA)的原理和matlab实现

二、测试函数

 1.Sphere函数

(含源码)麻雀搜索算法(SSA)的原理和matlab实现

 其中x的取值范围为[-5.12,5.12],最优解在[0 0...0]处取得,最优值为0。

function fitness=Sphere(pop)
    %取值范围[-5.12,5.12],最优解在[0 0...0]处取得,最优值为0
    fitness=sum(pop.^2);
end

 2.Griewank函数

(含源码)麻雀搜索算法(SSA)的原理和matlab实现

 其中,x的取值范围在[-600,600],最优解在[0 0...0]处取得,最优值为0。

function fitness=Griewank(pop)
    %取值范围[-600,600],最优解在[0 0...0]处取得,最优值为0
    fitness=sum(pop.^2)/4000-prod(cos(pop)./sqrt(1:length(pop)))+1;
end

3.Rosenbrock函数

(含源码)麻雀搜索算法(SSA)的原理和matlab实现

其中x的取值范围[-5,10],最优解在[1 1...1]处取得,最优值为0。

function fitness=Rosenbrock(pop)
    %取值范围[-5,10],最优解在[1 1...1]处取得,最优值为0
    fitness=sum((pop(1:end-1).^2-pop(2:end)).^2+(pop(1:end-1)-1).^2);
end

 4.Ackley函数

(含源码)麻雀搜索算法(SSA)的原理和matlab实现

 其中x的取值范围在[-15,30],最优解在[0 0...0]处取得,最优值为0。原文中有个笔误,没有列出c的取值,c=20。

function fitness=Ackley(pop)
    %取值范围[-15,30],最优解在[0 0...0]处取得,最优值为0
    a=-0.2*sqrt(mean(pop.^2));
    b=mean(cos(20*pop));
    fitness=20+exp(1)-20*exp(a)-exp(b);
end

5.Rastrign函数

(含源码)麻雀搜索算法(SSA)的原理和matlab实现

 其中x的取值范围在[-5.12,5.12],最优解在[0 0...0]处取得,最优值为0。

function fitness=Rastrign(pop)
    %取值范围[-5.12,5.12],最优解在[0 0...0]处取得,最优值为0
    fitness=sum(pop.^2-10*cos(2*pi*pop)+10);
end

三、matlab部分代码

%% 清理内存空间
clc
clear
close all
%% 麻雀参数的设定
index1=input('请选择测试函数:1-Sphere,2-Griewank,3-Rosenbrock,4-Ackley,5-Rastrign');
pop_num=200;%麻雀数量
dim=2;%问题的维度/决策变量的个数
[x_min,x_max]=set_pop(index1,dim);%设置粒子位置,速度的上下限
fitness=zeros(1,pop_num);%各麻雀的适应度函数值
%% 算法参数的设定
ST=0.8;%设定安全阈值
PD_num=0.2*pop_num;%发现者数量
SD_num=0.1*pop_num;%警觉者数量
it_max=50;%最大迭代次数
it=1;
%% 初始化种群
x=(x_max-x_min).*rand(pop_num,dim)+x_min;%随机初始化麻雀位置
x_worst=zeros(dim,it_max);%全局最差的位置
x_best=zeros(dim,it_max);%全局最优的位置
Xp=zeros(dim,it_max);%发现者占据的最优位置
fitness_worst=-inf;%全局最差的适应度值
fitness_best=inf;%全局最优的适应度值
history=zeros(1,it_max);%历史最优适应度值
%% 初始化担任警觉者的麻雀
perm=randperm(pop_num);
SD=perm(1:SD_num);
%% 迭代求最优解
while it<=it_max
    更新种群
    it=it+1;
end
figure(2)
plot(1:it_max,history)
xlabel('迭代次数')
ylabel('最优适应度函数')

四、测试结果

假设各个函数都是二维的,就可以用将麻雀的位置用平面坐标表示出来,进一步可以用图形直观的显示麻雀搜索算法的迭代情况,因为在迭代后期(也就是迭代次数大于总迭代次数一半时),适应度较低的加入者会执行随机搜索策略,以避免陷入局部最优,因此并不是所有的麻雀都会跑到最优位置。五个测试函数的迭代情况分别如下:

 1.Sphere函数

(含源码)麻雀搜索算法(SSA)的原理和matlab实现

 2.Griewank函数

(含源码)麻雀搜索算法(SSA)的原理和matlab实现

3.Rosenbrock函数

(含源码)麻雀搜索算法(SSA)的原理和matlab实现

 4.Ackley函数

(含源码)麻雀搜索算法(SSA)的原理和matlab实现

5.Rastrign函数

 (含源码)麻雀搜索算法(SSA)的原理和matlab实现

结果表明,针对上面五个测试函数,采用麻雀搜索算法可以迭代求得最优解。

完整代码可以戳这里获取:

麻雀搜索算法(SSA)的原理和matlab实现文章来源地址https://www.toymoban.com/news/detail-412801.html

到了这里,关于(含源码)麻雀搜索算法(SSA)的原理和matlab实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包