波搜索算法(Wave search algorithm,WSA)是一种受自然启发的群智能优化算法。受雷达技术的启发,波搜索算法(WSA)不仅首次借鉴了工程技术,进行了独特的算法设计,而且利用了待优化问题的梯度信息,并采用了多种改进的贪婪机制,使其准确、高效、灵活、适应性强。WSA算法的优越性通过使用一组丰富的测试函数进行测试,并将其与最先进和高引用算法进行比较来实验证明。最后,将WSA算法应用于六个工程问题。实验结果表明,WSA算法的优化能力优于其他最先进的优化算法,可以有效地解决实际工程问题。
该算法于2024年提出,发表于计算机领域四区期刊The Journal of Supercomputing上。
雷达技术是一种利用电磁波探测目标位置、速度和形状的无线通信技术。它通过发射无线电波,接收反射回波,并对回波进行处理和分析,实现对目标的检测、定位、跟踪和识别。我们将模拟雷达工作过程中发射、反射和接收波的过程。
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方向偏转,以减少陷入局部最优的可能性。
另外,广义的边界限制规则是将越过边界的粒子放在边界上。我们发现这种方法降低了粒子群的多样性。因此,我们建议将超出边界的粒子随机设置在搜索范围内。数学表达式为:
其中,lb和ub分别为搜索范围的下边界和上边界,r为元素值为0 ~ 1的d维随机化列向量。
基于前面的讨论,本文提出的WSA算法的伪代码如下所示。
2、结果展示
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