2.1 粒子群算法思想的起源
粒子群优化(Particle Swarm Optimization, PSO)算法是Kennedy和Eberhart受人工生命研究结果的启发、通过模拟鸟群觅食过程中的迁徙和群聚行为而提出的一种基于群体智能的全局随机搜索算法,自然界中各种生物体均具有一定的群体行为,而人工生命的主要研究领域之一是探索自然界生物的群体行为,从而在计算机上构建其群体模型。自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣,生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型,在他的仿真中,每一个个体遵循:
(1) 避免与邻域个体相冲撞;
(2) 匹配邻域个体的速度;
(3) 飞向鸟群中心,且整个群体飞向目标。
仿真中仅利用上面三条简单的规则,就可以非常接近的模拟出鸟群飞行的现象。1995年,美国社会心理学家James Kennedy和电气工程师Russell Eberhart共同提出了粒子群算法,其基本思想是受对鸟类群体行为进行建模与仿真的研究结果的启发。他们的模型和仿真算法主要对Frank Heppner的模型进行了修正,以使粒子飞向解空间并在最好解处降落。Kennedy在他的书中描述了粒子群算法思想的起源。
2.2 算法原理
PSO从这种模型中得到启示并用于解决优化问题。PSO 中,每个优化问题的潜在解都是搜索空间中的一只鸟,称之为粒子。所有的粒子都有一个由被优化的函数决定的适值( fitness value) ,每个粒子还有一个速度决定它们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO初始化为一群随机粒子(随机解),然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个极值来更新自己;第一个就是粒子本身所找到的最优解,这个解称为个体极值;另一个极值是整个种群目前找到的最优解,这个极值是全局极值。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。
维的目标搜索空间中,有整个粒子群迄今为止搜索到的最优位置为全局极值,记为
在找到这两个最优值时,粒子根据如下的公式(2-1)和( 2-2)来更新自己的速度和位置:
(2-1) (2-2) 和2.3 标准粒子群算法流程
算法的流程如下:
,每个粒子的位置Step6: 如果满足结束条件(误差足够好或到达最大循环次数)退出,否则返回Step2。
图2-1. PSO算法流程图
``` %_______________________% % 基于Tent混沌映射改进的粒子群优化算法 % %_______________________%
% 使用方法 %_____________ % fobj = @YourCostFunction 设定适应度函数 % dim = number of your variables 设定维度 % Maxiteration = maximum number of generations 设定最大迭代次数 % SearchAgentsno = number of search agents 种群数量 % lb=[lb1,lb2,...,lbn] where lbn is the lower bound of variable n 变量下边界 % ub=[ub1,ub2,...,ubn] where ubn is the upper bound of variable n 变量上边界 clear all clc close all SearchAgentsno=10; % 种群数量 Functionname='F4'; % Name of the test function that can be from F1 to F23 (Table 1,2,3 in the paper) 设定适应度函数 Vmax=5;%速度上限 Vmin=-5;%速度下限 Maxiteration=50;% 进化次数 a=0.5;%混沌系数 c1 = 1.49445;%个体学习率 c2 = 1.49445;%群体学习率 % Load details of the selected benchmark function [lb,ub,dim,fobj]=GetFunctionsdetails(Functionname); %设定边界以及优化函数 %lb%粒子最小值 %ub%粒子最大值 %dim%粒子维数 [Bestpostent,psocurvetent,Bestscoretent]=psoNew(SearchAgentsno,Maxiteration,lb,ub,dim,fobj,Vmax,Vmin,a,c1,c2); %tent混沌粒子群 [Bestpos,psocurve,Bestscore]=pso(SearchAgentsno,Maxiteration,lb,ub,dim,fobj,Vmax,Vmin,c1,c2); %基本粒子群
figure('Position',[269 240 660 290]) %Draw search space subplot(1,2,1); funcplot(Functionname); title('Parameter space') xlabel('x1'); ylabel('x2'); zlabel([Functionname,'( x1 , x_2 )'])
%Draw objective space subplot(1,2,2); plot(psocurvetent,'Color','r') hold on; plot(pso_curve,'Color','b') title('Objective space') xlabel('Iteration'); ylabel('Best score obtained so far');
axis tight grid on box on legend('Tent混沌策略pso','基本粒子群') % display(['The best solution obtained by Tent混沌策略PSO is : ', num2str(Bestpostent)]); display(['The best optimal value of the objective funciton found by Tent混沌策略PSO is : ', num2str(Bestscoretent)]); display(['The best solution obtained by PSO is : ', num2str(Bestpos)]); display(['The best optimal value of the objective funciton found by Tent混沌策略PSO is : ', num2str(Bestscore)]); ```