樽海鞘优化算法 SSA (matlab代码,包含23个常用的基准测试函数)可直接运行效果如图所示
樽海鞘优化算法 SSA (matlab代码,包含23个常用的基准测试函数)可直接运行效果如图所示
樽海鞘这种深海生物游动时总排成链状,科学家们愣是从这种群体行为里扒拉出了一个优化算法——樽海鞘算法(SSA)。咱们今天不扯复杂公式,直接上手MATLAB代码拆解它的运行逻辑,手把手看它怎么在23个标准测试函数里翻腾。
先瞅瞅初始化这段:
function [FoodFitness,FoodPosition,Convergence_curve]=SSA(N,Max_iter,lb,ub,dim,fobj) SalpPositions = initialization(N,dim,ub,lb);这步就像往海里撒了N条樽海鞘,每条的位置随机分布在搜索空间(lb到ub之间)。dim是问题维度,比如优化三维坐标就是dim=3。fobj就是咱们要攻克的测试函数,比如经典的Rastrigin函数。
核心循环里藏着算法的灵魂:
for t=1:Max_iter c1 = 2*exp(-(4*t/Max_iter)^2); % 领导者的移动系数 for i=1:size(SalpPositions,1) if i==1 % 领导者更新 SalpPositions(i,:) = FoodPosition + c1*( (ub-lb)*rand(1,dim)+lb ); else % 追随者用链式跟随 SalpPositions(i,:) = (SalpPositions(i-1,:) + SalpPositions(i,:))/2; end end end领导者的移动系数c1随时间衰减——初期大步探索,后期小步调优。追随者的位置取前一条和自己当前位置的均值,形成链式跟随效果。这就像鱼群游动时,后排的鱼会参考前排的位置调整自己。
边界处理容易被忽视但很关键:
% 越界处理 Flag4ub=SalpPositions(i,j)>ub; Flag4lb=SalpPositions(i,j)<lb; SalpPositions(i,j)=(SalpPositions(i,j).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;这里用了逻辑索引快速处理越界值,比if判断更高效。当某个樽海鞘游出边界时,直接把它拽回到边界线上,避免出现非法解。
樽海鞘优化算法 SSA (matlab代码,包含23个常用的基准测试函数)可直接运行效果如图所示
测试函数举个栗子——Ackley函数:
function o = Ackley(x) o = -20*exp(-0.2*sqrt(mean(x.^2))) - exp(mean(cos(2*pi*x))) + 20 + exp(1); end这个函数在原点处有全局最优,但布满局部极值坑。跑SSA时会看到算法初期在多个波谷间跳跃,后期逐渐收缩到中心点。
运行效果方面,典型的收敛曲线显示前100代适应度值快速下降,300代后进入微调阶段。对比PSO算法,SSA在Rosenbrock这类峡谷型函数上表现更稳,但在高维Sphere函数上容易早熟——这时候需要调小c1的衰减系数。
参数设置有个小窍门:群体数量N设为30~50时性价比最高,迭代次数建议至少500次。实际跑代码时会发现,把追随者的更新公式改成加权平均(比如0.7倍前驱+0.3倍自身)有时能提升局部搜索能力。
最后提醒新人避坑:测试函数记得做归一化处理,否则不同量纲的变量会让搜索过程跑偏。比如Griewank函数不处理的话,樽海鞘们容易卡在某个维度上反复震荡。
