群体智能优化算法-旗鱼优化算法 (Sailfish Optimizer, SFO,含Matlab源代码)

摘要

旗鱼优化算法(Sailfish Optimizer, SFO)是一种模拟旗鱼(Sailfish)和沙丁鱼(Sardine)之间捕食关系的新型元启发式算法。通过在搜索过程中模拟旗鱼对沙丁鱼的捕食行为,以及沙丁鱼群的逃逸与防御机制,SFO 平衡了全局探索局部开发,在处理复杂优化问题时具有良好的收敛性能。本文提供了 SFO 的核心思路并提供了完整 MATLAB 代码及详细中文注释,以帮助读者快速理解并应用该算法。

1. 算法介绍

1.1 旗鱼优化算法 (SFO) 的灵感与思路

  1. 旗鱼(Sailfish)
    • 旗鱼是一种速度极快的海洋捕食者,能迅速发起攻击并精准捕获猎物。算法中,旗鱼对应较小规模但具有高“适应度”的个体。
  2. 沙丁鱼(Sardine)
    • 沙丁鱼以群居方式求生,彼此密集形成群体逃离策略,以降低被捕风险。算法中,沙丁鱼则对应数量更多、且在后期可能被旗鱼“替换”以模拟被捕食的场景。
  3. 捕食关系与进化
    • 当旗鱼捕获沙丁鱼之后,会将其从沙丁鱼种群中移除,同时旗鱼种群可能获得“更优基因”(即更新位置)。
    • 此过程在搜索过程中不断迭代,使得种群在全局和局部中进行动态平衡,帮助跳出局部最优并逐渐收敛。

1.2 算法主要步骤

  1. 初始化:随机生成一定数量的旗鱼个体(NSF)与沙丁鱼个体(NF),计算它们在搜索空间中的适应度。
  2. 最优个体识别:在旗鱼与沙丁鱼种群中分别找出其当前最优解(旗鱼最优沙丁鱼最优)。
  3. 更新
    • 旗鱼更新:根据最优旗鱼与最优沙丁鱼位置,引入随机扰动来移动旗鱼个体。
    • 沙丁鱼更新:按照一定几率对沙丁鱼进行“方向调整”,并在后期迭代中可能被旗鱼捕获而移除。
  4. 捕食机制:若旗鱼个体适应度较差并随机选中,则其位置可能被“受伤沙丁鱼”所替代,同时沙丁鱼群规模减少。
  5. 终止条件:迭代最大次数或到达可接受收敛标准,输出全局最优解(旗鱼种群的最优)。

2. 完整 MATLAB 代码及详细中文注释

下面是 SFO(旗鱼优化算法)的完整 MATLAB 源码:

