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