本文内容参考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)
运行后即可得到目标函数最小值以及最小值时对应的自变量。