1.案例背景
1.1 PSO算法介绍
粒子群优化算法(Particle Swarm Optimization,PSO)是计算智能领域,除了蚁群算法,鱼群算法之外的一种群体智能的优化算法,该算法最早是由Kennedy和 Eberhart 在1995年提出的。PSO算法源于对鸟类捕食行为的研究,鸟类捕食时,每只鸟找到食物最简单有效的方法就是搜寻当前距离食物最近的鸟的周围区域。
PSO算法是从这种生物种群行为特征中得到启发并用于求解优化问题的,算法中每个粒子都代表问题的一个潜在解,每个粒子对应一个由适应度函数决定的适应度值。粒子的速度决定了粒子移动的方向和距离,速度随自身及其他粒子的移动经验进行动态调整,从而实现个体在可解空间中的寻优。
PSO算法首先在可解空间中初始化一群粒子,每个粒子都代表极值优化问题的一个潜在最优解,用位置、速度和适应度值三项指标表示该粒子特征,适应度值由适应度函数计算得到,其值的好坏表示粒子的优劣。粒子在解空间中运动,通过跟踪个体极值 Pbest和群体极值Gbest更新个体位置;个体极值Pbest是指个体所经历位置中计算得到的适应度值最优位置,群体极值Gbest是指种群中的所有粒子搜索到的适应度最优位置。粒子每更新一次位置,就计算一次适应度值,并且通过比较新粒子的适应度值和个体极值、群体极值的适应度值更新个体极值 Pbest和群体极值 Gbest位置。
假设在一个D维的搜索空间中,有n个粒子组成的种群X=(X1,X1 ,…,Xn),其中第i个粒子表示为一个D维的向量Xi=[xi1,xi22,…,xiD],代表第i个粒子在D维搜索空间中的位置,亦代表问题的一个潜在解。根据目标函数即可计算出每个粒子位置X对应的适应度值。第i个粒子的速度为Vi=[Vi1 ,Vi2.…,ViD],其个体极值为Pi=[Pi1,Pi2,…,PiD],种群的全局极值为Pg=[Pg1,Pg2,…,PgD]。
在每一次迭代过程中,粒子通过个体极值和全局极值更新自身的速度和位置,更新公式如下:
1.2 非线性函数
算例中的非线性函数为:
从函数图形可以看出,该函数有很多局部极小值点,最小值点为0,最小值位置为(0,0)。
2.模型建立
基于PSO算法的函数极值寻优算法流程图如图35-2所示。
其中,粒子和速度初始化对初始粒子位置和粒子速度赋予随机值。根据式(35-3)计算粒子适应度值。根据初始粒子适应度值确定个体极值和群体极值。根据式(35-1)与式(35-2)更新粒子速度和位置。根据新种群中粒子适应度值更新个体极值和群体极值。
对于本案例来说,适应度函数为Ackley函数表达式,适应度值为函数值。种群粒子数为20,每个粒子的维数为2,算法迭代进化次数为100。
3.编程实现
根据PSO算法原理,在 MATLAB中编程实现基于 PSO算法的函数极值寻优算法。
3.1 适应度函数
function y = fun(x)
%函数用于计算粒子适应度值
%x input 输入粒子
%y output 粒子适应度值 y=-20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+exp(1);%y=x(1)^2-10*cos(2*pi*x(1))+10+x(2)^2-10*cos(2*pi*x(2))+10;
3.2 主函数
%% 该代码为基于PSO的函数极值寻优%% 清空环境
clc
clear%% 参数初始化
%粒子群算法中的两个参数
c1 = 1.49445;
c2 = 1.49445;maxgen=500; % 进化次数
sizepop=100; %种群规模Vmax=1;
Vmin=-1;
popmax=5;
popmin=-5;%% 产生初始粒子和速度
for i=1:sizepop%随机产生一个种群pop(i,:)=5*rands(1,2); %初始种群V(i,:)=rands(1,2); %初始化速度%计算适应度fitness(i)=fun(pop(i,:)); %染色体的适应度
end%% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
zbest=pop(bestindex,:); %全局最佳
gbest=pop; %个体最佳
fitnessgbest=fitness; %个体最佳适应度值
fitnesszbest=bestfitness; %全局最佳适应度值%% 迭代寻优
for i=1:maxgenfor j=1:sizepop%速度更新V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));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;%适应度值fitness(j)=fun(pop(j,:)); endfor j=1:sizepop%个体最优更新if fitness(j) < fitnessgbest(j)gbest(j,:) = pop(j,:);fitnessgbest(j) = fitness(j);end%群体最优更新if fitness(j) < fitnesszbestzbest = pop(j,:);fitnesszbest = fitness(j);endend yy(i)=fitnesszbest; end
%% 结果分析
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
3.3 运行说明
首先将适应度函数代码单独保存为fun.m文件,然后新建一个文件存放主函数,运行即可得到结果:
最终得到的最优个体适应度值为0.00000328,对应的粒子位置为(7.07633222538084e-05 , -0.000102163303292990),PSO算法寻优得到最优值接近函数实际最优值,说明PSO算法具有较强的函数极值寻优能力。
4 案例扩展
4.1自适应变异
粒子群优化算法收敛快,具有很强的通用性,但同时存在着容易早熟收敛、搜索精度较低、后期迭代效率不高等缺点。借鉴遗传算法中的变异思想,在 PSO算法中引人变异操作,即对某些变量以一定的概率重新初始化。变异操作拓展了在迭代中不断缩小的种群搜索空间,使粒子能够跳出先前搜索到的最优值位置,在更大的空间中开展搜索,同时保持了种群多样性,提高算法寻找到更优值的可能性。因此,在普通粒子群算法的基础上引入了简单变异算子,基本思想就是粒子每次更新之后,以一定概率重新初始化粒子,MATLAB代码如下
%% 该代码为基于变异粒子群算法的函数极值寻优算法
%% 清空环境
clc
clear%% 参数初始化
%粒子群算法中的两个参数
c1 = 1.49445;
c2 = 1.49445;maxgen=500; % 进化次数
sizepop=100; %种群规模Vmax=1;
Vmin=-1;
popmax=5;
popmin=-5;%% 产生初始粒子和速度
for i=1:sizepop%随机产生一个种群pop(i,:)=5*rands(1,2); %初始种群V(i,:)=rands(1,2); %初始化速度%计算适应度fitness(i)=fun(pop(i,:)); %染色体的适应度
end%% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
zbest=pop(bestindex,:); %全局最佳
gbest=pop; %个体最佳
fitnessgbest=fitness; %个体最佳适应度值
fitnesszbest=bestfitness; %全局最佳适应度值%% 迭代寻优
for i=1:maxgenfor j=1:sizepop%速度更新V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));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,2);end%适应度值fitness(j)=fun(pop(j,:)); endfor j=1:sizepop%个体最优更新if fitness(j) < fitnessgbest(j)gbest(j,:) = pop(j,:);fitnessgbest(j) = fitness(j);end%群体最优更新if fitness(j) < fitnesszbestzbest = pop(j,:);fitnesszbest = fitness(j);endend yy(i)=fitnesszbest; end
%% 结果分析
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);
web browser www.matlabsky.com
4.2 惯性权重的选择
惯性权重w体现的是粒子当前速度多大程度上继承先前的速度,Shi.Y最先将惯性权重w引人到 PSO算法中,并分析指出一个较大的惯性权值有利于全局搜索,而一个较小的惯性权值则更利于局部搜索。为了更好地平衡算法的全局搜索与局部搜索能力,其提出了线性递减惯性权重(Linear Decreasing Inertia Weight,LDIW),即
4.3 动态粒子群算法
基本 PSO算法在很多领域的静态优化问题中得到了广泛的应用,但是在实际环境中遇到的问题一般比较复杂,且往往随时间变化,也就是说问题最优解是动态改变的。例如,在物流配送过程中,由于受到客户优先级、交通状况等因素变化的影响,物流配送问题也相应地发生变化。对于这种需要跟踪动态极值的问题,基本 PSO算法难以解决。为了跟踪动态极值,最常用的方法是对基本 PSO算法做两方面的关键改进:第一是引入探测机制,使种群或粒子获得感知外部环境变化的能力;第二是引入响应机制,在探测到环境的变化后,采取某种响应方式对种群进行更新,以适应动态环境。可以采用带敏感粒子的 PSO算法实现动态环境寻优。带敏感粒子的PSO算法在环境中随机选择一个或若干个位置,这些位置称为敏感粒子,每次迭代中计算敏感粒子的适应度值,当发现适应度值变化时,认为环境已发生变化,敏感粒子适应度值变化超过一定阈值时 PSO算法作出响应。响应的方式是按比例重新初始化粒子位置和粒子速度。