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