2024新算法波搜索算法,原理详解,MATLAB代码免费获取

波搜索算法(Wave search algorithm,WSA)是一种受自然启发的群智能优化算法。受雷达技术的启发,波搜索算法(WSA)不仅首次借鉴了工程技术,进行了独特的算法设计,而且利用了待优化问题的梯度信息,并采用了多种改进的贪婪机制,使其准确、高效、灵活、适应性强。WSA算法的优越性通过使用一组丰富的测试函数进行测试,并将其与最先进和高引用算法进行比较来实验证明。最后,将WSA算法应用于六个工程问题。实验结果表明,WSA算法的优化能力优于其他最先进的优化算法,可以有效地解决实际工程问题。

该算法于2024年提出,发表于计算机领域四区期刊The Journal of Supercomputing上。

b39eca28862ee0b8a7bdaee2375e704b.png

雷达技术是一种利用电磁波探测目标位置、速度和形状的无线通信技术。它通过发射无线电波,接收反射回波,并对回波进行处理和分析,实现对目标的检测、定位、跟踪和识别。我们将模拟雷达工作过程中发射、反射和接收波的过程。

bed43055f7cc5a591c1193305afd4c60.png

1、算法原理

(1)初始化阶段

首先,本文需要执行一系列初始化准备。设粒子数为n,待优化问题维数为d,用矩阵模拟电磁波粒子W的位置:

用f ([Wn1,Wn2,···Wnd])表示第n个个体的适应度值,种群的适应度值可以用以下向量表示:

最后,准备n个随机数k1, k2......Kn从0到1,初始化粒子位置。

其中xi为均匀化ki, x * I为x中的随机值,lb和ub为搜索空间的上下边界。

最后,准备n个随机数k1, k2......Kn从0到1,初始化粒子位置。

其中xi为均匀化ki, x * I为x中的随机值,lb和ub为搜索空间的上下边界。

(2)全球探索:

式中,Wmin是由W各维上的最小值组成的向量,Wmax是由W各维上的最大值组成的向量,fmean是所有粒子适应度值的平均值,r1是0到1之间的随机数,t是当前迭代次数,t是总迭代次数。该式的好处是可以逐步缩小搜索范围,新生成的点在缩小的范围内生成,提高了搜索效率。这是一种改进的贪婪机制,它控制种群在全局最优位置附近的位置。

(3)局部开发(t < 0.2T):

发送电磁波:

式中σ=−(5t/T−2)q 25(5t/T−2)2 + 0.7,σ为波形大小控制系数,m为元素服从标准正态分布并按顺序排列的列向量,Wbest为当前最优位置,Wl为W按与Wbest的接近程度重新排列后的位置矩阵,fmax是组中最大的适应度值。上式的作用是模拟电磁波向外扩散,减少陷入局部最优的可能性,提高搜索效率。上式是一种改进的贪心机制,其作用是当群体位置向外波动时,使群体位置不劣于当前群体位置。

反射电磁波:

式中W+εi = Wi +ε, W−εi = Wi−ε, ε = 10−6,g为梯度,α为阶跃系数,α的初始值设为0.45,最终的步长由一次步长试验确定。步长试验方法如下:如果初始步长迭代后的适应度值小于等于当前适应度值,则α = 1.5α,否则α = 0.5α。该式采用中心差分法拟合待优化问题的解析信息,用于搜索最优解,以提高搜索效率和准确性。

接收电磁波:

式中,δ为接受系数,δ = 0.6+(1.2−0.5)sin(tπ 2T), η为服从正态分布的随机数。W * best是通过对历史最优位置进行卷积得到的一致最优位置, I1 = I2 = I3···= It = 1/t。λ为校正因子,λ = (2t/T−0.7)/(0.78 + |2t/T−0.7|)+ 1。R2,r3,r4,r5是0到1的随机数。该式模拟雷达通常正常接收电磁波,但有时会受到干扰,需要进行校正和处理。其作用是使粒子群向当前最优方向搜索。同时,有一定的概率会向W方向偏转,以减少陷入局部最优的可能性。

另外,广义的边界限制规则是将越过边界的粒子放在边界上。我们发现这种方法降低了粒子群的多样性。因此,我们建议将超出边界的粒子随机设置在搜索范围内。数学表达式为:

ff5435dcdaa51c1a6bbefcf99679c8d6.png

其中,lb和ub分别为搜索范围的下边界和上边界,r为元素值为0 ~ 1的d维随机化列向量。

基于前面的讨论,本文提出的WSA算法的伪代码如下所示。

8213ac94e29da0cc3d9412cbbcfa609f.png

2、结果展示

6002cb1966759015cda7d88be53a0422.png

20a9bb4316f0097c9646c11dfc2480d5.png

575be365256bb5f7a53f6fc04e7f0fe1.png

3、MATLAB核心代码