function [Fbest_SF,x_eliteSF,HisBestFit] = SFO(npop, MaxIt, lb, ub, dim, fobj)
% SFO 主函数
% 输入参数:
%   npop   :旗鱼数量 (Sailfish)
%   MaxIt  :最大迭代次数
%   lb, ub :搜索空间下界与上界(可为标量或向量)
%   dim    :问题维度
%   fobj   :目标函数句柄
%
% 输出参数:
%   Fbest_SF   :最终找到的最优旗鱼适应度值
%   x_eliteSF  :对应的最优旗鱼位置
%   HisBestFit :每次迭代记录的旗鱼最优适应度历史%% ------------------- 人工参数定义 ---------------------%%
NSF = npop;          % Number of Sailfish (旗鱼数量)
NF = 2*npop;         % Number of Sardine (沙丁鱼数量 = 旗鱼的2倍)
NF_rest = NF;        % 当前剩余沙丁鱼数量% 初始化种群空间
x_SF = zeros(NSF, dim);   % 旗鱼位置
x_F  = zeros(NF, dim);    % 沙丁鱼位置% 若 lb, ub 为标量,则扩展为向量
if length(lb)==1lb = lb*ones(1,dim);ub = ub*ones(1,dim);
end%% ------------------- 1. 种群初始化 ------------------ %%
for i = 1:dimx_SF(:,i) = lb(i) + (ub(i)-lb(i)).*rand(NSF,1);  % 随机分布x_F(:,i)  = lb(i) + (ub(i)-lb(i)).*rand(NF,1);
end% 计算初始适应度
for j = 1:NSFFitness_SF(j) = fobj(x_SF(j,:)); % 旗鱼适应度
end
for j = 1:NFFitness_F(j) = fobj(x_F(j,:));   % 沙丁鱼适应度
end% 找到旗鱼与沙丁鱼最优解
[Fbest_SF, eliteSF] = min(Fitness_SF);  % 最优旗鱼适应度 & 下标
[Fbest_F, injuredS] = min(Fitness_F);   % 最优沙丁鱼适应度 & 下标x_eliteSF = x_SF(eliteSF,:);   % 最优旗鱼位置
x_injuredS= x_F(injuredS,:);   % 最优沙丁鱼位置% 参数设置
PD = 2/3;       % prey density (沙丁鱼密度)
ks = 0.5/MaxIt; % 用于衰减的系数%% ------------------- 2. 主循环迭代 ------------------ %%
for it = 1:MaxIt% A 用于控制收敛系数, A 随迭代线性衰减A = 4*(1 - it/MaxIt);% AP 为进一步衰减AP = A*(1 - (2*it*ks));%----------- 2.1 更新所有旗鱼的位置 --------------%for ii=1:NSFlamda = 2*rand*PD - PD; % x_SF(ii,:) = x_eliteSF - lamda*(rand*0.5*(x_eliteSF+x_injuredS)- x_SF(ii,:));% 旗鱼向(最优旗鱼 & 最优沙丁鱼)之间的位置靠近,同时加入随机扰动 lamdax_SF(ii,:) = x_eliteSF - lamda*( rand*0.5*(x_eliteSF + x_injuredS) - x_SF(ii,:) );end%----------- 2.2 更新沙丁鱼位置 --------------%% alpha=ceil(AP*NF_rest) and beta=ceil(AP*dim)alpha = ceil(AP * NF_rest);  % 选取沙丁鱼群中 alpha 个beta  = ceil(AP * dim);      % 选取维度的数量for jj=1:NF_restif AP < 0.5% 当 AP < 0.5时sizepop_value = randperm((NF_rest-alpha+1), alpha) + alpha -1;D_value       = randperm((dim-beta+1), beta)+ beta -1;for kk=1:dimif ismember(jj,sizepop_value) && ismember(kk,D_value)x_F(jj,kk) = rand*( x_eliteSF(kk) - x_F(jj,kk) + AP );endendx_F(jj,:) = rand*(x_eliteSF - x_F(jj,:) + AP);else% 当 AP >= 0.5x_F(jj,:) = rand*(x_eliteSF - x_F(jj,:) + AP);endend%----------- 2.3 边界处理 --------------%for k=1:dim% 旗鱼的越界处理Flag4ub = x_SF(:,k) > ub(k);Flag4lb = x_SF(:,k) < lb(k);x_SF(:,k) = ( x_SF(:,k).*(~(Flag4ub + Flag4lb)) ) + ub(k).*Flag4ub + lb(k).*Flag4lb;% 沙丁鱼的越界处理Flag4ub = x_F(:,k) > ub(k);Flag4lb = x_F(:,k) < lb(k);x_F(:,k) = ( x_F(:,k).*(~(Flag4ub + Flag4lb)) ) + ub(k).*Flag4ub + lb(k).*Flag4lb;end%----------- 2.4 重新计算旗鱼和沙丁鱼的适应度 --------------%for i=1:NSFFitness_SF(i) = fobj(x_SF(i,:));endfor j=1:NF_restFitness_F(j)  = fobj(x_F(j,:));end% 找到当前最优旗鱼, 最优沙丁鱼[fbest_SF, eliteSF] = min(Fitness_SF);[fbest_F, injuredS] = min(Fitness_F);% 如果发现更优旗鱼则更新全局最优if fbest_SF < Fbest_SFFbest_SF = fbest_SF;x_eliteSF= x_SF(eliteSF,:);end% 如果发现更优沙丁鱼if fbest_F < Fbest_FFbest_F = fbest_F;x_injuredS = x_F(injuredS,:);end%----------- 2.5 捕食过程:将某个旗鱼替换为受伤沙丁鱼 --------------%replace_num_SF = ceil(rand * NSF); if Fitness_SF(replace_num_SF) > fbest_F% 选中的旗鱼若适应度比最优沙丁鱼差,则被沙丁鱼替换x_SF(replace_num_SF,:) = x_F(injuredS,:);Fitness_SF(replace_num_SF)= fbest_F;% 从沙丁鱼群移除该受伤(最优)沙丁鱼x_F(injuredS,:)=[];Fitness_F(injuredS)=[];NF_rest = NF_rest - 1;  % 沙丁鱼减少一条end%----------- 2.6 记录历史最优适应度 --------------%HisBestFit(it) = Fbest_SF;
end
end

