1. 简介:
Particle Swarm Optimization ,粒子群优化算法,常用来找到方程的最优解。
2. 算法概述:
每次搜寻都会根据自身经验(自身历史搜寻的最优地点)和种群交流(种群历史搜寻的最优地点)调整自身搜寻方向和速度。
3. 算法优势:
相较于传统算法计算速度非常快,全局搜索能力也很强;
PSO对于种群大小不十分敏感,所以初始种群往往设为500-1000,不同初值速度影响也不大;
粒子群算法适用于连续函数极值问题,对于非线性、多峰问题均有较强的全局搜索能力。
4. 算法基本原理
一个形象的例子:
A与B两个小粒子初始时在河的两侧,他们想要找到河最深处。如果A某时刻所在位置的深度比B的浅,A就会像B的方向走,反之亦然。 当A到达Global Minimum(全局最小值)时,B会一直向着A前进,直到在optimum solution(全剧最优解)处汇合。
4.1 概述
从上面的示例中我们得到两个准则,也可以说是每个粒子的必要特性:
Communication : 彼此互相通知
Learning : 不停地学习以达最优解
数量众多的粒子通过相互的交流与学习,全部粒子最终将汇聚到一点,即问题的解。粒子间相互交流与学习的过程用数学或计算机语言描述为迭代。
迭代的意义在于不断寻找更优的值,从理论上来说,如果我们掌握了一种可以不停寻找到更优解答的方法,通过不停的迭代,我们就能够找到最优的答案。
Learning the concept of better is the main problem that an optimizer should solve. Then an optimizer learns the concept of better, it is able to solve any kind of optimuzation.Because the solution of optimization problem is to find the best one . So if we know what is the better, we actually can discover the concept of best.
4.2 粒子的基本信息
回顾粒子群算法概述:
每次搜寻都会根据自身经验(自身历史搜寻的最优地点)和种群交流(种群历史搜寻的最优地点)调整自身搜寻方向和速度。
我们首先聚焦与粒子本身,或许全部粒子研究起来很复杂,但单个粒子的属性是很简单的。
首先,每个粒子包含两个基本信息,Position(位置) & Velocity(速度)。
在粒子群算法的每次迭代中,每个粒子的位置和速度都会更新。
我们用Xi(t)⃗ \vec {X_i(t)}
X
i
(t)
记录位置
用Vi(t)⃗ \vec { V_i (t)}
V
i
(t)
记录方向与速度
4.3 粒子的个体极值与全局极值
回顾粒子群算法概述:
每次搜寻都会根据自身经验(自身历史搜寻的最优地点)和种群交流(种群历史搜寻的最优地点)调整自身搜寻方向和速度。
仅有上述位置与速度两个信息还不够,我们之前提到过,每一个粒子是会学习的。 每个粒子还拥有下面两个信息(每个信息都是一个向量):
每一个粒子有它自己的记忆,会记住自己的best position , best experience,即个体极值 (personal best), 标记为Pi(t)⃗ \vec { P_i (t)}
P
i
(t)
当前时刻全局的最优解,即全局极值(Common best experience among the members),标记为 gi(t)⃗ \vec { g_i (t)}
g
i
(t)
总结:PSO初始化为一群随机粒子,然后通过迭代找到最优解。在每一次迭代过程中,粒子通过跟踪两个极值来更新自己,一个是粒子本身所找到的最优解,这个解称为个体极值Pi(t)⃗ \vec { P_i (t)}
P
i
(t)
;另一个极值是整个种群目前找到的最优解,这个极值是全局极值 gi(t)⃗ \vec { g_i (t)}
g
i
(t)
。
4.4 找到新位置
根据平行四边形法则,已知个体极值与整体极值,有了新时刻的速度Vi⃗ (t+1)\vec {V_i}(t+1)
V
i
(t+1) ,会得到新的位置Xi⃗ (t+1)\vec {X_i}(t+1)
X
i
(t+1)
状态转移方程:
vij⃗ (t+1)=wvij⃗ (t)+c1r1(pij(t)−xij⃗ (t))+c2r2(gj(t)−xij⃗ (t))(4-1)\vec {v_{ij}}(t+1) = w\vec{v_{i j}} (t) + c_1r_1(p_{ij} (t) - \vec{x_{ij}}(t))+c_2r_2(g_j(t)-\vec{x_{ij}}(t)) \tag{4-1}
v
ij
(t+1)=w
v
ij
(t)+c
1
r
1
(p
ij
(t)−
x
ij
(t))+c
2
r
2
(g
j
(t)−
x
ij
(t))(4-1)
xij⃗ (t+1)=xij⃗ (t)+vij⃗ (t+1)(4-2)\vec {x_{ij}}(t+1) = \vec{x_{ij}}(t)+\vec{v_{ij}}(t+1) \tag{4-2}
x
ij
(t+1)=
x
ij
(t)+
v
ij
(t+1)(4-2)
其中,c1,c2c_1,c_2c
1
,c
2
为学习因子,也称加速常数(acceleration constant);
r1,r2r_1,r_2r
1
,r
2
,[0,1]范围内的均匀随机数。
式(1)右边由三部分组成:
第一部分为“惯性(inertia)”或“动量(MOMENTUM)”部分,反映了粒子的运动习惯,代表粒子有维持自己先前速度的趋势。
第二部分为“认知(cognition)”部分,反映了粒子对自身历史经验的记忆,代表粒子由向自身历史最佳位置逼近的趋势。
第三部分为“社会(social)”部分,反映了粒子间协同合作与知识共享的群体历史经验,代表粒子有向群体或领域历史最佳位置逼近的趋势。
5. 算法的运行参数
PSO算法一个最大的优点是不需要调节太多的参数,但是算法中少数几个参数却直接影响着算法的性能和收敛性。
基本粒子群算法有下述7个运行参数需要提前设定:
rrr:粒子群算法的种子数,对粒子群算法中种子数值可以随机生成也可以固定位一个初始的数值,要求能涵盖目标函数的范围内。
mmm:粒子群群体大小,即群体中所含个体的数量,一般取为20~40。在变两年比较多的时候可以取100以上较大的数。
maxdmax_dmax
d
:一般为最大迭代次数以最小误差的要求满足的。粒子群算法的最大迭代次数,也是终止条件数。
r1,r2r_1,r_2r
1
,r
2
:两个在[0,1]之间变化的加速度权重系数随机产生。
c1,c2c_1,c_2c
1
,c
2
:加速常数,取随机2左右的值。
www:惯性权重产生的。
vk,xkv_k,x_kv
k
,x
k
:一个粒子的速度和位移数值,用粒子群算法迭代出每一组的数值。
6. 算法的基本流程
初始化粒子群,包括群体规模N,每个粒子的位置xix_ix
i
和速度viv_iv
i
。
计算吗每一个粒子的适应度值Fit[i]Fit[i]Fit[i]。
计算每个粒子,用它的适应度值Fit[i]Fit[i]Fit[i]和个体极值pbest(i)p_{best}(i)p
best
(i)比较,如果Fit[i]>pbest(i)Fit[i]>p_{best}(i)Fit[i]>p
best
(i),则用Fit[i]Fit[i]Fit[i]替换掉pbest(i)p_{best}(i)p
best
(i)。
计算每个粒子,用它的适应度值Fit[i]Fit[i]Fit[i]和全局极值gbest(i)g_{best}(i)g
best
(i)比较,如果Fit[i]>gbest(i)Fit[i]>g_{best}(i)Fit[i]>g
best
(i),则用Fit[i]Fit[i]Fit[i]替换掉gbest(i)g_{best}(i)g
best
(i)。
根据式(4-1)和式(4-2)更新粒子的位置xix_ix
i
和速度viv_iv
i
。
如果满足结束条件(误差足够好或到达最大循环次数)退出,否则返回步骤2.
%% 清空环境
clc
clear
%% 参数初始化
%粒子群算法中的两个参数
c1 = 1.49445;
c2 = 1.49445;
maxgen=300; %进化次数
sizepop=20; %种群规模
Vmax=0.5;
Vmin=-0.5;
popmax=2;
popmin=-2;
for k=1:100
%% 产生初始粒子和速度
k
for i=1:sizepop
%随机产生一个种群
pop(i,:)=2*rands(1,2); %初始种群
V(i,:)=0.5*rands(1,2); %初始化速度
%计算适应度
fitness(i)=fun(pop(i,:)); %染色体的适应度
end
%% 个体极值和群体极值
[bestfitness bestindex]=max(fitness);
zbest=pop(bestindex,:); %全局最佳
gbest=pop; %个体最佳
fitnessgbest=fitness; %个体最佳适应度值
fitnesszbest=bestfitness; %全局最佳适应度值
%% 迭代寻优
for i=1:maxgen
for 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,:)+V(j,:);
pop(j,find(pop(j,:)>popmax))=popmax;
pop(j,find(pop(j,:)<popmin))=popmin;
%适应度值
fitness(j)=fun(pop(j,:));
end
for j=1:sizepop
%个体最优更新
if fitness(j) > fitnessgbest(j)
gbest(j,:) = pop(j,:);
fitnessgbest(j) = fitness(j);
end
%群体最优更新
if fitness(j) > fitnesszbest
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
end
yy(i)=fitnesszbest;
end
s(k,:)=yy;
end
%% 结果分析
for m=1:300
s(101,m)=sum( s(:,m) )/100;
end
plot(s(101,:),'k')
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);