粒子群优化算法(PSO)的程序实现

     本文内容参考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)

扫描二维码关注公众号,回复: 5966002 查看本文章

      其中: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)

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

转:https://blog.csdn.net/feq123/article/details/80933051

猜你喜欢

转载自blog.csdn.net/eric_e/article/details/89362408