3. 小结

旗鱼优化算法(SFO)通过模拟旗鱼和沙丁鱼的捕食与被捕关系,在搜索过程中动态减少沙丁鱼个体,并由旗鱼种群吸收最优沙丁鱼的优势“基因”。其交互更新越界处理以及个体替换等机制,可在高维非线性问题中展现出良好的搜索性能。本文提供了SFO的完整实现详细注释,为读者在实际应用或学术研究中提供参考并便于进一步改进与扩展。

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

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

相关文章

【C语言】编译和链接详解

hi&#xff0c;各位&#xff0c;让我们开启今日份博客~ 小编个人主页点这里~ 目录 一、翻译环境和运行环境1、翻译环境1.1预处理&#xff08;预编译&#xff09;1.2编译1.2.1词法分析1.2.2语法分析1.2.3语义分析 1.3汇编1.4链接 2.运行环境 一、翻译环境和运行环境 在ANSI C…

VIC模型率定验证

在气候变化问题日益严重的今天&#xff0c;水文模型在防洪规划&#xff0c;未来预测等方面发挥着不可替代的重要作用。目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&am…

【AWS入门】AWS云计算简介

【AWS入门】AWS云计算简介 A Brief Introduction to AWS Cloud Computing By JacksonML 什么是云计算&#xff1f;云计算能干什么&#xff1f;我们如何利用云计算&#xff1f;云计算如何实现&#xff1f; 带着一系列问题&#xff0c;我将做一个普通布道者&#xff0c;引领广…

Flutter_学习记录_ ImagePicker拍照、录制视频、相册选择照片和视频、上传文件

插件地址&#xff1a;https://pub.dev/packages/image_picker 添加插件 添加配置 android无需配置开箱即用&#xff0c;ios还需要配置info.plist <key>NSPhotoLibraryUsageDescription</key> <string>应用需要访问相册读取文件</string> <key>N…

蓝桥与力扣刷题(蓝桥 星期计算)

题目&#xff1a;已知今天是星期六&#xff0c;请问 20^22 天后是星期几? 注意用数字 1 到 7 表示星期一到星期日。 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 解题思路&#xff0b;代码&#xff1a; 代码&#xff1…

向量数据库原理及选型

向量数据库 什么是向量什么是向量数据库原理应用场景 向量数据库的选型主流向量数据库介绍向量数据库对比主流向量数据库对比表 选型建议 什么是向量 向量是一组有序的数值&#xff0c;表示在多维空间中的位置或方向。向量通常用一个列或行的数字集合来表示&#xff0c;这些数…

以实现生产制造、科技研发、人居生活等一种或多种复合功能的智慧油站开源了

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用…

小程序网络大文件缓存方案

分享一个小程序网络大图加载慢的解决方案 用到的相关api getSavedFileList 获取已保存的文件列表&#xff1b;getStorageSync 获取本地缓存&#xff1b;downloadFile 下载网络图片&#xff1b;saveFile 保存文件到本地&#xff1b;setStorage 将数据储存到小程序本地缓存&…

软考系统架构师 — 3 操作系统

