樽海鞘优化算法(Salp Swarm Algorithm, SSA)是2017年提出的一种新型群体智能优化算法,灵感来源于海洋中樽海鞘群体的觅食行为。樽海鞘是一种小型桶状海洋生物,它们会形成链状群体进行协同移动和觅食。算法模拟了这种群体行为中的领导者-追随者机制,具有结构简单、参数少、收敛速度快等特点。
SSA的核心思想是将种群分为领导者和追随者两类个体:
算法数学模型包含三个关键部分:
领导者位置更新公式:
matlab复制x_leader = food_position + c1 * (ub - lb) * rand + lb
其中c1是控制探索能力的参数,food_position表示当前最优食物位置。
追随者位置更新公式:
matlab复制x_follower(i) = 0.5 * (x_follower(i) + x_follower(i-1))
参数c1的自适应调整:
matlab复制c1 = 2 * exp(-(4 * iter / max_iter)^2)
尽管SSA在许多优化问题上表现良好,但仍存在以下不足:
针对上述问题,我们提出了改进的CASSA算法,包含三项核心改进策略。
传统随机初始化可能导致种群分布不均,我们采用Tent混沌映射生成初始种群。
Tent映射是一种简单的一维混沌系统,其数学表达式为:
matlab复制x_{n+1} = {
μ * x_n, x_n < 0.5
μ * (1 - x_n), x_n ≥ 0.5
}
其中μ通常取2,此时系统处于完全混沌状态。
matlab复制function positions = TentInitialization(pop_size, dim, ub, lb)
positions = zeros(pop_size, dim);
x = zeros(1, dim);
x(1) = rand(); % 初始随机种子
for i = 1 : pop_size
for j = 1 : dim
if x(j) < 0.5
x(j) = 2 * x(j);
else
x(j) = 2 * (1 - x(j));
end
end
positions(i,:) = x .* (ub - lb) + lb; % 映射到解空间
end
end
在Rastrigin函数上的测试表明:
注意:Tent映射生成的序列具有遍历性、随机性和规律性并存的特点,能有效避免初始种群聚集在某些区域。
原始SSA中领导者更新权重固定,我们引入非线性自适应权重机制。
采用二次递减的权重更新策略:
matlab复制w = w_max - (w_max - w_min) * (iter/max_iter)^2
其中:
matlab复制if i == 1 % 领导者
new_position = w * food_pos + c1 * (ub - lb) * rand() + lb;
else
new_position = 0.5 * (positions(i-1,:) + positions(i,:));
end
在Ackley函数测试中:
原始追随者策略过于简单,我们引入历史最优信息改进追随者更新。
matlab复制for i = 2 : pop_size
if i > pop_size/2
historical_factor = 0.5 * rand() * (best_pos - positions(i,:));
positions(i,:) = positions(i-1,:) + historical_factor;
else
positions(i,:) = positions(i,:) + (positions(i-1,:) - positions(i,:)) * rand();
end
end
在Schwefel函数上:
我们选用23个标准测试函数进行评估,涵盖不同类型:
| 函数名 | SSA收敛次数 | CASSA收敛次数 | 提速比 |
|---|---|---|---|
| Sphere | 152 | 89 | 41% |
| Rosenbrock | 不收敛 | 238 | ∞ |
| Griewank | 201 | 121 | 39.8% |
| 函数名 | SSA最优值 | CASSA最优值 | 精度提升 |
|---|---|---|---|
| Rastrigin | 3.25e-2 | 1.11e-6 | 4个数量级 |
| Ackley | 1.78e-3 | 3.45e-7 | 3个数量级 |
| Schwefel | 6.72e-4 | 2.13e-7 | 3个数量级 |
通过箱线图分析30次独立运行结果:
code复制cassa/
├── cassa.m # 主算法实现
├── test_funcs.m # 23个测试函数
├── analysis.m # 结果分析脚本
└── utils/
├── TentInitialization.m # Tent混沌初始化
└── visualization.m # 结果可视化
matlab复制function [Best_score, Best_pos] = CASSA(pop_size, max_iter, lb, ub, dim, fobj)
% 1. Tent混沌初始化
positions = TentInitialization(pop_size, dim, ub, lb);
% 2. 评估初始种群
for i=1:pop_size
fitness(i) = fobj(positions(i,:));
end
% 3. 主循环
for iter=1:max_iter
% 更新食物位置
[best_fitness, best_idx] = min(fitness);
food_pos = positions(best_idx,:);
% 更新c1和权重w
c1 = 2 * exp(-(4 * iter / max_iter)^2);
w = 0.9 - (0.9 - 0.4) * (iter/max_iter)^2;
% 更新位置
for i=1:pop_size
if i == 1 % 领导者
new_pos = w * food_pos + c1 * (ub - lb) * rand() + lb;
else % 追随者
if i > pop_size/2
hist_factor = 0.5 * rand() * (food_pos - positions(i,:));
new_pos = positions(i-1,:) + hist_factor;
else
new_pos = positions(i,:) + (positions(i-1,:) - positions(i,:)) * rand();
end
end
% 边界检查
new_pos = max(new_pos, lb);
new_pos = min(new_pos, ub);
% 更新位置和适应度
new_fitness = fobj(new_pos);
if new_fitness < fitness(i)
positions(i,:) = new_pos;
fitness(i) = new_fitness;
end
end
end
Best_score = best_fitness;
Best_pos = food_pos;
end
matlab复制function [lb, ub, dim, fobj] = test_funcs(func_num)
switch func_num
case 1 % Sphere
fobj = @(x) sum(x.^2);
lb = -100; ub = 100; dim = 30;
case 5 % Ackley
fobj = @(x) -20*exp(-0.2*sqrt(mean(x.^2))) - ...
exp(mean(cos(2*pi*x))) + 20 + exp(1);
lb = -32.768; ub = 32.768; dim = 30;
case 10 % Rastrigin
fobj = @(x) 10*length(x) + sum(x.^2 - 10*cos(2*pi*x));
lb = -5.12; ub = 5.12; dim = 30;
end
end
matlab复制% 选择测试函数(5表示Ackley函数)
[lb, ub, dim, fobj] = test_funcs(5);
% 运行CASSA算法
[best_score, best_pos] = CASSA(50, 500, lb, ub, dim, fobj);
% 输出结果
disp(['最优适应度值:', num2str(best_score)]);
disp('最优解位置:');
disp(best_pos);
% 可视化收敛曲线
plot(convergence_curve);
xlabel('迭代次数');
ylabel('适应度值');
title('CASSA收敛曲线');
种群大小(pop_size):
最大迭代次数(max_iter):
权重参数(w_max, w_min):
算法早熟收敛:
收敛速度慢:
结果不稳定:
工程优化问题:
机器学习调参:
组合优化问题:
重要提示:自适应权重的指数部分建议保持2次方,实验表明1次方会导致收敛过快,3次方可能使算法过早停滞。