【智能算法】樽海鞘群算法(SSA)原理及实现

news2024/12/23 6:48:29

在这里插入图片描述

目录

    • 1.背景
    • 2.算法原理
      • 2.1算法思想
      • 2.2算法过程
    • 3.代码实现
    • 4.参考文献


1.背景

2017年,Mirjalili受到樽海鞘集群行为启发,提出了樽海鞘群算法(Salp Swarm Algorithm, SSA)。

2.算法原理

2.1算法思想

在这里插入图片描述

樽海鞘集群是领导者-追随者类型算法,整体以链式行为向食物移动。移动过程中,领导者进行全局探索,而追随者则充分进行局部探索。

2.2算法过程

领导者位置更新
x 1 = { F + c 1 ( ( u b − l b ) c 2 + l b ) c 3 ≥ 0 F − c 1 ( ( u b − l b ) c 2 + l b ) c 3 < 0 x^1=\begin{cases}\quad F+c_1\left(\left(ub-lb\right)c_2+lb\right)&c_3\geq0\\F-c_1\left(\left(ub-lb\right)c_2+lb\right)&c_3<0&\end{cases} x1={F+c1((ublb)c2+lb)Fc1((ublb)c2+lb)c30c3<0
其中, x 1 , F x^1,F x1,F分别代表领导者位置和食物位置。参数 c 1 c_1 c1在算法中起到平衡全局探索和局部开发作用:
c 1 = 2 e − ( 4 l L ) 2 c_1=2e^{-\left(\frac{4l}L\right)^2} c1=2e(L4l)2
参数 c 2 , c 3 c_2,c_3 c2,c3为[0,1]随机数,其实是为了增强随机性。
追随者位置更新
由Newton运动定律,樽海鞘应满足:
x i = 1 2 a t 2 + ν 0 t x^i=\frac12at^2+\nu_0t xi=21at2+ν0t
由于迭代次数是离散的,考虑到 ν 0 = 0 \nu_0=0 ν0=0,因此可表述为:
x i = 1 2 ( x i + x i − 1 ) x^{i}=\frac{1}{2}\big(x^{i}+x^{i-1}\big) xi=21(xi+xi1)
🤣这里感觉有点问题:
a = d v d t v = d x d t a=\frac{dv}{dt} \\ v=\frac{dx}{dt} a=dtdvv=dtdx
t t t是离散且间隔为1时,此时 a = v 2 − v 1 , v 2 = x 2 − x 1 a=v_2-v_1,v2=x_2-x_1 a=v2v1,v2=x2x1,进一步有 a = x 2 − 2 x 1 + x 0 a=x_2-2x_1+x_0 a=x22x1+x0
伪代码
在这里插入图片描述

3.代码实现

% 樽海鞘群优化算法
function [Best_pos, Best_fitness, Iter_curve, History_pos, History_best] = SSA(pop, maxIter, lb, ub, dim,fobj)
%input
%pop 种群数量
%dim 问题维数
%ub 变量上边界
%lb 变量下边界
%fobj 适应度函数
%maxIter 最大迭代次数
%output
%Best_pos 最优位置
%Best_fitness 最优适应度值
%Iter_curve 每代最优适应度值
%History_pos 每代种群位置
%History_best 每代最优个体位置
%% 初始化种群
for i=1:dim
    SalpPositions(:,i) = lb(i)+rand(pop,1).*(ub(i) - lb(i));                          % Initial population
end
if size(ub,2)==1
    ub=ones(dim,1)*ub;
    lb=ones(dim,1)*lb;
else
    ub=ub';
    lb=lb';
end
%% 记录
Iter_curve = zeros(1,maxIter);
Best_pos=zeros(1,dim);
Best_fitness=inf;
%% 计算适应度
for i=1:size(SalpPositions,1)
    SalpFitness(1,i)=fobj(SalpPositions(i,:));
end
%% 记录
[sorted_salps_fitness,sorted_indexes]=sort(SalpFitness);
for newindex=1:pop
    Sorted_salps(newindex,:)=SalpPositions(sorted_indexes(newindex),:);
end

Best_pos=Sorted_salps(1,:);
Best_fitness=sorted_salps_fitness(1);

%% 迭代
l=2; 
while l<maxIter+1
    
    c1 = 2*exp(-(4*l/maxIter)^2); % Eq. (3.2)
    
    for i=1:size(SalpPositions,1)
        
        SalpPositions= SalpPositions';
        
        if i<=pop/2
            for j=1:1:dim
                c2=rand();
                c3=rand();
                % Eq. (3.1)
                if c3<0.5 
                    SalpPositions(j,i)=Best_pos(j)+c1*((ub(j)-lb(j))*c2+lb(j));
                else
                    SalpPositions(j,i)=Best_pos(j)-c1*((ub(j)-lb(j))*c2+lb(j));
                end
            end
            
        elseif i>pop/2 && i<pop+1
            point1=SalpPositions(:,i-1);
            point2=SalpPositions(:,i);
            
            SalpPositions(:,i)=(point2+point1)/2; % % Eq. (3.4) in the paper
        end
        
        SalpPositions= SalpPositions';
    end
    
    for i=1:size(SalpPositions,1)
        
        Tp=SalpPositions(i,:)>ub';Tm=SalpPositions(i,:)<lb';
        SalpPositions(i,:)=(SalpPositions(i,:).*(~(Tp+Tm)))+ub'.*Tp+lb'.*Tm;
        
        SalpFitness(1,i)=fobj(SalpPositions(i,:));
        
        if SalpFitness(1,i)<Best_fitness
            Best_pos=SalpPositions(i,:);
            Best_fitness=SalpFitness(1,i);
            
        end
    end
    
    Iter_curve(l)=Best_fitness;
    History_pos{l} = SalpPositions;
    History_best{l} = Best_pos;
    l = l + 1;
end
end

在这里插入图片描述

4.参考文献

[1] Mirjalili S, Gandomi A H, Mirjalili S Z, et al. Salp Swarm Algorithm: A bio-inspired optimizer for engineering design problems[J]. Advances in engineering software, 2017, 114: 163-191.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的“医院信管系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“医院信管系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 功能结构图 系统首页界面图 用户注册界面图 医生…

CANopen转Profinet网关连接西门子PLC与变流器通讯

CANopen转Profinet网关&#xff08;XD-COPNm20&#xff09;在智能领域&#xff0c;变流器的应用非常广泛&#xff0c;变流器一般会采用CANopen协议。现场采用台达的变流器&#xff08;支持CANopen协议&#xff09;作为CANopen从站&#xff0c;S7-1500系列PLC做主站&#xff0c;…

软件设计不是CRUD(14):低耦合模块设计理论——行为抽象与设计模式(上)

是不是看到“设计模式”四个字,各位读者就觉得后续内容要开始讲一些假大空的内容了?各位读者是不是有这样的感受,就是单纯讲设计模式的内容,网络上能找到很多资料,但是看过这些资料后读者很难将设计模式运用到实际的工作中。甚至出现了一种声音:设计模式是没有用的,应用…

Python安装第三方库

前言&#xff1a;大部分时候我们都是使用pip install去安装一些第三方库&#xff0c;但是偶尔也会有部分库无法安装&#xff08;最典型的就是dlib这个库&#xff09;&#xff0c;需要采取别的方法解决&#xff0c;这里做笔记记录一下。 使用国内镜像源安装 因为pypi的服务器在…

Java后端八股文之Redis

文章目录 1. Redis是什么&#xff1f;2. Redis为什么这么快&#xff1f;3. 为什么要使用缓存&#xff1f;4. Redis几种使用场景&#xff1a;5. Redis的Zset底层为什么要使用跳表而不是平衡树、红黑树或者B树&#xff1f;6.Redis持久化6.1 什么是RDB持久化6.1.1RDB创建快照会阻塞…

大数据开发-FLUME安装部署与实战案例

文章目录 前言安装部署配置修改案例:采集文件内容上传至HDFS案例:采集网站日志上传HDFS前言 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简…

es 查询案例分析

场景描述&#xff1a; 有这样一种场景&#xff0c;比如我们想搜索 title&#xff1a;Brown fox body&#xff1a;Brown fox 文章索引中有两条数据&#xff0c;兔子和狐狸两条数据 PUT /blogs/_bulk {"index": {"_id": 1}} {"title": "…

Oracle Primavera P6 数据库升级

前言 为了模拟各种P6测试&#xff0c;我常常会安装各种不同版本的p6系统&#xff0c;无论是P6服务&#xff0c;亦或是P6客户端工具Professional&#xff0c;在今天操作p6使用时&#xff0c;无意识到安装在本地的P6 数据库&#xff08;21.12&#xff09;出现了与Professional软…

对于stm32中printf函数的移植方法

一、准备工作 使用printf之前需要先打开工程选项&#xff0c;把use microLIB选项打开。microlib是keil为嵌入式平台优化的一个精简库&#xff0c;本文使用到的printf将会用到这个microlib。 二、对printf进行重定向 将printf打印的东西输出到串口&#xff0c;由于printf默认输…

关于分布式分片,你该知道的事儿

关于分布式分片&#xff0c;你该知道的事儿 前言一、关于分片方式的那些事儿1.1 按照Hash划分1.2 按照区间范围划分1.3 按照数据量划分1.4 来些例子1.4.1 Redis的分片划分1.4.2 Mongo的分片划分 二、关于分区再平衡的那些事儿2.1 基于固定分片数量2.2 基于动态分片数量2.3 基于…

让生活更加精致的APP?

晚上好&#xff0c;今天博主来介绍几款帮助你条理生活的APP&#xff0c;让你的生活更加精致&#xff0c;充满仪式感。 一&#xff0e;格志日记 一款以“格子”的方式记录日记的APP&#xff0c;非常简单明了&#xff0c;用户可以依据自己的喜好&#xff0c;来自由定义或者删除格…

初阶数据结构之---堆的应用(堆排序和topk问题)

引言 上篇博客讲到了堆是什么&#xff0c;以及堆的基本创建和实现&#xff0c;这次我们再来对堆这个数据结构更进一步的深入&#xff0c;将讲到的内容包括&#xff1a;向下调整建堆&#xff0c;建堆的复杂度计算&#xff0c;堆排序和topk问题。话不多说&#xff0c;开启我们今…

Python面向对象——程序架构

需求 创建图形管理器 -记录多种图形(圆形、矩形.) --提供计算总面积的方法&#xff0c; 要求:增加新图形&#xff0c;不影响图形管理器 测试: 创建图形管理器&#xff0c;存储多个图形对象。 通过图形管理器&#xff0c;调用计算总面积方法 思路 ​​​​​​​ 代码 # ------…

C# SM2加解密 ——国密SM2算法

SM2 是国家密码管理局组织制定并提出的椭圆曲线密码算法标准。 本文使用第三方密码库 BouncyCastle 实现 SM2 加解密&#xff0c;使用 NuGet 安装即可&#xff0c;包名&#xff1a;Portable.BouncyCastle&#xff0c;目前最新版本为&#xff1a;1.9.0。 using Org.BouncyCastl…

SpringBoot中MD5使用

SpringBoot中MD5使用 新建md5类 public final class MD5 {public static String encrypt(String strSrc) {try {char[] hexChars {0, 1, 2, 3, 4, 5, 6, 7, 8,9, a, b, c, d, e, f};byte[] bytes strSrc.getBytes();MessageDigest md MessageDigest.getInstance("MD5…

设计模式前置了解uml图

在开发前&#xff0c;会进行系统的设计&#xff0c;而数据模型的设计大多通过 UML 类图实现。为了在 UML 类图中清晰地表达类之间的关系&#xff0c;需要对类之间的关系有一定的认识&#xff0c;并且了解相关的表达符号。 类之间的关系有以下几种&#xff1a; 组合 聚合 关联…

IPC:管道

一、管道的概念 1.原理 在进程3G~4G的内核空间中&#xff0c;创建一个特殊的文件&#xff08;管道&#xff09;&#xff0c;管道的数据直接保存在内存中。 2.特性 1&#xff09;管道可以看成是一个特殊的文件&#xff0c;一般的文件存储在外存中&#xff0c;而管道内容是存储…

“光谱视界革新:ChatGPT在成像光谱遥感中的智能革命“

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能…

docker——启动各种服务

1.Mysql 2.Redis 3.nginx 4.ES 注意&#xff1a;ES7之后环境为 -e ELASTICSEARCH_HOSTS http://ip地址:9200

双场板功率型GaN HEMT中用于精确开关行为的电容建模

来源:Capacitance Modeling in Dual Field-Plate Power GaN HEMT for Accurate Switching Behavior (TED 16年) 摘要 本文提出了一种基于表面电势的紧凑模型&#xff0c;用于描述具有栅极和源极场板&#xff08;FP&#xff09;结构的AlGaN/GaN高电子迁移率晶体管&#xff08;…