群体智能优化算法-黄金正余弦优化算法(含Matlab源代码)

摘要

黄金正余弦优化算法(Golden Sine Algorithm,GoldSA)是一种数学启发式算法,基于黄金分割系数(Golden Ratio)以及正余弦函数的随机扰动机制来更新解的位置。该算法通过在迭代过程中不断利用黄金分割比例来调整搜索范围,同时结合正弦与余弦变化,为个体提供多样化的全局搜索与局部微调能力。本文提供了 GoldSA 的核心思想完整 MATLAB 代码,并附上中文详细注释,以帮助读者深入理解并快速应用。

1. 算法介绍

1.1 黄金正余弦优化算法 (GoldSA) 的原理概述

GoldSA 算法主要利用以下两点思想:

  1. 黄金分割系数(Golden Ratio):约等于 0.618,被广泛应用于最优化搜索问题。GoldSA 在搜索过程中根据黄金分割来动态调整搜索区间范围,从而平衡全局探索局部开发
  2. 正余弦函数扰动(Sine & Cosine Disturbance):每次迭代中,会基于正弦和余弦函数生成随机扰动,以更新候选解的位置,从而提高跳出局部最优的概率。

1.2 算法流程简述

  1. 初始化:在给定的上下界内随机生成一批候选解(种群)。
  2. 评估适应度:计算每个候选解的目标函数值,并找出其中最优解(GoldSA_position)。
  3. 迭代更新
    • 在正余弦扰动的基础上,对解的位置进行更新(引入黄金分割系数)。
    • 进行边界检查并评估新的适应度,若有更优解则更新全局最优解。
    • 通过黄金分割向左右区间收缩,缩小或变换搜索区间。
  4. 收敛判断:若达到最大迭代次数或满足其他终止条件,则输出最终的全局最优解和适应度。

GoldSA 算法结构简单但具有一定的全局搜索与局部开发能力,对高维和多模态优化问题也有较好的适应性。

function [GoldSA_value, GoldSA_position, cuver] = GoldSA(N, Max_iteration, Lb, Ub, dim, func_obj)
% GoldSA 主函数
% 输入参数:
%   N             :种群规模(搜索个体数量)
%   Max_iteration :最大迭代次数
%   Lb, Ub        :搜索空间下界和上界(可为标量或向量)
%   dim           :问题维度
%   func_obj      :目标函数句柄
%
% 输出参数:
%   GoldSA_value  :收敛后得到的最优适应度值(目标函数值)
%   GoldSA_position :对应的最优解位置向量
%   cuver         :记录每次迭代的最优适应度(收敛曲线)

%================== 1. 种群初始化 ==================%
X = initialization(N, dim, Ub, Lb);
GoldSA_position = zeros(1, dim);
GoldSA_value = inf;

Destination_values = zeros(1, size(X,1));

%============== 2. 计算初始种群的适应度并找到最优解 ==============%
for i = 1:size(X,1)
    Destination_values(1,i) = func_obj(X(i,:));
    
    if i == 1
        GoldSA_position = X(i,:);
        GoldSA_value = Destination_values(1,i);
    elseif Destination_values(1,i) < GoldSA_value
        GoldSA_position = X(i,:);
        GoldSA_value = Destination_values(1,i);
    end
end

% 黄金分割系数及初始区间
a = -pi;
b = pi;
gold = double((sqrt(5)-1)/2);   % gold ≈ 0.618

% 初始化黄金分割点
x1 = a + (1 - gold) * (b - a);
x2 = a + gold * (b - a);

% 记录初始最优解适应度
cuver(1) = GoldSA_value;

%===================== 3. 开始迭代 ======================%
t = 2;
while t <= Max_iteration
    
    % 3.1 位置更新
    for i = 1:size(X,1)
        r = rand;
        r1 = (2*pi) * r;    % 用于计算正余弦扰动的随机数
        r2 = r * pi;        % 同样用于扰动
        
        for j = 1:size(X,2)
            % temp1 = abs(sin(r1))  和 temp2 = r2*sin(r1) 作为正余弦混合
            temp1 = abs(sin(r1));
            temp2 = r2 * sin(r1);
            
            % X(i,j) = X(i,j)*temp1 - temp2*abs(x1*GoldSA_position(j)-x2*X(i,j))
            % 利用黄金分割点 x1, x2 来影响位置更新
            X(i,j) = X(i,j)*temp1 - temp2*abs(x1*GoldSA_position(j) - x2*X(i,j));
        end
    end
    
    % 3.2 边界检查 & 适应度评估 & 更新全局最优
    for i = 1:size(X,1)
        
        % 检查是否超出上下界,若超出则调整回有效范围
        Boundary_Ub = X(i,:) > Ub;
        Boundary_Lb = X(i,:) < Lb;
        X(i,:) = (X(i,:).*(~(Boundary_Ub + Boundary_Lb))) + Ub.*Boundary_Ub + Lb.*Boundary_Lb;
        
        % 计算新位置的目标函数值
        Destination_values(1,i) = func_obj(X(i,:));
        
        % 若优于全局最优,则更新
        if Destination_values(1,i) < GoldSA_value
            GoldSA_position = X(i,:);
            GoldSA_value = Destination_values(1,i);
            
            % 调整黄金分割区间
            b = x2;
            x2 = x1;
            x1 = a + (1 - gold)*(b - a);
        else
            % 否则移动另一边
            a = x1;
            x1 = x2;
            x2 = a + gold*(b - a);
        end
        
        % 若 x1 == x2,重新随机生成搜索区间
        if x1 == x2
            a = -pi * rand;
            b = pi * rand;
            x1 = a + (1-gold)*(b-a);
            x2 = a + gold*(b-a);
        end
    end
    
    % 3.3 记录当代最佳适应度
    cuver(t) = GoldSA_value;
    t = t + 1;
end

end

%%================== 种群初始化函数 ==================%%
function X = initialization(SearchAgents_no, dim, ub, lb)
% 用于随机初始化种群
% 输入:
%   SearchAgents_no: 个体数
%   dim: 维度
%   ub, lb: 上下界(可为标量或向量)
% 输出:
%   X: 大小为 [SearchAgents_no x dim] 的随机初始解矩阵

Boundary_no = size(ub,2); % 检查上下界是标量还是向量

% 若上下界都是标量
if Boundary_no == 1
    X = rand(SearchAgents_no,dim).*(ub - lb) + lb;
end

% 若上下界是向量
if Boundary_no > 1
    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

3. 小结

黄金正余弦优化算法(GoldSA)借助黄金分割系数正余弦扰动形成了独特的搜索策略,算法在全局搜索与局部开发间能找到相对平衡。本文给出了完整 MATLAB 源码,并对关键位置更新过程和黄金分割动态调整机制进行了详细说明,有助于读者在工程优化机器学习参数调优等场景中尝试应用或改进此算法。

论文: E. Tanyildizi, G. Demir, "Golden Sine Algorithm: A Novel Math-Inspired Algorithm,"  Advances in Electrical and Computer Engineering, vol.17, no.2, pp.71-78, 2017,  doi:10.4316/AECE.2017.02010

你可能感兴趣的:(算法,matlab,开发语言,群体智能优化,优化)