2024年最新-基于多试验向量的正弦余弦算法,原理详解,MATLAB代码免费获取

传统的正弦余弦算法(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

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

其中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

MTV-SCA对应的流程图如下图所示

514a742353b5b96ed8170e4267361883.png

2、结果展示

ca59b263b1687b10ecfed5997973dbbb.png

adc4a569682c0f9c524ddb46125d188e.png

84cf3df2137badfad3f3339fc0f01de5.png

1136aab18095b7ddfcf8f094c3750dfe.png

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

获取更多代码:

67e0d9d59da21d02cfd07fbd27c1d59c.png

或者复制链接跳转:
https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu
  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
瞬时值采样比相判据算法是一种基于采样的电力系统故障检测方法。下面是正弦型、余弦型瞬时值采样比相判据算法MATLAB 代码实现,包括 fcn 模块。 ```matlab %% 瞬时值采样比相判据算法 % 定义采样频率、采样时间、阈值等参数 fs = 1000; Ts = 1/fs; K = 1.5; % 阈值 % 生成测试信号 t = 0:Ts:1; f1 = 50; % 正弦信号频率 f2 = 60; % 余弦信号频率 x1 = sin(2*pi*f1*t); x2 = cos(2*pi*f2*t); x = x1 + x2; % 瞬时值采样比相判据算法 for n = 1:length(x) if n < 2 % 跳过前两个采样点 continue; end % 计算瞬时值 v1 = x(n) - x(n-1); v2 = abs(x(n)) + abs(x(n-1)); % 计算采样比 r = v1/v2; % 判断是否超过阈值 if abs(r) > K disp(['第', num2str(n), '个采样点发生故障']); end end % fcn 模块 function [r] = sampling_ratio(x, n) % x: 采样信号向量 % n: 当前采样点下标 % r: 采样比 if n < 2 % 跳过前两个采样点 r = 0; else % 计算瞬时值 v1 = x(n) - x(n-1); v2 = abs(x(n)) + abs(x(n-1)); % 计算采样比 r = v1/v2; end end ``` 在上述代码中,我们首先定义了采样频率、采样时间和阈值等参数。接着生成了一个包含正弦信号和余弦信号的测试信号,用于模拟电力系统中的实际信号。然后使用 for 循环遍历采样信号的每个采样点,计算该采样点的瞬时值和采样比,并判断是否超过了阈值。最后,我们还定义了一个 fcn 模块,用于计算每个采样点的采样比。 需要注意的是,上述代码只是一个简单的示例,实际应用中还需要考虑信号的噪声、采样频率的选择等因素,以确保算法的准确性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淘个代码_

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值