粒子群优化算法(Particle Swarm Optimization),缩写为 PSO,属于进化算法的一种。和模拟退火算法相似,它也是从随机解出发,通过迭代寻找最优解。 它也是通过适应度来评价解的品质,但它比遗传算法规则更为简单,它没有遗传算法的“交叉”(Crossover)和“变异”(Mutation)操作,它通过追随当前搜索到的最优值来寻找全局最优。
一、概念:
粒子群是基于群体的算法,每个个体称为粒子,粒子组成粒子群,群体在可行区域中逐步移动。每次移动过程中,算法计算每个粒子的目标函数,根据该值再重新计算每个粒子的移动速度,重新移动,重新计算目标函数值,如此迭代更新,直到满足终止条件,运算结束,输出结果。
PSO 中,每个优化问题的潜在解都是搜索空间中的一只鸟,称为粒子。所有的粒子都有一个由被优化的函数决定的适值(fitness value),每个粒子还有一个速度决定它们“飞行”的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO 初始化为一群随机粒子(随机解),然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个极值来更新自己;第一个就是粒子本身所找到的最优解,这个解称为个体极值;另一个极值是整个种群目前找到的最优解,这个极值是全局极值。
二、基本思想:
每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。
三、公式规则
pbest为个体极值,gbset为全局极值
公式1中的第一部分Vi是“记忆项”,表示自己上次速度大小和方向的影响;
第二部分称为“自身认知项”,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;
第三部分称为“群体认知项”,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。以上面两个公式为基础,形成了PSO的标准形式。
四、优点
粒子群算法具有高效的搜索能力,有利于得到多目标意义下的最优解;通过代表整个解集种群,按并行(同一时刻一组程序独立异步地执行)方式同时搜索多个非劣解,即搜索到多个 Pareto 最优解。
Pareto最优解:也称为帕累托效率(Pareto efficiency),是指资源分配的一种理想状态,假定固有的一群人和可分配的资源,从一种分配状态到另一种状态的变化中,在没有使任何人境况变坏的前提下,使得至少一个人变得更好。
Pareto最优解:若x∈C,且在C中不存在比x更优越的解x,则称x*是多目标最优化模型式的Pareto最优解,又称为有效解。(甲乙分蛋糕的例子)
多目标优化问题并不存在一个最优解,所有可能的解都称为非劣解,也称为Pareto解。
传统优化技术一般每次能得到Pareto解集中的一个,而用智能算法来求解,可以得到更多的Pareto解,这些解构成了一个最优解集,称为Pareto最优解。
它是由那些任一个目标函数值的提高都必须以牺牲其他目标函数值为代价的解组成的集合,称为Pareto最优域,简称Pareto集。
Pareto有效(最优)解非劣解集是指由这样一些解组成的集合:与集合之外的任何解相比它们至少有一个目标函数比集合之外的解好。
同时,粒子群算法的通用性比较好,适合处理多种类型的目标函数和约束,并且容易与传统的优化方法结合,从而改进自身的局限性,更高效地解决问题。因此,将粒子群算法应用于解决多目标优化问题上具有很大的优势。
五、算法流程逻辑
1、初始化粒子群,包括群体规模 N,每个粒子的位置Xi 和速度 Vi
2、计算每个粒子的适应度值 Fit [i]
3、对随机每个粒子,用它的适应度值Fit [i]和个体极值 Pbest(i)比较,如果 Fit [i]>Pbest(i),则用 Fit [i] 取代个体极值
4、对每个粒子,用它的适应度值Fit [i]和全局极值 Gbest比较,如果 Fit [i]>Pbest(i),则用 Fit [i] 取代全局极值
(此时的适应度值就是个体极值了)
5、更新粒子的速度Vi和位置Xi
6、如果满足结束条件(误差足够好或达到最大循环次数)退出,否则返回2
在 MATLAB 中编程实现的基本粒子群算法基本函数为 PSO。其调用格式如下所示:
[xm,fv]=PSO(fitness,N,c1,c2,w,M,D)
fitness 为待优化的目标函数,也称适应度函数。
N 是粒子数目,c1 是学习因子 1,c2 是学习因子 2,
w 是惯性权重,M 是最大迭代数,D 是自变量的个数,
xm 是目标函数取最小值时的自变量,fv 是目标函数的最小值。
%%初始化条件
% c1 学习因子 1
% c2 学习因子 2
% w 惯性权重
% M 最大迭代次数
% D 搜索空间维数
% N 初始化群体个体数目
%%初始化种群的个体,限定位置和速度的范围
N=10; %种群规模
M=30; %最大迭代次数
D=1; %粒子搜索空间维数
w=0.729; %惯性权重
c1=2; %认知学习因子
c2=2; %社会学习因子
fitness=
format long;
for i=1:N
%对种群规模开始初始化
for j=1:D
%初始化每个粒子的位置x和速度V
x(i,j)=randn; %随机初始化位置
v(i,j)=randn; %随机初始化速度
end
end
%%%%%%先计算各个粒子的适应度,并初始化 Pi 和 Pg%%%%%%%%%%%%%%%
for i=1:N
p(i)=fitness(x(i,:)); %适应度值作为个体极值
y(i,:)=x(i,:);
end
pg=x(N,:); %Pg 为全局最优
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('**************************************************')