一、文章摘要
正弦余弦算法(Sine Cosine Algorithm, SCA)是一种轻量级的群体智能优化算法,由 Seyedali Mirjalili 于 2016 年提出。该算法通过正弦函数和余弦函数引导搜索个体围绕最优解进行跳跃式移动,实现在搜索空间内的全局探索与局部开发。SCA 具有参数少、结构简洁、易于实现等优点,广泛应用于函数优化、特征选择、机器学习等领域。
二、SCA 算法详解
(1)算法思想
SCA 中,每个候选解是一个位置向量。算法以当前最优解为"目的地",通过正弦/余弦函数控制搜索个体(解)的跳跃方式向其靠近。其主要特征为:
- 正弦函数驱动:产生向目标"靠近"或"远离"的跳跃;
- 余弦函数驱动:产生绕目标"旋转"的跳跃;
- 随机参数调节搜索步长,控制全局/局部平衡。
(2)核心数学模型与公式
位置更新公式(核心):

三、完整代码
Matlab
function [Destination_fitness,Destination_position,Convergence_curve]=SCA(N,Max_iteration,lb,ub,dim,fobj)
% 正弦余弦算法(Sine Cosine Algorithm, SCA)主函数
% 输入参数说明:
% N ------ 搜索个体数量
% Max_iteration ------ 最大迭代次数
% lb, ub ------ 每维变量的上下界
% dim ------ 变量维度
% fobj ------ 目标函数句柄
% 输出:
% Destination_fitness ------ 最优解的适应度值
% Destination_position ------ 最优解的位置
% Convergence_curve ------ 每代最优解变化曲线(用于收敛分析)
% 初始化搜索个体的位置(种群)
X = initialization(N, dim, ub, lb);
% 初始化最优解和适应度
Destination_position = zeros(1, dim);
Destination_fitness = inf;
% 初始化收敛曲线
Convergence_curve = zeros(1, Max_iteration);
Objective_values = zeros(1, size(X,1));
% 计算初始个体的适应度并寻找初始最优解
for i = 1:size(X,1)
Objective_values(1,i) = fobj(X(i,:));
if i == 1
Destination_position = X(i,:);
Destination_fitness = Objective_values(1,i);
elseif Objective_values(1,i) < Destination_fitness
Destination_position = X(i,:);
Destination_fitness = Objective_values(1,i);
end
end
% 主循环开始
t = 2; % 第一轮已完成适应度计算,从第二代开始
while t <= Max_iteration
% 线性递减控制因子 r1(公式 3.4)
a = 2;
r1 = a - t * (a / Max_iteration); % 从 2 线性减小到 0
% 更新每个搜索个体的位置
for i = 1:size(X,1)
for j = 1:size(X,2)
% 随机参数产生(用于控制正余弦方向和幅度)
r2 = (2 * pi) * rand(); % 角度因子 [0, 2π]
r3 = 2 * rand(); % 缩放因子 [0, 2]
r4 = rand(); % 方向选择因子 [0, 1]
% 位置更新公式(核心)
if r4 < 0.5
% 正弦跳跃(靠近或远离目标)
X(i,j) = X(i,j) + r1 * sin(r2) * abs(r3 * Destination_position(j) - X(i,j));
else
% 余弦跳跃(绕目标旋转)
X(i,j) = X(i,j) + r1 * cos(r2) * abs(r3 * Destination_position(j) - X(i,j));
end
end
end
% 再次评估适应度并更新最优解
for i = 1:size(X,1)
% 越界处理(如果跳出了边界,将其拉回)
Flag4ub = X(i,:) > ub;
Flag4lb = X(i,:) < lb;
X(i,:) = (X(i,:) .* (~(Flag4ub + Flag4lb))) + ub .* Flag4ub + lb .* Flag4lb;
% 计算当前个体适应度
Objective_values(1,i) = fobj(X(i,:));
% 如果找到更优解则更新全局最优
if Objective_values(1,i) < Destination_fitness
Destination_position = X(i,:);
Destination_fitness = Objective_values(1,i);
end
end
% 记录当前代最优值
Convergence_curve(t) = Destination_fitness;
% 迭代加 1
t = t + 1;
end
end
%% 初始化函数:为每个搜索个体随机生成一个解
function X = initialization(SearchAgents_no, dim, ub, lb)
% 输入:
% SearchAgents_no ------ 搜索个体数量
% dim ------ 解的维度
% ub, lb ------ 上下边界(可为标量或向量)
% 输出:
% X ------ 初始种群位置矩阵
Boundary_no = size(ub,2); % 边界维度
if Boundary_no == 1
% 所有变量使用相同的上下界
X = rand(SearchAgents_no, dim) .* (ub - lb) + lb;
else
% 每个变量使用不同的边界
for i = 1:dim
ub_i = ub(i);
lb_i = lb(i);
X(:,i) = rand(SearchAgents_no,1) .* (ub_i - lb_i) + lb_i;
end
end
end
四、总结
正弦余弦算法(SCA)是一种结构简单、易于实现的元启发式优化算法,凭借其独特的正弦与余弦跳跃机制,在搜索过程中实现了全局探索与局部开发的平衡。通过不断调整步长与方向,SCA 能够有效引导搜索个体趋近于全局最优解,具有收敛速度快、适应性强、参数少等优点。该算法适用于各类连续优化问题,广泛应用于函数优化、机器学习参数调优、图像处理、工程设计等多个领域,是一种通用性强、应用前景广阔的智能优化工具。