目录 3.1 考点分析 3.1 操作系统概述 3.1.1 操作系统的功能 3.1.2 操作系统的分类 3.1.3 嵌入式操作系统主要特点 3.2 进程 3.2.1 进程的组成和状态 3.2.2 前趋图与进程资源图&#xff08;重点&#xff09; 3.2.3 进程同步与互斥 3.2.4 进程调度 3.2.5 死锁 3.3 线…

PE,ELF,COFF

本文来自 (1)腾讯元宝 (2)程序员的自我修养 PE&#xff08;Portable Executable&#xff09;是一种文件格式&#xff0c;主要用于Windows操作系统中的可执行文件&#xff08;如.exe、.dll、.sys等&#xff09;。PE格式是Windows操作系统中标准的可执行文件格式&#xff0c;由…

MySQL 在 CentOS 7 上安装的步骤指南

目录 1. 卸载不需要的环境 2. 获取 MySQL YUM 仓库 3. 安装 MySQL 4. 启动 MySQL 服务 5. 获取临时 Root 密码 6. 登录 MySQL 7. 更改 Root 密码 8. 设置 MySQL 开机自启动 9. 配置 MySQL 编码 10. 重启 MySQL 配置生效 11. 常见问题解决 1. 卸载不需要的环境 如果…

C++初阶——类和对象(三) 构造函数、析构函数

C初阶——类和对象&#xff08;三&#xff09; 上期内容&#xff0c;我们围绕类对象模型的大小计算&#xff0c;成员存储方式&#xff0c;this指针&#xff0c;以及C实现栈和C语言的比较&#xff0c;进一步认识了C的封装特性。本期内容&#xff0c;我们开始介绍类的默认成员函…

【NLP】 5. Word Analogy Task(词类比任务)与 Intrinsic Metric(内在度量)

Word Analogy Task&#xff08;词类比任务&#xff09; 定义&#xff1a;Word Analogy Task 是用于评估词向量质量的内在指标&#xff08;Intrinsic Metric&#xff09;。该任务基于这样的假设&#xff1a;如果词向量能够捕捉单词之间的语义关系&#xff0c;那么这些关系应该能…

矩阵幂(矩阵k次幂)

矩阵幂 #include<stdio.h> //矩阵乘法 void cf(int a[20][20],int b[20][20],int result[20][20],int n){for(int i0;i<n;i){for(int j0;j<n;j){result[i][j]0;for(int k0;k<n;k){result[i][j]a[i][k]*b[k][j];}}} }void print(int a[20][20],int n){for(int…

信火一体作战模式运用特点分析及对一体化防空反导能力建设的启示

文章目录 内容摘要1. 引言2. 信火一体作战模式在现代战争中的新内涵和特征2.1 充当火力和信息要素的作战单元种类更加丰富2.2 信息利用更加凸显异构平台间的数据共享和情报融合2.3 作战环节上更加强调指挥决策的敏捷性和智能化3. 增强防空反导能力的举措建议3.1 强化各类作战单…

样本是怎么估计总体的

样本是怎么估计总体的 flyfish 1. 什么是样本估计总体&#xff1f; 样本估计总体是指通过样本数据&#xff08;例如100人的身高&#xff09;推断总体参数&#xff08;例如全国人口的平均身高&#xff09;。核心方法包括&#xff1a; 点估计&#xff1a;用样本统计量直接估计…

自己动手打造AI Agent:基于DeepSeek-R1+websearch从零构建自己的Manus深度探索智能体AI-Research

第一章&#xff1a;AI Agent基础与DeepSeek-R1架构解析&#xff08;1/10&#xff09; 1.1 AI Agent技术演进与核心价值 人工智能代理&#xff08;AI Agent&#xff09;经历了从规则驱动到数据驱动的范式转移。早期基于专家系统的符号主义方法&#xff08;如MYCIN医疗诊断系统…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_13可展开行的固定表头表格

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_13可展开行的固…

Gemini Robotics:将人工智能带入物理世界

25年3月来自谷歌的技术报告“Gemini Robotics: Bringing AI into the Physical World”。 大型多模态模型的最新进展&#xff0c;已使数字领域出现卓越的通才能力&#xff0c;但将其转化为机器人等物理智体仍然是一项重大挑战。一般有用的机器人需要能够理解周围的物理世界&am…