注意:这篇文章上次更新于750天前,文章内容可能已经过时。
PSO 算法代码摘抄。
原文地址:精通 MATLAB 最优化计算 第 2 版 Page 270
引言
粒子群优化算法(Particle Swarm Optimization,PSO 算法)是一种进化计算技术,由 Eberhart 博士和 kennedy 博士发明,源于对鸟群捕食行为的研究科研人最大的谎言。 PSO 算法同遗传算法类似,是一种基于迭代的优化工具。系统初始化为一组随机解,通过迭代搜寻最优值。但是并没有遗传算法用的交叉以及变异,而是粒子在解空间追随最优的粒子进行搜索。
Matlab 实现
关于算法的公式推导部分建议自行查看原始论文或者相关书籍。
function [xm, fv] = PSO(fitness,N,c1,c2,w,M,D)
% 待优化的目标函数:fitness
% 粒子数目:N
% 学习因子1:c1
% 学习因子2:c2
% 惯性权重:w
% 最大迭代次数:M
% 自变量的个数:D
%
% 目标函数取最小值时的自变量值:xm
% 目标函数的最小值:fv
format long;
for i = 1:N
for j = 1:D
x(i,j) = randn; % 随机初始化位置
v(i,j) = randn; % 随机初始化速度
end
end
for i = 1:N
p(i) = fitness(x(i,:));
y(i,:) = x(i,:);
end
pg = x(N,:); % pg 为全局最优
for i = 1:N-1
if fitness(x(i,:)) < fitness(pg)
pg = x(i,:);
end
end
for t = 1:M
for i = 1:N % 速度、位移更新
v(i,:) = w*v(i,:) + c1*rand*(y(i,:)-x(i,:)) + c2*rand*(pg-x(i,:));
x(i,:) = x(i,:) + v(i,:);
if fitness(x(i,:)) < p(i)
p(i) = fitness(x(i,:));
y(i,:) = x(i,:);
end
if p(i) < fitness(pg)
pg = y(i,:);
end
end
pbest(t) = fitness(pg);
end
xm = pg';
fv = fitness(pg);
end