IT评测·应用市场-qidao123.com

标题: 群体智能优化算法-旗鱼优化算法 (Sailfish Optimizer, SFO,含Matlab源代码 [打印本页]

作者: 大号在练葵花宝典    时间: 2025-3-17 21:37
标题: 群体智能优化算法-旗鱼优化算法 (Sailfish Optimizer, SFO,含Matlab源代码
择要

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

1. 算法介绍

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

1.2 算法主要步骤


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

下面是 SFO(旗鱼优化算法)的完备 MATLAB 源码:
  1. function [Fbest_SF,x_eliteSF,HisBestFit] = SFO(npop, MaxIt, lb, ub, dim, fobj)
  2. % SFO 主函数
  3. % 输入参数:
  4. %   npop   :旗鱼数量 (Sailfish)
  5. %   MaxIt  :最大迭代次数
  6. %   lb, ub :搜索空间下界与上界(可为标量或向量)
  7. %   dim    :问题维度
  8. %   fobj   :目标函数句柄
  9. %
  10. % 输出参数:
  11. %   Fbest_SF   :最终找到的最优旗鱼适应度值
  12. %   x_eliteSF  :对应的最优旗鱼位置
  13. %   HisBestFit :每次迭代记录的旗鱼最优适应度历史
  14. %% ------------------- 人工参数定义 ---------------------%%
  15. NSF = npop;          % Number of Sailfish (旗鱼数量)
  16. NF = 2*npop;         % Number of Sardine (沙丁鱼数量 = 旗鱼的2倍)
  17. NF_rest = NF;        % 当前剩余沙丁鱼数量
  18. % 初始化种群空间
  19. x_SF = zeros(NSF, dim);   % 旗鱼位置
  20. x_F  = zeros(NF, dim);    % 沙丁鱼位置
  21. % 若 lb, ub 为标量,则扩展为向量
  22. if length(lb)==1
  23.     lb = lb*ones(1,dim);
  24.     ub = ub*ones(1,dim);
  25. end
  26. %% ------------------- 1. 种群初始化 ------------------ %%
  27. for i = 1:dim
  28.     x_SF(:,i) = lb(i) + (ub(i)-lb(i)).*rand(NSF,1);  % 随机分布
  29.     x_F(:,i)  = lb(i) + (ub(i)-lb(i)).*rand(NF,1);
  30. end
  31. % 计算初始适应度
  32. for j = 1:NSF
  33.     Fitness_SF(j) = fobj(x_SF(j,:)); % 旗鱼适应度
  34. end
  35. for j = 1:NF
  36.     Fitness_F(j) = fobj(x_F(j,:));   % 沙丁鱼适应度
  37. end
  38. % 找到旗鱼与沙丁鱼最优解
  39. [Fbest_SF, eliteSF] = min(Fitness_SF);  % 最优旗鱼适应度 & 下标
  40. [Fbest_F, injuredS] = min(Fitness_F);   % 最优沙丁鱼适应度 & 下标
  41. x_eliteSF = x_SF(eliteSF,:);   % 最优旗鱼位置
  42. x_injuredS= x_F(injuredS,:);   % 最优沙丁鱼位置
  43. % 参数设置
  44. PD = 2/3;       % prey density (沙丁鱼密度)
  45. ks = 0.5/MaxIt; % 用于衰减的系数
  46. %% ------------------- 2. 主循环迭代 ------------------ %%
  47. for it = 1:MaxIt
  48.     % A 用于控制收敛系数, A 随迭代线性衰减
  49.     A = 4*(1 - it/MaxIt);
  50.     % AP 为进一步衰减
  51.     AP = A*(1 - (2*it*ks));
  52.    
  53.     %----------- 2.1 更新所有旗鱼的位置 --------------%
  54.     for ii=1:NSF
  55.         lamda = 2*rand*PD - PD;
  56.         % x_SF(ii,:) = x_eliteSF - lamda*(rand*0.5*(x_eliteSF+x_injuredS)- x_SF(ii,:));
  57.         % 旗鱼向(最优旗鱼 & 最优沙丁鱼)之间的位置靠近,同时加入随机扰动 lamda
  58.         x_SF(ii,:) = x_eliteSF - lamda*( rand*0.5*(x_eliteSF + x_injuredS) - x_SF(ii,:) );
  59.     end
  60.    
  61.     %----------- 2.2 更新沙丁鱼位置 --------------%
  62.     % alpha=ceil(AP*NF_rest) and beta=ceil(AP*dim)
  63.     alpha = ceil(AP * NF_rest);  % 选取沙丁鱼群中 alpha 个
  64.     beta  = ceil(AP * dim);      % 选取维度的数量
  65.     for jj=1:NF_rest
  66.         if AP < 0.5
  67.             % 当 AP < 0.5时
  68.             sizepop_value = randperm((NF_rest-alpha+1), alpha) + alpha -1;
  69.             D_value       = randperm((dim-beta+1), beta)+ beta -1;
  70.             for kk=1:dim
  71.                 if ismember(jj,sizepop_value) && ismember(kk,D_value)
  72.                     x_F(jj,kk) = rand*( x_eliteSF(kk) - x_F(jj,kk) + AP );
  73.                 end
  74.             end
  75.             x_F(jj,:) = rand*(x_eliteSF - x_F(jj,:) + AP);
  76.         else
  77.             % 当 AP >= 0.5
  78.             x_F(jj,:) = rand*(x_eliteSF - x_F(jj,:) + AP);
  79.         end
  80.     end
  81.    
  82.     %----------- 2.3 边界处理 --------------%
  83.     for k=1:dim
  84.         % 旗鱼的越界处理
  85.         Flag4ub = x_SF(:,k) > ub(k);
  86.         Flag4lb = x_SF(:,k) < lb(k);
  87.         x_SF(:,k) = ( x_SF(:,k).*(~(Flag4ub + Flag4lb)) ) + ub(k).*Flag4ub + lb(k).*Flag4lb;
  88.         % 沙丁鱼的越界处理
  89.         Flag4ub = x_F(:,k) > ub(k);
  90.         Flag4lb = x_F(:,k) < lb(k);
  91.         x_F(:,k) = ( x_F(:,k).*(~(Flag4ub + Flag4lb)) ) + ub(k).*Flag4ub + lb(k).*Flag4lb;
  92.     end
  93.    
  94.     %----------- 2.4 重新计算旗鱼和沙丁鱼的适应度 --------------%
  95.     for i=1:NSF
  96.         Fitness_SF(i) = fobj(x_SF(i,:));
  97.     end
  98.     for j=1:NF_rest
  99.         Fitness_F(j)  = fobj(x_F(j,:));
  100.     end
  101.     % 找到当前最优旗鱼, 最优沙丁鱼
  102.     [fbest_SF, eliteSF] = min(Fitness_SF);
  103.     [fbest_F, injuredS] = min(Fitness_F);
  104.     % 如果发现更优旗鱼则更新全局最优
  105.     if fbest_SF < Fbest_SF
  106.         Fbest_SF = fbest_SF;
  107.         x_eliteSF= x_SF(eliteSF,:);
  108.     end
  109.     % 如果发现更优沙丁鱼
  110.     if fbest_F < Fbest_F
  111.         Fbest_F = fbest_F;
  112.         x_injuredS = x_F(injuredS,:);
  113.     end
  114.     %----------- 2.5 捕食过程:将某个旗鱼替换为受伤沙丁鱼 --------------%
  115.     replace_num_SF = ceil(rand * NSF);
  116.     if Fitness_SF(replace_num_SF) > fbest_F
  117.         % 选中的旗鱼若适应度比最优沙丁鱼差,则被沙丁鱼替换
  118.         x_SF(replace_num_SF,:) = x_F(injuredS,:);
  119.         Fitness_SF(replace_num_SF)= fbest_F;
  120.         % 从沙丁鱼群移除该受伤(最优)沙丁鱼
  121.         x_F(injuredS,:)=[];
  122.         Fitness_F(injuredS)=[];
  123.         NF_rest = NF_rest - 1;  % 沙丁鱼减少一条
  124.     end
  125.    
  126.     %----------- 2.6 记录历史最优适应度 --------------%
  127.     HisBestFit(it) = Fbest_SF;
  128. end
  129. end
复制代码
3. 小结

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4