[机器学习] 粒子群算法
转载于http://blog.csdn.net/xuehuafeiwu123/article/details/52299628
其他粒子群算法相关文章:
http://blog.csdn.net/zuochao_2013/article/details/53431767?ref=myread
一、 粒子群算法概述
粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitness value),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO 初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个”极值”来更新自己。第一个就是粒子本身所找到的最优解,这个解叫做个体极值pBest。另一个极值是整个种群目前找到的最优解,这个极值是全局极值gBest。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。
二、 算法原理
粒子群算法采用常数学习因子,及惯性权重,粒子根据如下的公式更新自己的速度和位置。
三、 算法步骤
1、 随机初始化种群中各微粒的位置和速度;
2、 评价个粒子的适应度,将各粒子的位置和适应度储存在各微粒的pbest(
<span style="display:inline-block; position:relative; width:1.203em; height:0px; font-size:125%"><span style="position:absolute; top:-0.997em; left:0.003em"><span class="mrow" id="MathJax-Span-83"><span class="msubsup" id="MathJax-Span-84"><span style="display:inline-block; position:relative; width:1.203em; height:0px"><span style="position:absolute; top:-2.448em; left:0.003em"><span class="mi" id="MathJax-Span-85" style="font-family:MathJax_Math-italic">Qbi
)中,将所有pbest中适应度最优的个体的位置和适应度存储在gbest(
<span style="display:inline-block; position:relative; width:1.252em; height:0px; font-size:125%"><span style="position:absolute; top:-0.997em; left:0.003em"><span class="mrow" id="MathJax-Span-89"><span class="msubsup" id="MathJax-Span-90"><span style="display:inline-block; position:relative; width:1.252em; height:0px"><span style="position:absolute; top:-2.448em; left:0.003em"><span class="mi" id="MathJax-Span-91" style="font-family:MathJax_Math-italic">Qbg
)中。
3、 更新粒子的速度和位移。
4、 对每个微粒,与其前一个最优位置比较,如果较好,则将其作为当前的最优位置。
5、 比较当前所有的pbest和上一迭代周期的gbest,更新gbest。
6、 若满足停止条件(达到要求精度或迭代次数),搜索停止,输出结果,否则,返回2。
四、 算法改进
1、 带压缩因子的粒子群算法。
主要是限定学习因子,粒子的更新公式变为为:
其中, <span style="display:inline-block; position:relative; width:14.703em; height:0px; font-size:125%"><span style="position:absolute; top:-2.698em; left:0.003em"><span class="mrow" id="MathJax-Span-257"><span class="mi" id="MathJax-Span-258" style="font-family:MathJax_Math-italic">ϕ=22−C−C2−4C√,其中C=c1+c2
2、 权重改进的粒子群算法。
随着迭代次数的增加,惯性权重从最大变化到最小。变化的公式是:
3、 自适应权重法。主要是为了平衡全局搜索和局部搜索能力。权重的表达式为:
4、 随机权重法。
5、 变学习因子的粒子群算法。
(1)、 <span style="display:inline-block; position:relative; width:12.703em; height:0px; font-size:125%"><span style="position:absolute; top:-2.698em; left:0.003em"><span class="mrow" id="MathJax-Span-480"><span class="msubsup" id="MathJax-Span-481"><span style="display:inline-block; position:relative; width:0.903em; height:0px"><span style="position:absolute; top:-2.448em; left:0.003em"><span class="mi" id="MathJax-Span-482" style="font-family:MathJax_Math-italic">c1=c2=cmax−t∗(cmax−cmin)tmax
(2)、 <span style="display:inline-block; position:relative; width:20.602em; height:0px; font-size:125%"><span style="position:absolute; top:-3.748em; left:0.003em"><span class="mrow" id="MathJax-Span-526"><span class="mrow" id="MathJax-Span-527"><span class="mo" id="MathJax-Span-528" style="vertical-align:0.003em"><span style="font-family:MathJax_Size2">{<!-- -->c1=c1,ini+c1,fin−c1,initmax c2=c2,ini+c2,fin−c2,initmax
6、二阶粒子群算法。
五、 粒子群算法参数介绍
标准粒子群算法中,有以下几个参数:
1、fitness,待优化的目标函数
2、粒子数目:N
3、学习因子1:c1
4、学习因子2:c2
5、惯性权重:w
6、最大迭代系数:M
7、自变量的个数:D
1、finess 是待优化的目标函数,如何构造函数是用粒子群算法的前提,构造函数的结构直接决定了计算结果的好坏,特别是在多目标优化的问题中。
2、学习因子一般取2,c1决定着其局部搜寻能力,c2决定着其全局搜寻能力。
3、惯性权重大,便于全局搜索,惯性权重小,便于局部搜索。
4、最大迭代系数一般取1000—10000,具体看精度要求。
5、自变量的个数有目标函数决定。
学习因子、惯性权重是改进粒子群算法的关键
更新函数决定了粒子群算法的本质能力。
function [ xm,fv ] = PSO( fitness,N,c1,c2,w,M,D )
% fitness,待优化的目标函数
% 粒子数目:N
% 学习因子1:c1,一般取2
% 学习因子2:c2,一般取2
% 惯性权重:w
% 最大迭代系数:M
% 自变量的个数:D
% 目标函数取最大值是的自变量值:xm
% 目标函数的最小值:fv
format long;
vmax=0.2*2*pi;
vmin=-0.2*2*pi;
xmax=1*pi;
xmin=-1*pi;
for i=1:N
for j=1:D
x(i,j)=randn;
v(i,j)=randn;
end
end
for i=1: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
end
xm=pg';
fv=fitness(pg);
format short;
end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
本文来自博客园,作者:落痕的寒假,转载请注明原文链接:https://www.cnblogs.com/luohenyueji/p/16970353.html
![](https://gitcode.net/LuohenYJ/article_picture_warehouse/-/raw/main/wechat/content/%E5%8A%A0%E6%B2%B9%E9%B8%AD.gif)