粒子群算法的基本概念
粒子群优化算法(PSO),属于进化算法的一种,从随机解出发,通过迭代寻求最优解。通过适应度来评价解的品质,通过搜寻当前最优来寻找全局最优。
粒子群算法的基本原理
PSO从这种模型中得到启示并用于解决优化问题。PSO中,每个优化问题的潜在解都是搜索空间中的一只鸟,称为粒子。所有的粒子都有一个由被优化的函数决定的适值(fitness value),每个粒子还有一个速度决定它们“飞行”的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。
粒子的更新方式如下:
其中,x表示粒子起始位置,v表示粒子“飞行”的速度,p表示搜索到的粒子的最优位置。
PSO初始化为一群随机粒子(随机解),然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个极值来更新自己;第一个就是粒子本身所找到的最优解,这个解称为个体极值;另一个极值是整个种群目前找到的最优解,这个极值是全局极值。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。
假设在一个D维的目标搜索空间中,有N个粒子组成一个群落,其中第i个粒子表示为一个D维的向量
第i个粒子的“飞行”速度也是一个D维的向量,记为
第i个粒子迄今为止搜索到的最优位置称为个体极值,记为
整个粒子群迄今为止搜索到的最优位置为全局极值,记为
在找到这两个最优值时,粒子根据如下的公式来更新自己的速度和位置:
由于粒子群算法具有高效的搜索能力,有利于得到多目标意义下的最优解;通过代表整个解集种群,按并行方式同时搜索多个非劣解,也即搜索到多个Pareto最优解。
同时,粒子群算法的通用性比较好,适合处理多种类型的目标函数和约束,并且容易与传统的优化方法结合,从而改进自身的局限性,更高效地解决问题。因此,将粒子群算法应用于解决多目标优化问题上具有很大的优势。
程序设计的步骤
代码展示
function[xm,fv] = PSO(fitness,N,c1,c2,w,M,D)
%%%%给定初始化条件%%%%
%c1 学习因子1
%c2学习因子2
%w惯性权重
%M最大迭代次数
%D空间搜索维数
%N初始化群体个体数目
%%%%%初始化种群的个体%%%%%
format long;
for i= 1:N
for j=1:D
x(i,j) = randn;%初始化位置
v(i,j) = randn;%初始化速度
end
end
%%%%先计算各个粒子的适应度,并初始化Pi和Pg%%%%
for i=i:N
p(i) = fitness(x(i,:));
y(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*(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
%%%给出最后的计算结果%%%%
disp('**************************************************')
disp('目标函数取得最小值的自变量:')
xm = pg
disp('目标函数取得最小值:')
fv=fitness(pg)
disp('**************************************************')
function F= fitness(x)
F=0;
for i=1:30
F = F+x(i)^2+x(i)-6
end
我的理解:要求的x是一个30维的列向量,设粒子群的个数为50个,迭代次数为100次,不段进行迭代最终得到最优解:
-0.591022648883253 -0.477305411336294 -0.495211098725992 -0.327925415609819 -0.469112380531663 -0.572272925096361 -0.695420784537853 -0.519440661344421 -0.353741976806847 -0.305355640754267 -0.587496565009467 -0.179674360848239 -0.417018741570162 -0.622872642672355 -0.453092161152071 -0.257246840116798 -0.415794898738906 -0.411510992727289 -0.533548991488808 -0.255227899268303 -0.181375877815471 -0.534845167829548 -0.412178949253427 -0.383948942090503 -0.426096906705101 -0.371715452440325 -0.304552467066547 -0.578728273209344 -0.501960176557393 -0.717847206864427
函数最小值为: -1.868505142354460e+02。