摘要
旗魚優化算法(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)==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的完整實現及詳細注釋,為讀者在實際應用或學術研究中提供參考并便于進一步改進與擴展。