%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 波搜索算法(Wave search algorithm,WSA)
%%
function [Group_Best_Score,Group_Best_Pos,WAR_curve]=WSA0(N,T,lb,ub,dim,fobj)
ub = ub.*ones(dim,1);
lb = lb.*ones(dim,1);
W1n=0.4*N;
W2n=0.2*N;
W3n=0.4*N;
%% initialization
WSA_curve=zeros(1,T);
random_nums = rand(dim,N);
uniform_nums = cumsum(random_nums,2) ./ max(cumsum(random_nums,2),[],2);
[m, t] = size(uniform_nums);
for i = 1:m
    uniform_nums(i, :) = uniform_nums(i, randperm(t));
end
W=lb+uniform_nums.*(ub-lb);

for i=1:N
    Fitness_W(i)=fobj((W(:,i))');
end
Fitness_W1= Fitness_W(1:W1n);
Fitness_W2= Fitness_W(W1n+1:W1n+W2n);
Fitness_W3= Fitness_W(W1n+W2n+1:N);
[A,index]=sort(Fitness_W);
Best_Pos=W(:,index(1));
Best_Score=A(1);
W1_Pos=W(:,index(1));
W1_Score=A(1);
W2_Pos=W(:,index(1));
W2_Score=A(1);
W3_Pos=W(:,index(1));
W3_Score=A(1);
Group_Best_Pos=Best_Pos;
Group_Best_Score=Best_Score;
W1=W(:,index(1:W1n));
W2=W(:,index(W1n+1:W2n+W1n));
W3=W(:,index(W2n+W1n+1:N));
F=[Best_Score];
WB=[Best_Pos];
t=0;
L=0;
%% Start Iteration
while t<T
    Wmax=max(W,[],2);
    Wmin=min(W,[],2);
    for j=1:N
        newW(:,j)=Wmin+rand(dim,1).*(Wmax-Wmin);
    end
    for i=1:N
        ub_flag=newW(:,i)>=ub;
        lb_flag=newW(:,i)<=lb;
        newW(:,i)=newW(:,i).*(~(ub_flag+lb_flag))+(lb+rand(dim,1).*(ub-lb)).*ub_flag+(lb+rand(dim,1).*(ub-lb)).*lb_flag;
    end
    Fm=mean(Fitness_W);
    for i=1:N
        f=fobj(newW(:,i)');
        if f<=Fm
            Fitness_W(i)=f;
            W(:,i)=newW(:,i);
        end
    end
    [F_x1,index]=sort(Fitness_W);
    if F_x1(1)< Best_Score
        Best_Pos=W(:,index(1));
        Best_Score=F_x1(1);
    end
    if L>1||t>0.1*T
        %%  emit electromagnetic waves
        theta=-(5*t/T-2)./sqrt(25+25*(5*t/T-2).^2)+0.8;
        WPos_copy = repmat(Best_Pos, 1, size(W1,2));
        distances = abs(W1 - WPos_copy);
        [~, index] = sort(distances,2);
        new_W1 = zeros(size(W1));
        random_values1 = randn(size(W1, 1), size(W1, 2));
        random_values = sort(random_values1, 2);
        for j = 1:size(W1, 2)
            for i=1:size(W1, 1)
                new_W1(i,j) = Best_Pos(i) + (W1(i,j) - Best_Pos(i)) .* (1 + random_values(i,index(i,j)))./theta;
            end
        end
        for i=1:W1n
            ub_flag=new_W1(:,i)>ub;
            lb_flag=new_W1(:,i)<lb;
            new_W1(:,i)=new_W1(:,i).*(~(ub_flag+lb_flag))+(lb+rand(dim,1).*(ub-lb)).*ub_flag+(lb+rand(dim,1).*(ub-lb)).*lb_flag;
        end
        for i=1:W1n
            f=fobj((new_W1(:,i))');
            if f<max(Fitness_W1)
                Fitness_W1(i)=f;
                W1(:,i)=new_W1(:,i);
            end
            if f<W1_Score
                W1_Score=f;
                W1_Pos=new_W1(:,i);
            end
        end
        if W1_Score<Best_Score
            Best_Score=W1_Score;
            Best_Pos=W1_Pos;
        end
        for i=1:W1n
            A =  W1(:,i);
            indices = randperm(dim, floor(dim*rand+1));
            C = zeros(dim, 1);
            C(indices) = A(indices);
            C(setdiff(1:dim, indices)) = Best_Pos(setdiff(1:dim, indices));
            new_W1(:,i)=C;
        end
        for i=1:W1n
            f=fobj((new_W1(:,i))');
            if f<Fitness_W1(i)
                Fitness_W1(i)=f;
                W1(:,i)=new_W1(:,i);
            end
            if f<W1_Score
                W1_Score=f;
                W1_Pos=new_W1(:,i);
            end
        end
        if W1_Score<Best_Score
            Best_Score=W1_Score;
            Best_Pos=W1_Pos;
        end
        if W1_Score<Best_Score
            Best_Score=W1_Score;
            Best_Pos=W1_Pos;
        end
        [~,indexc]=sort(Fitness_W1);
        W1=W1(:,indexc);
        half_lengthc = floor(size(W1, 2)/2);
        %% reflected electromagnetic waves
        [~,index1]=sort(Fitness_W2);
        W2= W2(:, index1);
        for i=1:W2n
            t1=0.75+exp(-i/W2n) ;
            W2(:,i)=-t1*randn*cos((pi*i)/W2n)*(Best_Pos-W2(:,i))+0.8*W2(:,i);
            ub_flag=W2(:,i)>ub;
            lb_flag=W2(:,i)<lb;
            W2(:,i)=(W2(:,i).*(~(ub_flag+lb_flag)))+ub.*ub_flag+lb.*lb_flag;
        end
        for i=1:W2n
            Fitness_W2(i)=fobj((W2(:,i))');
            if Fitness_W2(i)<W2_Score
                W2_Score=Fitness_W2(i);
                W2_Pos=W2(:,i);
            end
        end
        if W2_Score<Best_Score
            Best_Score=W2_Score;
            Best_Pos=W2_Pos;
        end
        [~,indexb]=sort(Fitness_W2);
        W2=W2(:,indexb);
        half_lengthb = floor(size(W2, 2)/2);
        
        %%  receive electromagnetic waves
        for i=1:W3n
            Fitness_W3(i)=fobj((W3(:,i))');
        end
        lamda=((2*t)/T-0.7)/(0.78+abs((2*t)/T-0.7))+1;
        for i=1:W3n
            if rand>0.05
                u1=0.6+(1.2-0.5)*sin((pi*t)/(2*T));
                new_W3(:,i)=W3(:,i)+u1*rand*(Best_Pos-W3(:,i))+randn*cos((pi*i)/W3n)*(W3_Pos-W3(:,i));
            else
                kernel= 1/size(WB,2)*ones(1, size(WB,2));
                Px = conv2(WB, kernel, 'valid');
                new_W3(:,i)=W3(:,i)+lamda*rand*(Best_Pos-W3(:,i))+0.5*rand*(1-lamda)*(Px-W3(:,i));
            end
            ub_flag=new_W3(:,i)>ub;
            lb_flag=new_W3(:,i)<lb;
            new_W3(:,i)= new_W3(:,i).*(~(ub_flag+lb_flag))+(lb+rand(dim,1).*(ub-lb)).*ub_flag+(lb+rand(dim,1).*(ub-lb)).*lb_flag;
        end
        for i=1:W3n
            f=fobj((new_W3(:,i))');
            if f<Fitness_W3(i)
                Fitness_W3(i)=f;
                W3(:,i)=new_W3(:,i);
            end
            if f<W3_Score
                W3_Score=f;
                W3_Pos=new_W3(:,i);
            end
        end
        if W3_Score<Best_Score
            Best_Score=W3_Score;
            Best_Pos=W3_Pos;
        end
        [~,indexd]=sort(Fitness_W3);
        W3=W3(:,indexd);
        half_lengthd = floor(size(W3, 2)/2);
        W2(:, half_lengthb+1:end) = W3(:, 1:half_lengthd/2);
        W1(:, half_lengthc+1:end) = W3(:, 1:half_lengthd);
        W=[W2,W1,W3];
        
        %% Fitted gradient descent method
        alpha=0.3*ones(1,N);
        G1=[];
        delta = 0.000001;
        for j=1:N
            g1 = zeros(dim,1);
            for i = 1:dim
                W_plus=W(:,j);
                W_plus(i) = W(i,j) + delta;
                W_minus=W(:,j);
                W_minus(i) = W(i,j) - delta;
                g1(i) = (fobj(W_plus') - fobj(W_minus')) / (2*delta);
            end
            G1=[G1,g1];
        end
        
        for j=1:N
            nW(:,j) = W(:,j) - alpha(j)* G1(:,j);
            f=fobj(nW(:,j)');
            if f<Fitness_W(j)
                alpha(j)=alpha(j)*1.6;
            else
                alpha(j)=alpha(j)/1.6;
            end
        end
        
        for j=1:N
            newW(:,j) = W(:,j) - alpha(j)* G1(:,j);
        end
        
        for i=1:N
            f=fobj((newW(:,i))');
            if f<Fitness_W(i)
                Fitness_W(i)=f;
                W(:,i)=newW(:,i);
            end
            if f<Best_Score
                Best_Score=f;
                Best_Pos=newW(:,i);
            end
        end
        
    end
    Group_Best_Score=Best_Score;
    Group_Best_Pos=Best_Pos;
    disp( ['Best_Score',num2str(Group_Best_Score)])
    F=[F,Group_Best_Score];
    WB=[WB,Best_Pos];
    if t>1
        if F(t)==F(t-1)
            L=L+1;
        end
    end
    t=t+1; 
    WAR_curve(t)=Group_Best_Score;
end
end

参考文献

[1]Zhang H, San H, Sun H, et al. A novel optimization method: wave search algorithm[J]. The Journal of Supercomputing, 2024: 1-36.


完整代码获取

后台回复关键词:

TGDM833

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淘个代码_

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值