本文内容参考matlab R2016a完全自学一本通。

     粒子群优化算法(PSO)属于进化算法的一种,它从随机解出发,通过迭代找到最优解。该算法通过适应度来评价解的品质,并通过追随当前搜索到的最优值来寻找全局最优。

     假设在一个D维的目标搜索空间中,即每个粒子(解)都是一个D维的向量,粒子群由N个粒子构成,则其中第i个粒子可以表示为:

      Xi = (xi1,xi2,...,xiD),其中i=1,2,3,...,N

第i个粒子的飞行速度也是一个D维的向量,记为:

     Vi = (vi1,vi2,...,viD),其中i=1,2,3,...,N

并设定第i个粒子迄今为止搜索到的最优位置为个体极值,记为pi,而整个粒子群迄今为止搜索到的最优位置为全局极值,记为pg。同样,pi、pg均为D维向量。

      在整个搜索过程中,粒子根据如下公式更新自己的速度和位置:

      Vi = w*Vi+c1*r1*(pi-Xi)+c2*r2*(pg-Xi)            (1)

      Xi = Xi+Vi                                                         (2)

      其中:c1、c2为学习因子,也称加速常数,r1、r2为[0,1]范围内的均匀随机数。

      其中(1)式由三个部分组成:

1、第一部分为“惯性”,代表粒子有维持自己先前速度的趋势

2、第二部分为“认知”,代表粒子有向自身历史最佳位置逼近的趋势

3、第三部分为“社会”,代表粒子有群体历史最佳位置逼近的趋势

以下是使用matlab实现粒子群优化算法(PSO)的代码:


function [xm,fv] = PSO(fitness,N,c1,c2,w,M,D)
% 粒子群优化算法,给定初始化条件
% c1学习因子1
% c2学习因子2
% w惯性权重
% M最大迭代次数
% D搜索空间维数
% fitness待优化的目标函数,适应度函数



% 初始化种群的个体
format long;
for i = 1:N
    for j = 1:D
        x(i,j) = randn;
        v(i,j) = randn;
    end
end



% 计算各粒子的适应度,并初始化个体最优Pi和全局最优Pg

for i = 1:N 
 
    y(i) = fitness(x(i,:)); 
 
    p(i,:) = x(i,:); 
 
end 
 
pg = x(N,:); 
 
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*(p(i,:)-x(i,:))+c2*rand*(pg-x(i,:)); 
 
        x(i,:) = x(i,:)+v(i,:); 
 
        if fitness(x(i,:)) < y(i) 
 
            y(i) = fitness(x(i,:)); 
 
            p(i,:) = x(i,:); 
 
        end 
 
        if y(i) < fitness(pg) 
 
            pg = p(i,:); 
 
        end 
 
    end 
 
    Pbest(t) = fitness(pg); 
 
end


% 给出最后计算结果
disp('*******************************************')
disp('目标函数取最小值时的自变量:')
xm = pg'
disp('目标函数最小值:')
fv = fitness(pg)
disp('******************************************')





fitness是待优化的目标函数,也称适应度函数,这里给出一个例子:

   

function F=fitness(x) 
 
    F = sum(x.^2+x-6);


   
在命令行窗口输入代码:

[xm1,fv1] = PSO(@fitness,50,1.5,2.5,0.5,100,3)


运行后即可得到目标函数最小值以及最小值时对应的自变量。