文章目录
clpso综合学习的粒子群优化算法
在学习clpso前,最好先了解一下粒子群优化算法(pso)
粒子群优化算法(附MATLAB源码)
1.使用新的学习策略
-
粒子不再使用自身的pbest和gbest来规划速度飞行。所有粒子的pbest都可能被用作指导粒子飞行的精英粒子样本
-
有与pso不同的 p b e s t f i d pbest_{fi}^d pbestfid寻找策略
-
每个粒子可以从不同粒子对应维度的pbest学习几代。不必学习某粒子的全部维度。(向相同的粒子学习所有维度)
-
不像pso每一代都同时向pbest和gbest学习,clpso每个维度只在几代中向一个样本学习 -
与PSO中的每个粒子同时学习两个范例(pbest,gbest)不同,CLPSO中的一个粒子的每个维度只会向一个范例学习。
2.算法公式
v i j = w ∗ v i j + c 1 ∗ r a n d ∗ ( p b e s t f i ( d ) d − x i j ) v_{ij}=w*v_{ij}+c_1*rand*(pbest_{fi(d)}^d-x_{ij}) vij=w∗vij+c1∗rand∗(pbestfi(d)d−xij)
f
i
=
[
f
i
(
1
)
,
f
i
(
2
)
,
.
.
.
f
i
(
D
)
]
f_i=[f_i(1),f_i(2),...f_i(D)]
fi=[fi(1),fi(2),...fi(D)],定义了第i个粒子维度d应该学习哪个粒子的pbest,
p
b
e
s
t
f
i
(
d
)
d
pbest_{fi(d)}^d
pbestfi(d)d可以是包括自己在内的任何粒子相应维度(维度d)的pbest值。根据粒子的Pc值来决定选哪个粒子的pbest,Pc是学习概率,可以为粒子提供不同的值。
如何选择 p b e s t f i ( d ) d pbest_{fi(d)}^d pbestfi(d)d,即如何求 f i d f_{i}^d fid:
对粒子i的每个维度,我们提供一个随机值,如果这个随机值大于粒子i在该维度的Pc值,则向自身的pbest学习;随机值小于学习概率Pc,则向其他粒子的pbest学习。向其他粒子学习时,根据以下来判断哪个粒子:
-
从种群中速度没更新的粒子中随机寻找两个粒子
-
对比两个粒子的pbest的适应值,并选择更好的那个粒子的pbest。在clpso中,定义适应值越大越好,所以求极小化问题时,使用负函数值作为适应值
-
将更好的那个粒子的pbest作为该维度的学习粒子.如果是全是学习自己维度,则随机找一个维度,再随机找一个其他粒子在该维度的pbest学习
-
为了粒子更好的学习,减少浪费的时间。当粒子对一个pbest学习,在一定代内停止改进时,我们为粒子重新分配另一个粒子供学习。
f i d f_i^d fid选择流程图
3.学习概率Pc
Pc,用在判断粒子是否需要选择其他粒子学习时使用。
公式:
图像:
对同一问题,不同Pc值可能会有不同的结果。给每个粒子设置PC值,粒子在种群中具有不同程度的探索和开采能力,能够解决不同的问题。
未旋转问题适用较小Pc值;旋转问题比不同Pc值对不同问题都有较好结果;简单单峰问题,不同Pc值有近似结果,但对多峰问题运行性能有较大影响。
4.算法流程
ps:种群数 k:当前代数 max_gen:最大代数 d:维度d
w:惯性权重 i :当前粒子,1-ps m:刷新间隔
f l a g i flag_i flagi:粒子没有进化的代数,超过m代则分配新的粒子
对比:
1.速度更新公式:
pso: v i j ( t + 1 ) = w v i j ( t ) + c 1 ∗ r a n d 1 ( t ) [ p b e s t i j ( t ) − x i j ( t ) ] + c 2 ∗ r a n d 2 ( t ) [ g b e s t g j ( t ) − x i j ( t ) ] v_{ij}(t+1)=wv_{ij}(t)+c_1*rand_1(t)[pbest_{ij}(t)-x_{ij}(t)]+c_2*rand_2(t)[gbest_{gj}(t)-x_{ij}(t)] vij(t+1)=wvij(t)+c1∗rand1(t)[pbestij(t)−xij(t)]+c2∗rand2(t)[gbestgj(t)−xij(t)]
clpso: v i j = w ∗ v i j + c 1 ∗ r a n d ∗ ( p b e s t f i ( d ) d − x i j ) v_{ij}=w*v_{ij}+c_1*rand*(pbest_{fi(d)}^d-x_{ij}) vij=w∗vij+c1∗rand∗(pbestfi(d)d−xij)
2.学习策略
pso使用pbest和gbest学习,pbest为个体历史最优,gbest为当前全局历史最优。
clpso使用 p b e s t f i ( d ) d pbest_{fi(d)}^d pbestfi(d)d学习 , p b e s t f i ( d ) d pbest_{fi(d)}^d pbestfi(d)d可以是包括自身在内的所有粒子。根据学习概率Pc判断是否向自身学习。
3.可搜索范围
pso : r 1 i d = L 1 i d + L 2 i d = ∣ g b e s t d − X i d ∣ + ∣ p b e s t i d − X i d ∣ r_{1i}^d=L_{1i}^d+L_{2i}^d=|gbest^d-X_i^d|+|pbest_i^d-X_i^d| r1id=L1id+L2id=∣gbestd−Xid∣+∣pbestid−Xid∣
clpso : r 2 i d = m a x ( p b e s t j d , X i d ) − m i n ( p b e s t j d , X i d ) r_{2i}^d=max(pbest_j^d,X_i^d)-min(pbest_j^d,X_i^d) r2id=max(pbestjd,Xid)−min(pbestjd,Xid)
简单来说,pso搜索范围就是粒子的位置和gbest,pbest差的和;clpso的搜索范围是 所有粒子的历史最优位置和该粒子当前位置中,绝对值最大的差
4.跳出局部最优能力
clpso因为在停止进化几代后,会主动向随机其他粒子的pbest学习,所以有可能借助这个变量跳出局部最优。
pso由于同时受gbest和pbest的影响,当gbest和pbest位置接近时,粒子陷进去后,很难跳出局部最优区域。
5.源码
源码文件太多了不太好放,直接上传了。没积分要求,应该可以直接下
pso&clpso源码MATLAB