一、改進型雪雁算法
雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一種新型元啟發式算法,其靈感來源于雪雁的遷徙行為,特別是它們在遷徙過程中形成的獨特“人字形”和“直線”飛行模式。該算法通過模擬雪雁的飛行行為,實現了在解空間中的高效搜索和優化。SGA算法主要分為三個階段:初始化階段、探索階段和開發階段。
改進型雪雁算法(Improved Snow Geese Algorithm, ISGA) 是2025年提出的一種新型元啟發式算法,是對雪雁算法(SGA)的改進,旨在解決復雜工程優化問題和聚類優化問題。ISGA通過引入三種改進策略,顯著提升了算法的探索和開發能力,從而提高了算法的收斂速度和精度。
改進策略:
領頭雁輪換機制:
模擬雪雁遷徙過程中,當領頭雁疲勞時,其他強壯的雪雁會接替領頭雁的位置,以維持飛行效率和速度。
通過競爭機制,選擇適應值最高的個體作為新的領頭雁,從而增強算法的全局探索能力。
鳴叫引導機制:
模擬雪雁通過鳴叫進行溝通,以引導飛行方向。
使用聲波傳播的衰減模型,根據個體與領頭雁的距離調整其位置更新,避免因過度聚集或分散導致的開發能力下降。
異常邊界策略:
考慮雪雁作為群居鳥類,個體害怕離群的特性。
通過計算個體的適應值與群體平均適應值的差異,調整個體的位置更新,以提高算法的收斂速度和精度。
算法流程:
算法性能:
探索與開發能力:ISGA在探索階段通過領頭雁輪換機制增強全局搜索能力,在開發階段通過鳴叫引導機制和異常邊界策略提高局部搜索精度。
收斂速度與精度:ISGA在多個測試函數上表現出更快的收斂速度和更高的收斂精度,特別是在高維問題上表現更為突出。
穩定性:通過多次獨立運行的實驗結果表明,ISGA在不同維度和不同類型的優化問題上均表現出較高的穩定性和魯棒性。
參考文獻:
[1]Bian, H., Li, C., Liu, Y. et al. Improved snow geese algorithm for engineering applications and clustering optimization. Sci Rep 15, 4506 (2025). https://doi.org/10.1038/s41598-025-88080-7
[2][1] Tian A Q , Liu F F , Lv H X .Snow Geese Algorithm: A novel migration-inspired meta-heuristic algorithm for constrained engineering optimization problems[J].Applied Mathematical Modelling, 2024, 126:327-347.DOI:10.1016/j.apm.2023.10.045.
二、23個函數介紹
參考文獻:
[1] Yao X, Liu Y, Lin G M. Evolutionary programming made faster[J]. IEEE transactions on evolutionary computation, 1999, 3(2):82-102.
三、部分代碼及結果
clear;
clc;
close all;
warning off all;SearchAgents_no=50; %Number of search solutions
Max_iteration=500; %Maximum number of iterationsFunc_name='F1'; % Name of the test function% Load details of the selected benchmark function
[lb,ub,dim,fobj]=Get_F(Func_name); tic;
[Best_score,Best_pos,cg_curve]=ISGA(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);
tend=toc;% figure('Position',[500 500 901 345])
%Draw search space
subplot(1,2,1);
func_plot(Func_name);
title('Parameter space')
xlabel('x_1');
ylabel('x_2');
zlabel([Func_name,'( x_1 , x_2 )'])%Draw objective space
subplot(1,2,2);
semilogy(cg_curve,'Color','m',LineWidth=2.5)
title(Func_name)% title('Objective space')
xlabel('Iteration');
ylabel('Best score obtained so far');axis tight
grid on
box on
legend('ISGA')display(['The running time is:', num2str(tend)]);
display(['The best fitness is:', num2str(Best_score)]);
display(['The best position is: ', num2str(Best_pos)]);