群体智能优化算法-正弦余弦算法(Sine Cosine Algorithm, SCA,含Matlab源代码)

一、文章摘要

正弦余弦算法(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 能够有效引导搜索个体趋近于全局最优解,具有收敛速度快、适应性强、参数少等优点。该算法适用于各类连续优化问题,广泛应用于函数优化、机器学习参数调优、图像处理、工程设计等多个领域,是一种通用性强、应用前景广阔的智能优化工具。

相关推荐
(・Д・)ノ8 分钟前
python打卡day19
人工智能·机器学习
kovlistudio11 分钟前
《零基础学机器学习》学习大纲
人工智能·学习·机器学习
喝养乐多长不高25 分钟前
数据结构--红黑树
java·数据结构·算法·红黑树·二叉搜索树·avl树
xindafu37 分钟前
代码随想录算法训练营第三十七天-2|动态规划part2
算法·动态规划
How_doyou_do1 小时前
项目实战-基于信号处理与SVM机器学习的声音情感识别系统
机器学习·支持向量机·信号处理
এ᭄画画的北北1 小时前
力扣-142.环形链表II
算法·leetcode
字节旅行1 小时前
迁移学习:如何加速模型训练和提高性能
人工智能·机器学习·迁移学习
槑辉_1 小时前
【se-res模块学习】结合CIFAR-10分类任务学习
图像处理·人工智能·pytorch·深度学习·机器学习·分类
朝九晚五ฺ2 小时前
【算法学习】递归、搜索与回溯算法(二)
数据结构·学习·算法·深度优先
短尾黑猫2 小时前
【LeetCode 42】接雨水(单调栈、DP、双指针)
算法·leetcode