1. BBPS算法背景
BBPS算法是在标准的粒子群算法上变化而来的,通过消除速度公式对粒子群算法进行了修改,但是粒子群优化的基本原理被保留了下来:这些粒子的更新仍然受到其个体最优位置的记忆和全局最优位置的通信的影响。
标准的粒子群算法介绍:A Modified Particle Swarm Optimizer
J. Kennedy, "Bare bones particle swarms," Proceedings of the 2003 IEEE Swarm Intelligence Symposium. SIS'03 (Cat. No.03EX706), 2003, pp. 80-87, doi: 10.1109/SIS.2003.1202251.
2. 算法简介
标准的粒子群算法的速度和位置更新策略:
虽然这个速度和位置更新策略和之前的链接的速度和位置更新策略略微有点不同,但是基本上都是一致的。都是迭代地评估每个种群成员的当前位置,调整速度,并确定下一个时间步长的位置。
粒子的轨迹可以描述为:在每个维度上的个人(pbest)和最佳邻居(gbest)的先前最佳值点,以随机加权平均值为中心的循环路径。下面将检查算法的两个重要方面:这些是定义振荡中心的方法、以及定义围绕中心的可变性幅度的方法 - 振荡幅度。
3. 最佳邻居的替代方案
标准的粒子群算法是通过pbest和gbest来定义震荡中心。当邻域扩展到包括种群的所有成员时,所有粒子都会受到群中任何成员发现的最佳成功(所谓的 gbest )的影响,性能会受到影响。所以使用gbest可能有害,它倾向于将总体误导向局部最优值的过早收敛。
因此文章中还提出了Ibest,random g,FIPS作为震荡中心,但是这些操作会影响粒子振荡的居中,但不会影响其幅度。确定循环的幅度:像往常一样,由上一次迭代的速度和到中心的距离。
文章实验显示:另一方面,当振荡中心由个体(pbest)及其最佳局部邻居(非gbest)的平均值定义时,与不包括个体(pbest)的整个邻域(gbest)相比,存在小的差异。标准的 lbest square 和 FIPS square 在这些测试中表现良好。
4. 采样的分布
下图显示了在标准粒子群的一百万次迭代中测试的点的直方图,横轴代表采样的点的范围,纵轴代表采样的点所占的比例,其中pi和pg保持在±10(保持不变)。该图是一条整齐的钟形曲线,位于前两个最佳点的中间,对称地延伸到它们之外。
上图可以看出这个采样的分布就是一个正态分布(高斯分布:,当越小,样本就更加集中分布在附近)。绝大部分的点处在pi和pg之间,而且pi和pg之间距离越小,样本分布就更加集中在钟形曲线的中间。
因此,根据上图,删除粒子群公式的整个速度(v)部分。至于位置(x)的更新采用下面的方式:
t代表的迭代次数,这里采用的是pbest和gbest的均值;用pbest和gbest之间的距离差来表示。同时文中也用Ibest,random g,nhood best来代替gbest。
5.缩放步长的注意事项
在用pbest和gbest之间的差来表示效果应该是最好的。虽然这是很奇怪的,但是在差前面乘以小于1或者大于1的权重,性能并没有得到提高。
6.高斯FIPS
正态分布的中心是整个邻域的平均值,就像在 FIPS 中一样,但是没有明确的方法来确定标准差。尝试了几个版本:正态分布的标准偏差与以前一样被确定为, 在哪里Gbest被不同地定义为总体最佳、邻域最佳、随机邻域或 FIPS 邻域的中心。
7.交互概率
在之前的所有粒子群算法里面,每次都没有将pbest完全作为单独的一个变量来更新v或x,但是pbest是个体更新中十分重要的一个变量,保留部分pbest对个体独立更新的机会,是有利于算法的收敛。
因此对之前的x更新策略进行更改:
8. 算法实现与实验
测试函数:
% Ackley
function [Out] = F2(X)
T1 = -20*exp(-0.2*(sqrt(sum(X.^2,2)*1./size(X,2))));
T2 = exp(sum(cos(X*2*pi),2)*1./size(X,2));
Out = T1-T2+20+exp(1);
%D=[-32,32]
先来测试标准的PSO,迭代次数设置为3000,重复100次,取100次结果的平均值:
clc;clear;clearvars;
% 随机生成5个数据
num_initial = 5;
num_vari = 5;
% 搜索区间
upper_bound = 32;
lower_bound = -32;
iter = 3000;
w = 1;
% 随机生成5个数据,并获得其评估值
sample_x = lhsdesign(num_initial, num_vari).*(upper_bound - lower_bound) + lower_bound.*ones(num_initial, num_vari);
sample_y = F2(sample_x);
Fmin = zeros(iter, 1);
aver_Fmin = zeros(iter, 1);
for n = 1 : 100
k = 1;
% 初始化一些参数
pbestx = sample_x;
pbesty = sample_y;
% 当前位置信息presentx
presentx = lhsdesign(num_initial, num_vari).*(upper_bound - lower_bound) + lower_bound.*ones(num_initial, num_vari);
vx = sample_x;
[fmin, gbest] = min(pbesty);
for i = 1 : iter
r = rand(num_initial, num_vari);
% pso更新下一步的位置,这里可以设置一下超过搜索范围的就设置为边界
vx = w.*vx + 2 * r .* (pbestx - presentx) + 2 * r .* (pbestx(gbest, :) - presentx);
vx(vx > upper_bound) = upper_bound;
vx(vx < lower_bound) = lower_bound;
presentx = presentx + vx;
presentx(presentx > upper_bound) = upper_bound;
presentx(presentx < lower_bound) = lower_bound;
presenty = F2(presentx);
% 更新每个单独个体最佳位置
pbestx(presenty < pbesty, :) = presentx(presenty < pbesty, :);
pbesty = F2(pbestx);
% 更新所有个体最佳位置
[fmin, gbest] = min(pbesty);
% fprintf("iter %d fmin: %.4f\n", i, fmin);
Fmin(k, 1) = fmin;
k = k +1;
% w = w - 0.0002;
end
aver_Fmin = aver_Fmin + Fmin;
end
aver_Fmin = aver_Fmin ./ 100;
plot(aver_Fmin);
然后测试本文提出的基于高斯采样的PSO,gbest采用与上一个算法一致,迭代也是3000次,重复100次实验,结果取平均值。
clc;clear;clearvars;
% 随机生成5个数据
num_initial = 5;
num_vari = 5;
% 搜索区间
upper_bound = 32;
lower_bound = -32;
iter = 3000;
% 随机生成5个数据,并获得其评估值
sample_x = lhsdesign(num_initial, num_vari).*(upper_bound - lower_bound) + lower_bound.*ones(num_initial, num_vari);
sample_y = F2(sample_x);
Fmin = zeros(iter, 1);
aver_Fmin = zeros(iter, 1);
for n = 1 : 100
k = 1;
% 初始化一些参数
pbestx = sample_x;
pbesty = sample_y;
[fmin, gbest] = min(pbesty);
for i = 1 : iter
% pso更新下一步的位置,这里可以设置一下超过搜索范围的就设置为边界
r = rand;
if r > 0.5
x = pbestx;
else
x = normrnd((pbestx + pbestx(gbest, :)) ./ 2,abs(pbestx - pbestx(gbest, :)));
end
x(x > upper_bound) = upper_bound;
x(x < lower_bound) = lower_bound;
y = F2(x);
% 更新每个单独个体最佳位置
pbestx(y < pbesty, :) = x(y < pbesty, :);
pbesty = F2(pbestx);
% 更新所有个体最佳位置
[fmin, gbest] = min(pbesty);
% fprintf("iter %d fmin: %.4f\n", i, fmin);
Fmin(k, 1) = fmin;
k = k +1;
end
aver_Fmin = aver_Fmin + Fmin;
end
aver_Fmin = aver_Fmin ./ 100;
plot(aver_Fmin);
可以看出二者均能实现差不多的性能,但是基于高斯的PSO的收敛速度明显快于标准的PSO。