1.简介
粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
2.基本思想
粒子群算法是模拟群体智能所建立起来的一种优化算法,粒子群算法可以用鸟类在一个空间内随机觅食为例,所有的鸟都不知道食物具体在哪里,但是他们知道大概距离多远,最简单有效的方法就是搜寻目前离食物最近的鸟的周围区域。对粒子群优化算法操作的一个简单解释如下:每一个粒子都代表了当前优化任务的一个可能解决方案。在每次迭代过程中,每个粒子都会朝着自己的最优解的方向加速,也会朝着种群中任何粒子迄今为止发现的全局最佳位置的方向加速。这意味着,如果一个粒子发现了一个更好的解,所有其他粒子都会靠近它,在这个过程中不断地搜索最优解。可以总结出粒子群算法地三条简单规则:(1)飞离最近的个体,以避免碰撞;(2)飞向目标;(3)飞向群体的中心。
假设存在一个维度为S的搜索空间,由m个粒子组成粒子种群,其中第i个粒子用一个S维的向量表示,具体为Xi=(xi1,xi2,…,xiS)
代入目标函数就可以算出其适应度值,适应度值的大小对应着粒子位置即可行解的好坏。另外,第i个粒子移动的速度是S 维向量,记为Vi=(vi1,vi2,…,viS)
第i个粒子搜索到的最优位置为Pi=(pi1,pi2,…,piS)整个粒子群搜索到的最优位置为Pg=(pg1,pg2,…,pgS)
3.算法流程
标准PSO算法的流程:
Step1:初始化一群微粒(群体规模为m),包括随机位置和速度;
Step2:评价每个微粒的适应度;
Step3:对每个微粒,将其适应值与其经过的最好位置Pi
作比较,如果较好,则将其作为该粒子当前的最好位置Pi
Step4:对每个微粒,将其适应值与全局最好位置Pg
作比较,如果较好,则将其作为当前全局最好位置Pg
Step5:根据(2)、(3)式调整微粒速度和位置;
Step6:未达到结束条件则转Step2。
迭代终止条件根据具体问题一般选为最大迭代次数kkk或(和)微粒群迄今为止搜索到的最优位置满足预定最小适应阈值。
4.流程图
5.代码实现
%% 清空环境
clc
clear
%% 参数初始化
%粒子群算法中的三个参数
c1 = 1.49445;%加速因子
c2 = 1.49445;
maxgen=1000; % 进化次s数
sizepop=200; %种群规模
%惯性权重
Vmax=1; %限制速度围
Vmin=-1;
popmax=5; %变量取值范围
popmin=-5;
dim=10; %适应度函数维数
func=1; %选择待优化的函数,1为Rastrigin,2为Schaffer,3为Griewank
Drawfunc(func);%画出待优化的函数,只画出二维情况作为可视化输出
%% 产生初始粒子和速度
for i=1:sizepop
%随机产生一个种群
pop(i,:)=popmax*rands(1,dim); %初始种群
V(i,:)=Vmax*rands(1,dim); %初始化速度
%计算适应度
fitness(i)=fun(pop(i,:),func); %粒子的适应度
end
%% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
gbest=pop(bestindex,:); %全局最佳
pbest=pop; %个体最佳
fitnesspbest=fitness; %个体最佳适应度值
fitnessgbest=bestfitness; %全局最佳适应度值
%% 迭代寻优
for i=1:maxgen
%w = 0.9 - 0.5*(i/maxgen)*(i/maxgen);
fprintf('第%d代,',i);
fprintf('最优适应度%f\n',fitnessgbest);
for j=1:sizepop
w = 0.9 - 0.5*(i/maxgen)*(i/maxgen);
%速度更新
V(j,:) = w*V(j,:) + c1*rand*(pbest(j,:) - pop(j,:)) + c2*rand*(gbest - pop(j,:)); %根据个体最优pbest和群体最优gbest计算下一时刻速度
V(j,find(V(j,:)>Vmax))=Vmax; %限制速度不能太大
V(j,find(V(j,:)<Vmin))=Vmin;
%种群更新
pop(j,:)=pop(j,:)+0.5*V(j,:); %位置更新
pop(j,find(pop(j,:)>popmax))=popmax;%坐标不能超出范围
pop(j,find(pop(j,:)<popmin))=popmin;
if rand>0.98 %加入变异种子,用于跳出局部最优值
pop(j,:)=rands(1,dim);
end
%更新第j个粒子的适应度值
fitness(j)=fun(pop(j,:),func);
end
for j=1:sizepop
%个体最优更新
if fitness(j) < fitnesspbest(j)
pbest(j,:) = pop(j,:);
fitnesspbest(j) = fitness(j);
end
%群体最优更新
if fitness(j) < fitnessgbest
gbest = pop(j,:);
fitnessgbest = fitness(j);
end
end
yy(i)=fitnessgbest;
end
%% 结果分析
figure;
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
6.参数对实验结果的影响
6.1 惯性权重w
由于惯性权重w过大全局寻优能力强,局部寻优能力弱;过小全局寻优能力弱,局部寻优能力强。所以,动态w能在搜索过程中线性变化可以比固态w求得更好的结果。
这里将设置函数w = 0.9 - 0.5*(i/maxgen)*(i/maxgen) (maxgen是迭代次数)
运行结果
由图可知在迭代到600次左右收敛,最优适应度为1.989918
6.2 学习因子c1,c2
令c1=c2 = 0.89886,运行结果
由图可知迭代到680次左右,种群适应度为0,无法求得最优解
令c1=c2=2.55987 运行结果
由图可知迭代50次左右 得到最优解5.969754
6.3种群规模sizepop对结果影响
令sizepop=20 运行结果
由图可知当迭代到160次左右收敛 得到最优解
令sizepop=1000 运行结果
由图可知迭代到970次左右收敛 求解速度慢
6.4 适应度函数维数dim对结果的影响
令dim=3 运行结果
由图可知过早收敛无法取得最优解
令dim=100 运行结果
由图可知迭代550次左右收敛
6.5 最大速度vmax对实验结果的影响
令vmax=0.1 运行结果
由图可知迭代到50次左右时收敛 过早得到最优解
令vmax=20 运行结果
由图可知迭代到700次左右收敛
6.6经过大量的实验令w=0.78812,c1=c2=1.49618 是一组比较好的组合
运行结果
6.7总结
①惯性权重w:w越大,微粒飞行速度越大,微粒将会以更长的步长进行全局搜索;w较小,则微粒步长小,趋向于精细的局部搜索;因此,采用动态改变w的值;在搜索初期设w取0.9,然后随着迭代次数的不断增加,逐渐降低w的值;从而达到全局最优。
②学习因子c1,c2:c1,c2具有自我总结和向优秀个体学习的能力,从而使微粒向群体内最优点靠近。c1,c2分别调节微粒向个体最优或者群体最优方向飞行的最大步长,决定微粒个体经验和群体经验对微粒自身运行轨迹的影响。学习因子较小时,可能使微粒不在最优区域移动,无法得到最优解;学习因子较大时,可使微粒迅速向最优区域移动,过早收敛。
③种群规模sizepop:种群规规模过小,算法收敛速度快,但是容易陷入局部最优;种群规模过大,算法收敛速度较慢;导致计算时间增加,而且群体数目增加到一定数目时,再增加微粒数目不再有显著的效果。
④适应度函数维数dim:维度过小,算法早熟,陷入局部最优;维度过大,求解精度提高,但算法速度慢,比较耗时。
⑤最大速度vmax:vmax过大,粒子运动速度快,微粒探索能力强,但容易越过最优的搜索空间,错过最优解;Vmax较小,容易进入局部最优,可能会使微粒无法运动足够远的距离以跳出局部最优,从而也可能找不到最优解
7.PSO算法优缺点
优点:没有交叉和变异运算,靠粒子速度完成搜索,并在迭代中只有传递最优信息,搜索速度快,需要调整的参数不多,易于实现
缺点:缺乏速度的动态调节,容易陷入局部最优,导致收敛精度低和不易收敛;不能有效解决离散及组合优化问题;对于不同问题,参数不好选择,不能高效取得最优解。