传统的正弦余弦算法(sine cosine algorithm, SCA)是一种利用正弦和余弦三角函数的特性的元启发式算法。但是,SCA的不足之处包括容易陷入局部最优、探索-开发不平衡以及准确性差,这些限制了它在解决复杂优化问题中的有效性。针对这些局限性,提出了一种基于多试验向量的正弦余弦算法(Multi-trial vector-based sine cosine algorithm,MTV-SCA)(MTV-SCA)。在MTV-SCA中,通过多试验向量(MTV)方法调整包含三个控制参数的足够数量的搜索策略,以在搜索过程中实现特定的目标。
该成果于2024年发表在计算机领域3区SCI期刊“Cluster Computing”上。MTV-SCA算法在收敛速度、精度和避免早熟收敛等方面均优于传统的SCA算法。
![ebec6d16b05f00f365252329f110984d.png](https://img-blog.csdnimg.cn/img_convert/ebec6d16b05f00f365252329f110984d.png)
1、算法原理
使用下式在考虑下(L)和上(U)边界的d维搜索空间中随机初始化N个解,
其中第i个解的第j维的值用xi,j表示。第j维的最小和最大边界分别用Lj和Uj表示,rand是均匀分布在[0,1]范围内的随机值。问题的总体大小和维度大小分别用N和D表示。n9维矩阵,称为X,用于保存生成的解的位置。适应度函数f(Xi(t))用于确定总体初始化后和每次迭代t时解Xi的适应度值。
分布:为了确定子种群SC-TVP和Pool-TVP的大小,必须考虑经过指定迭代次数的nIter迭代后改进的解决方案的数量。ImpRate是改进的解决方案的适合度与前面的nIter迭代中函数计算的总数的比值。TVP ImpRate由下式确定:
其中改进率用ImpRateSC-TVP和ImpRatePool-TVP表示,sc -TVP和PoolTVP的子种群大小用nsc -TVP和NPool-TVP表示,每个TVP在前面的nIter迭代中执行的功能评估次数分别用nfe表示。
MTV-SCA中的分配策略考虑下式中所述的分配规则;因此,具有较高ImpRate的TVP具有更大的子群体。
![2e84a481ed1b595315ec0e65076e0b8d.png](https://img-blog.csdnimg.cn/img_convert/2e84a481ed1b595315ec0e65076e0b8d.png)
其中N是解的总数,通过考虑TVP的改进率表示的子群体的大小,由NSC-TVP和NPool-TVP表示,并且部分系数k被认为是0.5。在计算出子群体的大小之后,创建子群体XSC和XPool。
在解决特定问题时进行开发。出于这些观察,文章提出了一个集合的试验向量生产者和控制参数的典型SCA中,试验向量生产者竞争,以产生一个繁荣的人口在每次迭代。随着迭代的进行,解Xi的位置分别由策略SC-TVP和Pool-TVP调整。SCTVP增强了搜索空间中有希望的区域并在局部区域中找到新解决方案的能力。当涉及到利用、摆脱局部最优解以及实现利用和勘探之间的平衡时,可以使用Pool-TVP。
首先介绍了一个初步的信息,然后是一个全面的解释,建议的TVP。在提出的S1-TVP和S2-TVP中,两个变换矩阵,表示为M和M,以生成每个子群体的候选试验向量。矩阵M的维数为N × 9 × D,它是由一个D × 9 × D的下三角矩阵生成的,矩阵的所有元素都等于1.该D 9 D矩阵被复制(N/D)次以形成方阵。如果M中还有剩余的行,则用方阵的第一行填充。然后,将随机置换应用于M的行。在此之后,通过将M中的每个元素替换为其逆值来获得M矩阵。
正弦余弦试验向量产生器(SC-TVP):在每次迭代t中,通过下式为SC-TVP的子群体XSCi,t的第i个解生成候选解。
其中,CSCi t+1表示XSCi t的生成的候选解,r1由等式2,r2、r3和r4分别是随机数,Pt是第t次迭代中目标解的位置。
池试验向量生成器(Pool-TVP):池TVP是不同试验向量生成器S1-TVP、S2 TVP、S3-TVP和S4-TVP的集合,具有各种正弦和余弦函数作为搜索策略的控制参数。在四个TVP之间划分XPool的建议分配策略涉及在每次迭代中随机分配解决方案。S3 TVP算法在探索和利用之间取得了很好的平衡,具有较高的收敛速度,适合于求解旋转问题。S4-TVP的目的是为了平衡搜索空间的探索和利用,避免过早收敛。
S1-TVP:提出S1-TVP的目的是使算法在探索和利用之间保持平衡,避免陷入局部最优。这是通过考虑人口的最佳解决方案和两个随机选择的解决方案之间的比例差异来实现的。该策略结合了当前最佳位置的信息,随机选择的解决方案的区别,以产生一个候选解决方案,并将其推向潜在的更好的解决方案。此外,切比雪夫和兰德控制参数提供了探索和利用之间的平衡,这导致了对搜索空间的最佳区域的更直接的搜索。
对于属于XS 1的子群体的每个解 ,通过下式计算试验向量 。
其中Pt是目前为止的最佳解,Xt r1、Xt r2、Xt r3和Xt r4是从当前总体X中随机选择的解。
第i个解的候选试验向量 由下式计算:
其中Mi和Mi是第i个解的对应值, 是为S1-TVP亚群的第i个解生成的候选试验向量。
S2-TVP:该策略包括从群体中随机选择三个个体,并通过将两个个体之间的缩放差异添加到第三个个体来创建新的试验向量。这种策略已被证明是有效的探索搜索空间,这可能是特别有用的,当处理复杂和高维优化问题。变异策略允许算法远离当前种群并探索搜索空间的新区域。此外,它有效探索搜索空间的能力导致快速收敛,这意味着与其他元启发式算法相比,它可以在更短的时间内找到好的解决方案。
对于属于XS 2的子群体的每个解 ,试验向量 通过下式计算。
其中Mi和Mi是第i个解的对应值,并且 是针对S2-TVP亚群的第i个解生成的候选试验向量。
S3-TVP:S3-TVP在勘探和开发之间取得了很好的平衡,并且具有更高的收敛速度。它通过在搜索过程中使用当前和随机解来实现这些。这是因为它在变异过程中使用了随机解,这有助于探索搜索空间的不同区域。来自XS 3的子群体的当前解XS 3 t i在被来自当前群体的另外两个随机选择的解Xt r2和Xt r3之间的缩放差干扰之前在随机向量Xt r1的方向上移动。第i个解XS 3 t i的候选尝试向量通过下式计算
其中CS3t,i表示为第i个解XS3t,i提供的候选解,sinusoidal(t)是用于调整由下式计算的算法的搜索半径和方向的系数。Xt r1、Xt r2和Xt r3是从当前总体X中随机选择的解。
正弦函数可以通过允许算法更彻底地探索搜索空间来帮助防止过早收敛。该算法通过周期性地增大搜索半径和改变搜索方向,避免陷入局部最优,继续搜索全局最优。
S4-TVP:该策略保持了平衡搜索空间的探索和利用以及避免早熟收敛的目标。它基于 的当前位置、两个随机选择的解以及取决于当前迭代次数和迭代总数的正弦和余弦函数的组合来更新 的位置。第i个解的候选试验向量 通过等式下式计算。
其中t是当前迭代,MaxIter是迭代的总次数,Xt r1和Xt r2是从当前总体X中随机选择的解。cos(t/MaxIter)× sin(rand×(t/MaxIter))的作用是提供控制参数的动态调整,以平衡探索和开发并避免过早收敛,从而提高所提出的TVP的效率。前一部分随着t接近MaxIter而从1到-1变化,这允许逐渐减小搜索半径,这有助于细化解决方案并将搜索集中在搜索空间的有希望的区域。后一部分在控制参数调整中引入了随机因素。随机值rand在0和1之间均匀分布,这为正弦函数生成随机角度。这种随机性有助于通过探索搜索空间的不同区域来避免陷入局部最优。
MTV-SCA对应的伪代码过程如下图所示
![10eefc6ea0209a78ebfec944eee37488.png](https://img-blog.csdnimg.cn/img_convert/10eefc6ea0209a78ebfec944eee37488.png)
MTV-SCA对应的流程图如下图所示
![514a742353b5b96ed8170e4267361883.png](https://img-blog.csdnimg.cn/img_convert/514a742353b5b96ed8170e4267361883.png)
2、结果展示
3、MATLAB核心代码
%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 基于多试验向量的正弦余弦算法(Multi-trial vector-based sine cosine algorithm,MTV-SCA)
function [gbestval,gbest,BestChart] = MTVSCA(D,N,MaxFES,lb,ub,fobj)
rand('seed', sum(100 * clock));
%% Variables
FES = 0;
lambda = 0.25;
nImp = [1,1,1];
ImpRate = [0,0,0];
nIter = 20;
MaxIter = MaxFES/N;
winTVPIdx = 1;
BestChart=[];
% Define the dimension of the problem
lu = [lb * ones(1, D); ub * ones(1, D)];
%% Initialization
X = repmat(lu(1, :), N, 1) + rand(N, D) .* (repmat(lu(2, :) - lu(1, :), N, 1));
for i=1:N
X_fitness(i) = fobj(X(i,:));
end
%-----------------------------------------
[gbestval,tmp1] = min(X_fitness);
gbest = X(tmp1, :);
Destination_position = gbest;
Destination_fitness = gbestval;
%% %% ======================================================================%%%%
iter = 0;
nFES = [0,0,0];
repeat = floor(N / D);
copy = mod(N,D);
% Chaos coefficients
CC = chaos_coefficient(MaxIter);
%%
while FES < MaxFES
iter = iter +1;
%% %% ===========================Transformation Matrix:: M =====================================%%%%
M_tril = tril(ones(D,D)); %lower triangular matrix
if (copy == 0)&&(N ~= D)
M_tril2= repmat(M_tril, repeat, 1);
else
M_tril2 = repmat(M_tril, repeat, 1);
added_row = M_tril(1:copy,:);
M_tril2 = [M_tril2;added_row];
end
%for M
Temp = M_tril2;
Temp2 = zeros(N,D);
%STEP1
[nRows,nCols] = size(Temp);
[~,idx] = sort(rand(nRows,nCols),2);
idx = (idx-1)*nRows + ndgrid(1:nRows,1:nCols);
Temp2(:) = Temp(idx);
M_tmp = Temp2;
M_step2 = M_tmp(randperm(size(M_tmp, 1)), :); %STEP 2:permute row of matrix
M = M_step2;
%for M_bar
M_bar = ~M;
%% %% ===========================Distribution=====================================%%%%
if mod(iter,nIter) == 0
ImpRate(1) = nImp(1)/nFES(1);
ImpRate(2) = nImp(2)/nFES(2);
ImpRate(3) = nImp(3)/nFES(3);
[~,winTVPIdx] = max(ImpRate);
nImp = [1,1,1]; ImpRate = [0,0,0]; nFES = [0,0,0];
end
permutation = randperm(N);
if winTVPIdx == 1
array_PoolTVP2 = permutation(1:lambda*N);
array_PoolTVP1 = permutation(lambda*N+1:2*lambda*N);
array_SCTVP = permutation(2*lambda*N+1:end);
elseif winTVPIdx == 2
array_PoolTVP2 = permutation(1:lambda*N);
array_SCTVP = permutation(lambda*N+1:2*lambda*N);
array_PoolTVP1 = permutation(2*lambda*N+1:end);
elseif winTVPIdx == 3
array_SCTVP = permutation(1:lambda*N);
array_PoolTVP1 = permutation(lambda*N+1: 2*lambda*N);
array_PoolTVP2 = permutation(2*lambda*N+1:end);
end
nFES = nFES + [length(array_SCTVP),length(array_PoolTVP1),length(array_PoolTVP2)];
% end
%% %% ===========================Sine cosine trial vector producer (SC-TVP)=====================================%%%%
if ~isempty(array_SCTVP)
pop1 = X(array_SCTVP,:);
fit1 = X_fitness(array_SCTVP);
popsize1 = length(array_SCTVP);
a = 2;
r1=a-iter*((a)/MaxIter); % r1 decreases linearly from a to 0
% Update the position of solutions with respect to destination
for i=1:popsize1 % in i-th solution
for j=1:D % in j-th dimension
% Update r2, r3, and r4
r2=(2*pi)*rand();
r3=2*rand;
r4=rand();
if r4<0.5
SCTVP_pop(i,j)= pop1(i,j)+(r1*sin(r2)*abs(r3*Destination_position(j)-pop1(i,j)));
else
SCTVP_pop(i,j)= pop1(i,j)+(r1*cos(r2)*abs(r3*Destination_position(j)-pop1(i,j)));
end
end
end
end
% -------------------------------------------------------------------------
% Boundary checking
SCTVP_pop = boundConstraint2(SCTVP_pop, lu);
for i=1:popsize1
SCTVP_fit(i) = fobj(SCTVP_pop(i,:));
end
tmp = (fit1 <= SCTVP_fit);
temp1 = repmat(tmp',1,D);
popnew1 = temp1 .* pop1 + (1-temp1) .* SCTVP_pop;
nImp(1) = nImp(1) + sum(tmp == 0);
X_trial(array_SCTVP,:) = popnew1;
%% %% ===========================Pool trial vector producer (Pool-TVP)=====================================%%%%
if ~isempty(array_PoolTVP1)
array_PoolTVP1 = [array_PoolTVP1,array_PoolTVP2];
Pool_pop = X(array_PoolTVP1,:);
Pool_fit = X_fitness(array_PoolTVP1);
Pool_popsize = length(array_PoolTVP1);
spara = randperm(4)';
Str_num = randi([1,size(spara,1)],Pool_popsize,1);
S1_x = find(Str_num==1); S2_x = find(Str_num==2); S3_x = find(Str_num==3); S4_x = find(Str_num==4);
% == == == == == == == == == ==
% if (Str_num(i,1)==1) % S1_TVP
r0 = 1 : length(S1_x);
popAll = X;
[r1, r2] = gnR1R2(length(S1_x), length(S1_x), r0);
[r3, r4] = gnR1R2(length(S1_x), length(S1_x), r0);
Pool_TVP(S1_x,:) = Destination_position + CC.Chebyshev(iter)*(Pool_pop(r1,:)-Pool_pop(r2,:)) + rand.*(Pool_pop(r3,:)-Pool_pop(r4,:));
Pool_TVP(S1_x,:) = M(array_PoolTVP1(S1_x),:) .* Pool_pop(S1_x,:) + M_bar(array_PoolTVP1(S1_x),:) .* Pool_TVP(S1_x,:);
% if (Str_num(i,1)==2) % S2_TVP
r0 = 1 : length(S2_x);
popAll = X;
[r1, r2] = gnR1R2(length(S2_x), length(S2_x), r0);
[r3, r4] = gnR1R2(length(S2_x), length(S2_x), r0);
Pool_TVP(S2_x,:) = Pool_pop(r1,:) + rand.*((Pool_pop(r2,:)-Pool_pop(r3,:)));
Pool_TVP(S2_x,:) = M(array_PoolTVP1(S2_x),:) .* Pool_pop(S2_x,:) + M_bar(array_PoolTVP1(S2_x),:) .* Pool_TVP(S2_x,:);
% if (Str_num(i,1)==3) % S3_TVP
r0 = 1 : length(S3_x);
popAll = X;
[r1, r2] = gnR1R2(length(S3_x), length(S3_x), r0);
[r3, r4] = gnR1R2(length(S3_x), length(S3_x), r0);
Pool_TVP(S3_x,:) = Pool_pop(S3_x,:) + CC.Sinsudal(iter) .* (Pool_pop(r1,:)-Pool_pop(S3_x,:)) + rand .* (Pool_pop(r3,:)-Pool_pop(r4,:));
% if (Str_num(i,1)==4) % S4_TVP
r0 = 1 : length(S4_x);
popAll = X;
[r1, r2] = gnR1R2(length(S4_x), length(S4_x), r0);
Pool_TVP(S4_x,:) = Pool_pop(S4_x,:) + (cos(iter/MaxIter).*sin(rand*(iter/MaxIter))).*(Pool_pop(r1,:)-Pool_pop(r2,:));
end
% -------------------------------------------------------------------------
% Boundary checking
Pool_TVP = boundConstraint2(Pool_TVP, lu);
for i=1:Pool_popsize
Pool_TVP_fit(i) = fobj(Pool_TVP(i,:));
end
tmp = (Pool_fit <= Pool_TVP_fit);
temp2 = repmat(tmp',1,D);
popnew2 = temp2 .* Pool_pop + (1-temp2) .* Pool_TVP;
nImp(2) = nImp(2) + sum(tmp == 0);
X_trial(array_PoolTVP1,:) = popnew2;
%% ================================================================%%%%
for i=1:N
mixVal_trial(i) = fobj(X_trial(i,:));
end
bin = (mixVal_trial < X_fitness)';
X(bin==1,:) = X_trial(bin==1,:);
X_fitness(bin==1) = mixVal_trial(bin==1);
[Destination_fitness, Idx] = min(X_fitness);
Destination_position = X(Idx,:);
BestChart = [BestChart Destination_fitness];
%% ================================================================%%%%
FES = FES + N;
clear SCTVP_pop Pool_TVP
clear SCTVP_fit Pool_TVP_fit
end
%% ================================================================%%%%
gbestval = Destination_fitness;
gbest = Destination_position;
end
微信公众号搜索:淘个代码,获取更多免费代码
%禁止倒卖转售,违者必究!!!!!
%唯一官方店铺:https://mbd.pub/o/author-amqYmHBs/work
%代码清单:https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu
参考文献
[1]Nadimi-Shahraki M H, Taghian S, Javaheri D, et al. MTV-SCA: multi-trial vector-based sine cosine algorithm[J]. Cluster Computing, 2024: 1-45.
完整代码获取
后台回复关键词:
TGDM813
获取更多代码:
或者复制链接跳转:
https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu