弹靶搜索算法(Projectile-target search algorithm, PTS)
弹靶搜索算法(PTS)是一种基于弹丸运动学的随机元启发式优化算法,用以解决现实世界中的复杂优化问题。
参考文献:Hiendro A. Projectile-target search algorithm: a stochastic metaheuristic optimization technique[J]. Int. J. Electr. Comput. Eng., 2019, 9(5): 3772-3778.
PTS算法的数学模型:
PTS算法有两个主要控制参数,以加快收敛和搜索过程,因此,它可以比任何其他优化算法更快地找到更好的全局最优值。
抛射模型:
y
(
x
)
=
x
⋅
tan
(
θ
)
−
g
⋅
x
2
2
v
2
sec
2
(
θ
)
y\left ( x \right ) =x\cdot \tan \left ( \theta \right ) -\frac{g\cdot x^{2} }{2v^{2} }\sec ^{2}\left ( \theta \right )
y(x)=x⋅tan(θ)−2v2g⋅x2sec2(θ)
该博客主要分享PTS算法的代码,并带有中英文注释!
分享不易,喜欢的请大家点赞加收藏,谢谢!
PTS算法的主程序
% Projectile-target search algorithm (PTS)
% Reference: Projectile-target search algorithm: a stochastic metaheuristic optimization technique
% Code by Luzhenhui Yangtze University
function [ybest,abest,Convergence_curv]=PTS(NP,GMAX,La,Ha,D,fobj)
% 输入
% NP:算法种群个体数量
% GMAX:算法的最大迭代次数
% La:变量的取值下界
% Ha:变量的取值上界
% D:优化变量的维度
% fobj:目标函数
% 输出
% ybest:最优适应度值
% abest:最优个体的位置信息
% Convergence_curv:每一次迭代的最优值,用于后期的迭代收敛图像
% 算法参数的初始化
La=La.*ones(1,D);
Ha=Ha.*ones(1,D);
F=0.5; % 公式(6)
ybest = inf;
iter=1;
% 算法的种群初始化
for i=1:NP
a(i,:)= La + rand(1,D).*(Ha - La); % 公式(5)
end
% 算法主要的迭代步骤
while iter <= GMAX
for i = 1:NP
y(i) = fobj(a(i,:));
if (y(i) < ybest)
ybest = y(i);
abest = a(i,:);
end
end
indnp = (0:1:NP-1);
while (iter <= GMAX)
aold = a;
ind = randperm(4);
r1 = randperm(NP);
indx = rem(indnp + ind(1),NP);
r2 = r1(indx + 1);
indx = rem(indnp + ind(2),NP);
r3 = r2(indx + 1);
ar1 = aold(r1,:);
ar2 = aold(r2,:);
ar3 = aold(r3,:);
vi = ar1 + F*(ar2 - ar3); % 公式(6)
for i = 1:NP
ytemp = fobj(vi(i,:));
if ytemp < ybest
ybest = ytemp;
abest = vi(i,:);
end
end
for i=1:NP % 边界处理
Flag4ub = vi(i,:)>Ha;
Flag4lb = vi(i,:)<La;
vi(i,:)=(vi(i,:).*(~(Flag4ub+Flag4lb)))+Ha.*Flag4ub+La.*Flag4lb;
end
g = 9.81;
q = 3;
p = 1-iter*((1)/GMAX);
v = 0.2;
m = 10;
k = p^q;
for i=1:NP
for j=1:D
d = (abs(vi(i,j)^2-a(i,j)^2))^(1/3);
v0 = v^2/(2*g);
v1 = g/(2*v^2);
v2 = g/(v^2);
mm = k*((m*(d)+v1*(d)^2-v0)/(m+v2*d));
if rand < 0.5
a(i,j) = abest(1,j)- mm; % 公式(11)
else
a(i,j) = a(i,1) + mm; % 公式(12)
end
end
end
for i=1:NP % 边界处理
Flag4ub = a(i,:)>Ha;
Flag4lb = a(i,:)<La;
a(i,:)=(a(i,:).*(~(Flag4ub+Flag4lb)))+Ha.*Flag4ub+La.*Flag4lb;
end
Convergence_curv(iter)=ybest;
iter=iter+1;
end
end
end