摘要
?魚優化算法(Remora Optimization Algorithm,ROA)是一種基于?魚在海洋中寄生與捕食者間交互關系而提出的元啟發式算法。通過模擬?魚在宿主附近進行寄生、吸附和隨機機動等行為,ROA 在全局與局部搜索之間取得平衡。本文提供了算法的核心原理及完整的 MATLAB 代碼,并通過中文詳細注釋幫助讀者快速理解與應用。
1. 算法介紹
1.1 ?魚優化算法的靈感來源
?魚(Remora)常見于熱帶海域,與鯊魚或大型海洋生物呈共生關系 – ?魚常附著在這些宿主身上,利用宿主的移動進行覓食或逃離捕食者。ROA 將這些特性抽象為搜索過程中以下幾種行為:
- 寄生吸附:模仿?魚跟隨宿主或緊貼在宿主身上,保證在局部區域內精細搜索;
- 隨機機動:當?魚發現新的機會,可能進行短距離擺動或機動,促進跳出局部最優;
- 宿主轉換:當較優宿主出現(相當于更好的解),?魚轉移到新的宿主,使群體在全局探索中逐漸逼近最優解。
1.2 算法主要步驟
- 初始化:在搜索空間內隨機生成一批?魚個體位置,并計算其適應度。
- 記憶上一代個體:為了在后續迭代中比較并確定是否更優,保留前一代個體信息。
- 更新操作:
- 嘗試行為 (Equation (2)):將當前?魚和上一代?魚的位置信息通過隨機擾動結合,探索新解。
- 宿主行為:若嘗試解更優,則保留,否則根據幾率選擇“宿主投喂” (Equation (9)) 或“宿主轉換” (Equation (1), (5)) 等算子來進一步更新位置。
- 最優解更新:在每次迭代中更新全局最優?魚,確保算法不斷逼近最優解。
- 終止條件:達到最大迭代次數或滿足其他條件時輸出結果,包括全局最優解及其適應度。
2. 完整 MATLAB 代碼與中文詳細注釋
以下是 ROA(?魚優化算法)的完整 MATLAB 代碼:
function [Score,BestRemora,Convergence]=ROA(Search_Agents,Max_iterations,...Lowerbound,Upperbound,dimensions,objective)
% ROA - ?魚優化算法 (Remora Optimization Algorithm)
% 輸入:
% Search_Agents : 種群規模 (?魚個體數量)
% Max_iterations : 最大迭代次數
% Lowerbound, Upperbound : 搜索空間下界與上界 (可為標量或向量)
% dimensions : 問題維度
% objective : 目標函數句柄
%
% 輸出:
% Score : 收斂后全局最優適應度值
% BestRemora : 對應的最佳?魚位置向量
% Convergence : 記錄每次迭代后的最佳適應度值(收斂曲線)tic;
BestRemora=zeros(1,dimensions); % 全局最佳?魚位置初始化
Score=inf; % 全局最佳適應度初始化為∞% 生成初始?魚種群
Remora=init(Search_Agents, dimensions, Upperbound, Lowerbound);
% 記錄前一代種群位置
Prevgen{1}=Remora; Convergence=zeros(1,Max_iterations); % 用于存儲收斂曲線
t=0; % 迭代計數器while t<Max_iterations %% (1) 從歷史中獲取上一代個體if t<=1PreviousRemora = Prevgen{1};elsePreviousRemora = Prevgen{t-1};end%% (2) 邊界處理 & 全局最優更新for i=1:size(Remora,1)% 若越界則拉回有效范圍Flag4Upperbound = (Remora(i,:)>Upperbound);Flag4Lowerbound = (Remora(i,:)<Lowerbound);Remora(i,:)=( Remora(i,:).*(~(Flag4Upperbound+Flag4Lowerbound)) )...+ Upperbound.*Flag4Upperbound + Lowerbound.*Flag4Lowerbound;% 當前個體的適應度fitness=objective(Remora(i,:));% 如發現更優適應度則更新全局最優if fitness<Score Score=fitness; BestRemora=Remora(i,:);endend%% (3) 經驗嘗試 (Equation (2))for j=1:size(Remora,1)% RemoraAtt: 嘗試新位置 = 當前Remora位置 + (當前 - 上一代)*randnRemoraAtt = Remora(j,:)+(Remora(j,:)-PreviousRemora(j,:))*randn; % eqn.(2)% 計算嘗試解的適應度fitnessAtt = objective(RemoraAtt);% 計算當前解的適應度fitnessI = objective(Remora(j,:));% 若當前解劣于嘗試解 (fitnessI>fitnessAtt) => 否定當前解if fitnessI>fitnessAtt%% 執行宿主投喂 (Equation (9))V = 2*(1 - t/Max_iterations); % eqn.(12)B = 2*V*rand - V; % eqn.(11)C = 0.1;A = B*(Remora(j,:) - C*BestRemora); % eqn.(10)Remora(j,:) = Remora(j,:) + A; % eqn.(9)% 否則執行宿主轉換elseif randi([0,1],1)==0%% 部分機率使用 eqn.(1) & eqn.(5)% eqn.(7) : a=-(1+t/Max_iterations) => 用于 eqn.(6)a = -(1 + t/Max_iterations);alpha = rand*(a-1)+1; % eqn.(6)D = abs(BestRemora - Remora(j,:)); % eqn.(8)% eqn.(5) : Remora(j,:) = D*exp(alpha)*cos(2*pi*a)+Remora(j,:)Remora(j,:) = D*exp(alpha)*cos(2*pi*a) + Remora(j,:);else% 隨機挑選一個?魚作為宿主m=randperm(size(Remora,1));% eqn.(1) : Remora(j,:) = BestRemora-((...)-Remora(m(1),:))% (BestRemora+Remora(m(1),:))/2 => 宿主附近位置Remora(j,:) = BestRemora - ( (rand*(BestRemora+Remora(m(1),:))/2) - Remora(m(1),:) );endendt=t+1;Prevgen{t+1} = Remora; Convergence(t) = Score;
end
end%% (4) 初始種群生成函數
function Pos = init(SearchAgents, dimension, upperbound, lowerbound)
% 若上下界都是單數值 => uniform 分布
% 若上下界為向量 => 分別對每個維度分布
Boundary= size(upperbound,2); if Boundary==1Pos=rand(SearchAgents,dimension).*(upperbound-lowerbound)+lowerbound;
endif Boundary>1for i=1:dimensionub_i=upperbound(i);lb_i=lowerbound(i);Pos(:,i)=rand(SearchAgents,1).*(ub_i-lb_i)+lb_i;end
end
end
3. 小結
?魚優化算法(ROA)將寄生與宿主互動的生物學機制融合到元啟發式優化中,通過記憶上一代位置、經驗嘗試與宿主投喂/轉換等算子,能夠保持搜索多樣性并加速后期收斂。本文附帶的完整 MATLAB 代碼與中文注釋為讀者提供了深入理解該算法的關鍵思路,并支持在實際優化問題中直接應用或進一步改進。