粒子群优化算法(PSO)最初是模拟鸟群觅食行为而发展起来的一种基于群体协作的随机搜索算法。而通过对动物社会行为的观察,发现在群体中对信息的社会共享提供一个演化的优势,并以此作为开发算法的基础。通过加入近邻的速度匹配、并考虑了多维搜索和根据距离的加速,形成了 PSO 的最初版本。
概念
设想这样一个场景:一群鸟在随机搜索食物,而这个区域里只有一块食物。所有的鸟都不知道食物在哪里,但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢?
最简单有效的就是搜寻目前离食物最近的鸟的周围区域,根据自己飞行的经验判断食物的所在。鸟群在整个搜寻的过程中,通过相互传递各自的信息,让其他的鸟知道自己的位置,通过这样的协作,来判断自己找到的是不是最优解,同时也将最优解的信息传递给整个鸟群,最终,整个鸟群都能聚集在食物源周围,即找到了最优解。
粒子群优化算法中,每个优化问题的解都是搜索空间中的一只鸟,我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值,每个粒子还有一个速度决定他们飞翔的方向和距离,然后粒子们就追随当前的最优粒子在解空间中搜索。
粒子群优化算法的目标是使所有粒子在多维超体中找到最优解。首先给空间中的所有粒子分配初始随机位置和初始随机速度。然后根据每个粒子的速度、问题空间中已知的最优全局位置和粒子已知的最优位置依次推进每个粒子的位置。随着计算的推移,通过探索和利用搜索空间中已知的有利位置,粒子围绕一个或多个最优点聚集或聚合。
粒子群优化算法的流程
-
在初始化范围内,对粒子群进行随机初始化,包括随机位置和速度
设置最大的速度区间,防止超出最大的区间。位置信息即为整个搜索空间,我们在速度区间和搜索空间上随机初始化速度和位置 -
计算每个粒子的适应值
-
更新粒子个体的历史最优位置
-
更新粒子群体的历史最优位置
-
更新粒子的速度和位置
更新公式为:
其中: 为惯性权重,调节搜索范围; 为加速度常数,调节学习最大步长; 为随机函数,取值范围 ,增加搜索随机性; 为第 i 个粒子经历过的最好位置; 为所有粒子经历过的最好位置 -
若未达到终止条件,则转第2步
终止条件为最大迭代次数或全局最优位置满足最小界限
流程图:
案例解读
使用 MatLab 语言
初始化种群
% 求这个函数的最大值
f= @(x)x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x);
figure(1);
ezplot(f,[0,0.01,20]);
N = 50; % 初始种群个数
d = 1; % 空间维数
ger = 100; % 最大迭代次数
limit = [0, 20]; % 设置位置参数限制
vlimit = [-1, 1]; % 设置速度限制
w = 0.8; % 惯性权重
c1 = 0.5; % 自我学习因子
c2 = 0.5; % 群体学习因子
for i = 1:d
x = limit(i, 1) + (limit(i, 2) - limit(i, 1)) * rand(N, d);%初始种群的位置
end
v = rand(N, d); % 初始种群的速度
xm = x; % 每个个体的历史最佳位置
ym = zeros(1, d); % 种群的历史最佳位置
fxm = zeros(N, 1); % 每个个体的历史最佳适应度
fym = -inf; % 种群历史最佳适应度
hold on
plot(xm, f(xm), 'ro');title('初始状态图');
figure(2)
初始化种群的位置分布:
群体更新
iter = 1;
record = zeros(ger, 1); % 记录器
while iter <= ger
fx = f(x) ; % 个体当前适应度
for i = 1:N
if fxm(i) < fx(i)
fxm(i) = fx(i); % 更新个体历史最佳适应度
xm(i,:) = x(i,:); % 更新个体历史最佳位置
end
end
if fym < max(fxm)
[fym, nmax] = max(fxm); % 更新群体历史最佳适应度
ym = xm(nmax, :); % 更新群体历史最佳位置
end
% 速度更新
v = v * w + c1 * rand * (xm - x) + c2 * rand * (repmat(ym, N, 1) - x);
% 边界速度处理
v(v > vlimit(2)) = vlimit(2);
v(v < vlimit(1)) = vlimit(1);
x = x + v; % 位置更新
% 边界位置处理
x(x > limit(2)) = limit(2);
x(x < limit(1)) = limit(1);
record(iter) = fym; %最大值记录
x0 = 0 : 0.01 : 20;
plot(x0, f(x0), 'b-', x, f(x), 'ro');
title('状态位置变化')
pause(0.1)
iter = iter+1;
end
figure(3);
plot(record);
title('收敛过程')
x0 = 0 : 0.01 : 20;
figure(4);plot(x0, f(x0), 'b-', x, f(x), 'ro');title('最终状态位置')
disp(['最大值:',num2str(fym)]);
disp(['变量取值:',num2str(ym)]);
优化过程:
转载:https://blog.csdn.net/weixin_44613063/article/details/104204613