择要
旗鱼优化算法(Sailfish Optimizer, SFO)是一种模拟旗鱼(Sailfish)和沙丁鱼(Sardine)之间捕食关系的新型元启发式算法。通过在搜刮过程中模拟旗鱼对沙丁鱼的捕食活动,以及沙丁鱼群的逃逸与防御机制,SFO 均衡了全局探索与局部开发,在处理复杂优化问题时具有精良的收敛性能。本文提供了 SFO 的核心思路并提供了完备 MATLAB 代码及详细中文注释,以帮助读者快速明白并应用该算法。
1. 算法介绍
1.1 旗鱼优化算法 (SFO) 的灵感与思路
- 旗鱼(Sailfish)
- 旗鱼是一种速度极快的海洋捕食者,能迅速发起攻击并精准捕捉猎物。算法中,旗鱼对应较小规模但具有高“适应度”的个体。
- 沙丁鱼(Sardine)
- 沙丁鱼以群居方式求生,相互麋集形成群体逃离战略,以低落被捕风险。算法中,沙丁鱼则对应数目更多、且在后期可能被旗鱼“替换”以模拟被捕食的场景。
- 捕食关系与进化
- 当旗鱼捕捉沙丁鱼之后,会将其从沙丁鱼种群中移除,同时旗鱼种群可能得到“更优基因”(即更新位置)。
- 此过程在搜刮过程中不断迭代,使得种群在全局和局部中进举措态均衡,帮助跳出局部最优并渐渐收敛。
1.2 算法主要步骤
- 初始化:随机生成肯定数目的旗鱼个体(NSF)与沙丁鱼个体(NF),盘算它们在搜刮空间中的适应度。
- 最优个体辨认:在旗鱼与沙丁鱼种群中分别找出其当前最优解(旗鱼最优与沙丁鱼最优)。
- 更新:
- 旗鱼更新:根据最优旗鱼与最优沙丁鱼位置,引入随机扰动来移动旗鱼个体。
- 沙丁鱼更新:按照肯定几率对沙丁鱼进行“方向调整”,并在后期迭代中可能被旗鱼捕捉而移除。
- 捕食机制:若旗鱼个体适应度较差并随机选中,则其位置可能被“受伤沙丁鱼”所替换,同时沙丁鱼群规模减少。
- 终止条件:迭代最大次数或到达可担当收敛尺度,输出全局最优解(旗鱼种群的最优)。
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)==1
- lb = lb*ones(1,dim);
- ub = ub*ones(1,dim);
- end
- %% ------------------- 1. 种群初始化 ------------------ %%
- for i = 1:dim
- x_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:NSF
- Fitness_SF(j) = fobj(x_SF(j,:)); % 旗鱼适应度
- end
- for j = 1:NF
- Fitness_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:NSF
- lamda = 2*rand*PD - PD;
- % x_SF(ii,:) = x_eliteSF - lamda*(rand*0.5*(x_eliteSF+x_injuredS)- x_SF(ii,:));
- % 旗鱼向(最优旗鱼 & 最优沙丁鱼)之间的位置靠近,同时加入随机扰动 lamda
- x_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_rest
- if 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:dim
- if ismember(jj,sizepop_value) && ismember(kk,D_value)
- x_F(jj,kk) = rand*( x_eliteSF(kk) - x_F(jj,kk) + AP );
- end
- end
- x_F(jj,:) = rand*(x_eliteSF - x_F(jj,:) + AP);
- else
- % 当 AP >= 0.5
- x_F(jj,:) = rand*(x_eliteSF - x_F(jj,:) + AP);
- end
- end
-
- %----------- 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:NSF
- Fitness_SF(i) = fobj(x_SF(i,:));
- end
- for j=1:NF_rest
- Fitness_F(j) = fobj(x_F(j,:));
- end
- % 找到当前最优旗鱼, 最优沙丁鱼
- [fbest_SF, eliteSF] = min(Fitness_SF);
- [fbest_F, injuredS] = min(Fitness_F);
- % 如果发现更优旗鱼则更新全局最优
- if fbest_SF < Fbest_SF
- Fbest_SF = fbest_SF;
- x_eliteSF= x_SF(eliteSF,:);
- end
- % 如果发现更优沙丁鱼
- if fbest_F < Fbest_F
- Fbest_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的完备实现及详细注释,为读者在实际应用或学术研究中提供参考并便于进一步改进与扩展。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |