粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现

这篇具有很好参考价值的文章主要介绍了粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文的代码将放在最后,需要的小伙伴们可以免费获取哦!!!
不要忘记点赞加关注奥😋😋

粒子群算法

一、理论基础

1、介绍

  粒子群算法(particle swarm optimization,Pso)是计算智能领域 ,除了蚁群算法、鱼群算法之外的一种群体智能的优化算法。该算法最早由 Kennedy 和 Eberhart 在 1995 年提出的PSO 算法源于对鸟类捕食行为的研究,鸟类捕食时,找到食物最简单有效的策略就是搜寻当前距离食物最近的鸟的周围区城。PSO 算法是从这种生物种群行为特征中得到启发并用于求解优化问题的,算法中每个粒子都代表问题的一个潜在解,每个粒子对应一个由适应度函数决定的适应度值。粒子的速度决定了粒子移动的方向和距离,速度随自身及其他粒子的移动经验进行动态调整,从而实现个体在可解空间中的寻优。
  PSO 算法首先在可行解空间中初始化一群粒子,每个粒子都代表极值优化问题的一个潜在最优解,用位置、速度和适应度值三项指标表示该粒子特征,适应度值由适应度函数计算得到,其值的好坏表示粒子的优劣。粒子在解空间中运动,通过跟踪个体极值 Pbest 和群体极值Gbest 更新个体位置。个体极值 Pbest 是指个体粒子搜崇到的适应度值最优位置,群体极值Gbest 是指种群中的所有粒子搜索到的适应度最优位置。粒子每更新一次位置,就计算一次适应度值,并且通过比较新粒子的适应度值和个体极值、群体极值的适应度值更新个体极值Pbest 和群体极值 Gbest 位置。
  它的核心思想是利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得问题的可行解。

2、核心公式

  假设在一个 D D D维的搜索空间,由 n n n个粒子组成的种群 X = ( X 1 , X 2 , ⋅ ⋅ ⋅ , X n ) X = (X_1,X_2,···,X_n) X=(X1,X2,⋅⋅⋅,Xn),其中第 i i i个粒子表示一个 D D D维的向量 X i = ( x i 1 , x i 2 X_i = (x_{i1},x_{i2} Xi=(xi1,xi2, ⋅ ⋅ ⋅ , x i D ) T ···,x_{iD})^T ⋅⋅⋅,xiD)T,代表第 i i i个粒子在 D D D维搜索空间中的位置,亦代表问题的一个潜在解。根据目标函数即可计算出每个粒子位置 X i X_i Xi,对应的适应度值。第 i i i个粒子的速度为 V i = ( V i 1 , V i 2 , ⋅ ⋅ ⋅ , V i D ) T V_i = (V_{i1},V_{i2},···,V_{iD})^T Vi=(Vi1,Vi2,⋅⋅⋅,ViD)T,其中个体的极值为 P i = ( P i 1 , P i 2 , ⋅ ⋅ ⋅ , P i D ) T P_i = (P_{i1},P_{i2},···,P_{iD})^T Pi=(Pi1,Pi2,⋅⋅⋅,PiD)T,种群的群体极值为 P g = ( P g 1 , P g 2 P_g = (P_{g1},P_{g2} Pg=(Pg1,Pg2, ⋅ ⋅ ⋅ , P g D ) T ···,P_{gD})^T ⋅⋅⋅,PgD)T
  在每次迭代过程中,粒子通过个体极值和群体极值更新自身的速度和位置,即
V i d k = ω V i d k − 1 + c 1 r 1 ( P i d k − X i d k ) + c 2 r 2 ( P g d k − X i d k ) V_{id}^k = \omega V_{id}^{k-1} + c_1r_1(P_{id}^k - X_{id}^k) + c_2r_2(P_{gd}^k - X_{id}^k) Vidk=ωVidk1+c1r1(PidkXidk)+c2r2(PgdkXidk)
X i d k = X i d k − 1 + V i d k − 1 t X_{id}^k = X_{id}^{k-1} + V_{id}^{k-1}t Xidk=Xidk1+Vidk1t
其中, ω \omega ω为惯性权重; d = 1 , 2 , ⋅ ⋅ ⋅ , n d = 1,2,···,n d=1,2,⋅⋅⋅,n k k k为当前迭代次数; V i d V_{id} Vid为粒子的速度; c 1 c_1 c1 c 2 c_2 c2是非负的常数,称为加速度因子(学习因子); r 1 r_1 r1 r 2 r_2 r2是分布在[0 1]之间的随机数。运动时间 t t t一般取1,为了防止粒子盲目搜索,一般建议将其位置和速度限制在一定的区间内 [ − X m a x , X m a x ] 、 [ − X m a x , X m a x ] [-X_{max},X_{max}]、[-X_{max},X_{max}] [Xmax,Xmax][Xmax,Xmax]

3、图形直观解释

  设想这样一个场景:一群鸟在搜索食物
  假设:
  (1)所有的鸟都不知道食物在哪
  (2)它们知道自己的当前位置距离食物有多远
  (3)它们知道离食物最近的鸟的位置
  那么想一下这时候会发生什么?
  首先,离食物最近的鸟会对其他的鸟说:兄弟们,你们快往我这个方向来,我这离食物最近;
  与此同时,每只鸟在搜索食物的过程中,它们的位置也在不停变化,因此每只鸟也知道自己离食物最近的位置,这也是它们的一个参考;
  最后,鸟在飞行中还需要考虑一个惯性。
粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现
  进一步解释:

粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现

   D D D维的搜素空间,这只鸟 i i i k k k步所在的位置 = 第 k − 1 k-1 k1步所在的位置 + 第 k − 1 k-1 k1步的速度 * 运动的时间。
X i d k = X i d k − 1 + V i d k − 1 ∗ t ( 每一步运动时间 t 一般取 1 ) X_{id}^{k} = X_{id}^{k-1} + V_{id}^{k-1}*t(每一步运动时间t一般取1) Xidk=Xidk1+Vidk1t(每一步运动时间t一般取1)
   D D D维的搜素空间,这只鸟 i i i k k k步的速度 =上一步自身的速度惯性 + 自我认知部分 + 社会认知部分。
V i d k = ω V i d k − 1 + c 1 r 1 ( P i d k − X i d k ) + c 2 r 2 ( P g d k − X i d k ) ( 三个部分之和 ) V_{id}^{k} = \omega V_{id}^{k-1} + c_1r_1(P_{id}^k - X_{id}^k) + c_2r_2(P_{gd}^k - X_{id}^k)(三个部分之和) Vidk=ωVidk1+c1r1(PidkXidk)+c2r2(PgdkXidk)(三个部分之和)

二、问题描述

  求函数最大值,本案例寻优的非线性函数为:
f ( x ) = sin ⁡ x 2 + y 2 x 2 + y 2 + e cos ⁡ 2 π x + cos ⁡ 2 π y 2 − 2.71289 f(x) = \frac{\sin \sqrt{x^2+y^2}}{\sqrt {x^2+y^2}} + e^{\frac{\cos 2 \pi x + \cos 2 \pi y}{2}} - 2.71289 f(x)=x2+y2 sinx2+y2 +e2cos2πx+cos2πy2.71289
  函数图像如下:
粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现
  从函数图形可以看出,该函数有很多局部极大值点,而最大值在(0,0)出取得,约为1.0054。

三、解题思路

  1. 粒子和速度随机初始化
  2. 粒子适应度计算(适应度函数为目标函数)
  3. 根据初始化粒子的适应度确定个体极值和群体极值
  4. 根据上诉公式对粒子的位置和速度进行更新
  5. 计算更新后粒子的适应度
  6. 更新个体极值和群体极值
  7. 是否到达迭代次数,是:结束;否:转到步骤4。

四、MATLAB实现

1、参数设置

%% 清空环境
clc
clear

%% 参数初始化
%粒子群算法中的两个参数
c1 = 1.49445;
c2 = 1.49445;

maxgen=300;   % 进化次数  
sizepop=20;   %种群规模

Vmax=0.5;Vmin=-0.5;
popmax=2;popmin=-2;

2、种群初始化

  随机初始化粒子的位置和速度,并根据适应度函数计算粒子的适应度值。

%% 产生初始粒子和速度
for i=1:sizepop
    %随机产生一个种群
    pop(i,:)=2*rands(1,2);    %初始种群
    V(i,:)=0.5*rands(1,2);  %初始化速度
    %计算适应度
    fitness(i)=fun(pop(i,:));   %染色体的适应度
end

  适应度函数:

function y = fun(x)
%函数用于计算粒子适应度值
%x           input           输入粒子 
%y           output          粒子适应度值 
y=sin( sqrt(x(1).^2+x(2).^2) )./sqrt(x(1).^2+x(2).^2)+exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)-2.71289;

3、寻找初始极值

  根据初始粒子的适应度值寻找个体极值和群体极值。

%% 个体极值和群体极值
[bestfitness bestindex]=max(fitness);
zbest=pop(bestindex,:);   %全局最佳
gbest=pop;    %个体最佳
fitnessgbest=fitness;   %个体最佳适应度值
fitnesszbest=bestfitness;   %全局最佳适应度值

4、迭代寻优

  根据上诉所说公式对粒子的速度和这位进行更新,并且根据粒子的适应度值更新个体的极值和群体极值。在这里我们的惯性权重取为1。

%% 迭代寻优
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

5、结果分析

  画出每一代的最优个体适应度值

%% 结果分析
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

  最优适应度值变化如下:
粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现

  最终得到的最优个体适应度值为1.0054,对应的粒子位置是(-0.00019024,-0.00034630)。可以看出得出的解接近实际最优解,说明PSO(粒子群算法)具有较强的函数极值寻优。
  寻优过程如下所示:
粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现

五、算法优化

1、惯性权重的选择

1.1、线性递减惯性权重与非线性递减权重

  惯性权重 ω \omega ω体现的是粒子继承先前的速度的能力,Shi. Y最先将惯性权重 ω \omega ω引入PSO 算法中,并分析指出:一个较大的惯性权值有利于全局搜索,而一个较小的惯性权值则更利于局部搜索。为了更好地平衡算法的全局搜素与局部搜素能力,Shi. Y提出了线性递减惯性权重(linear decreasing inertia weight, LDIw),即 ω ( k ) = ω s t a r t − ( ω s t a r t − ω e n d ) × k T m a x (1) \omega(k) =\omega_{start} - (\omega_{start}-\omega_{end})\times\frac{k}{T_{max}}\tag{1} ω(k)=ωstart(ωstartωend)×Tmaxk(1)
其中, ω s t a r t \omega_{start} ωstart为初始惯性权重; ω e n d \omega_{end} ωend为迭代至最大次数时的惯性权重; k k k为当前迭代代数; T m a x T_{max} Tmax为最大迭代代数。一般来说,惯性权值 ω s t a r t ( ω m a x ) \omega_{start}(\omega_{max}) ωstart(ωmax) =0.9, ω e n d ( ω m i n ) \omega_{end}(\omega_{min}) ωend(ωmin)=0.4 时算法性能最好。这样,随着迭代的进行,惯性权重由 0.9线性递减至 0.4,迭代初期较大的惯性权重使算法保持了较强的全局搜索能力,而选代后期较小的惯性权重有利于算法进行更精确的局部搜索。
粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现
  线性惯性权重只是一种经验做法,常用的惯性权重的选择还包括如下几种(非线性权重):
ω ( k ) = ω s t a r t − ( ω s t a r t − ω e n d ) × ( k T m a x ) 2 (2) \omega(k) = \omega_{start} - (\omega_{start}-\omega_{end})\times(\frac{k}{T_{max}})^2 \tag{2} ω(k)=ωstart(ωstartωend)×(Tmaxk)2(2)
ω ( k ) = ω s t a r t − ( ω s t a r t − ω e n d ) × [ 2 k T m a x − ( k T m a x ) 2 ] (3) \omega(k) = \omega_{start} - (\omega_{start}-\omega_{end})\times[\frac{2k}{T_{max}}-(\frac{k}{T_{max}})^2]\tag{3} ω(k)=ωstart(ωstartωend)×[Tmax2k(Tmaxk)2](3)
ω ( k ) = ω e n d ( ω s t a r t ω e n d ) 1 1 + c k T m a x (4) \omega(k) = \omega_{end}(\frac{\omega_{start}}{\omega_{end}})^{\frac{1}{1+\frac{ck}{T_{max}}}}\tag{4} ω(k)=ωend(ωendωstart)1+Tmaxck1(4)
  几种 ω \omega ω的动态变化如下图所示:
粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现

1.1.1、线性与非线性权重函数的性能对比

  算法参数设置:种群规模 20,进化300代。每个实验设置运行 100次,将100 次的平均值作为最终结果。
  在上述的参数设置下,运用5 种 ω \omega ω取值方法对函数进行求解,并比较所得解的平均值、失效次数和接近最优值的次数,来分析其收敛精度、收敛速度等性能。
  将距离最优解1.0054 误差为0.01 的解视为接近最优解,将0.8477 及更小的解视为陷人局部最优的解。
  每种 ω \omega ω的算法进化曲线如下图所示:
粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现
  具体结果对比:

ω \omega ω 求得最优值 平均值 陷入次优解次数 接近次优解次数
ω \omega ω = 1 1.0054 0.9708 21 79
ω ( k ) = ω s t a r t − ( ω s t a r t − ω e n d ) × k T m a x \omega(k) =\omega_{start} - (\omega_{start}-\omega_{end})\times\frac{k}{T_{max}} ω(k)=ωstart(ωstartωend)×Tmaxk 1.0054 0.9801 16 84
ω ( k ) = ω s t a r t − ( ω s t a r t − ω e n d ) × ( k T m a x ) 2 \omega(k) = \omega_{start} - (\omega_{start}-\omega_{end})\times(\frac{k}{T_{max}})^2 ω(k)=ωstart(ωstartωend)×(Tmaxk)2 1.0054 1.0052 0 100
ω ( k ) = ω s t a r t − ( ω s t a r t − ω e n d ) × [ 2 k T m a x − ( k T m a x ) 2 ] \omega(k) = \omega_{start} - (\omega_{start}-\omega_{end})\times[\frac{2k}{T_{max}}-(\frac{k}{T_{max}})^2] ω(k)=ωstart(ωstartωend)×[Tmax2k(Tmaxk)2] 1.0054 0.9864 12 88
ω ( k ) = ω e n d ( ω s t a r t ω e n d ) 1 1 + c k T m a x \omega(k) = \omega_{end}(\frac{\omega_{start}}{\omega_{end}})^{\frac{1}{1+\frac{ck}{T_{max}}}} ω(k)=ωend(ωendωstart)1+Tmaxck1 1.0054 0.9836 12 88

  由上图和上表可以看出,惯性权重 ω \omega ω不变的粒子群优化算法虽然具有较快的收敛速度,但其后期容易陷人局部最优,求解精度低;而几种 ω \omega ω动态变化的算法虽然在算法初期收敛稍慢,但在后期局部搜索能力强,利于算法跳出局部最优而求得最优解,提高了算法的求解精度。其中(3)式的函数效果最好。

1.2、自适应惯性权重

  假设现在在求最小值问题:

ω i ( k ) = { ω m i n + ( ω m a x − ω m i n ) f ( x i k ) − f m i n k f a v e r a g e k − f m i n k , f ( x i k ) ≤ f a v e r a g e k ω m a x , f ( x i k ) > f a v e r a g e k \omega_i(k) = \begin{cases} \omega_{min}+(\omega_{max}-\omega_{min})\frac{f(x_i^k)-f_{min}^k}{f_{average}^k-f_{min}^k},&f(x_i^k) \leq f_{average}^k\\ \omega_{max},&f(x_i^k) > f_{average}^k\\ \end{cases} ωi(k)={ωmin+(ωmaxωmin)faveragekfminkf(xik)fmink,ωmax,f(xik)faveragekf(xik)>faveragek
其中:

  1. ω m a x \omega_{max} ωmax ω m i n \omega_{min} ωmin是最大和最小惯性系数,一般取为0.9和0.4;
  2. f a v e r a g e k = ∑ i = 1 n f ( x i k ) / n f_{average}^k = \sum^{n}_{i=1}f(x_i^k)/n faveragek=i=1nf(xik)/n,即第 k k k次迭代时所有粒子的平均适应度
  3. f m i n k f_{min}^k fmink = min ⁡ \min min{ f ( x 1 k ) , f ( x 2 k ) , ⋅ ⋅ ⋅ , f ( x n k ) {f(x_1^k),f(x_2^k),···,f(x_n^k)} f(x1k),f(x2k),⋅⋅⋅,f(xnk)},即第 k k k次迭代时所有粒子的最小适应度。
      假设现在在求最大值问题:

ω i ( k ) = { ω m i n + ( ω m a x − ω m i n ) f m a x k − f ( x i k ) f m a x k − f a v e r a g e k , f ( x i k ) ≥ f a v e r a g e k ω m a x , f ( x i k ) < f a v e r a g e k \omega_i(k) = \begin{cases} \omega_{min}+(\omega_{max}-\omega_{min})\frac{f_{max}^k-f(x_i^k)}{f_{max}^k-f_{average}^k},&f(x_i^k) \geq f_{average}^k\\ \omega_{max},&f(x_i^k) < f_{average}^k\\ \end{cases} ωi(k)={ωmin+(ωmaxωmin)fmaxkfaveragekfmaxkf(xik),ωmax,f(xik)faveragekf(xik)<faveragek
其中:

  1. ω m a x \omega_{max} ωmax ω m i n \omega_{min} ωmin是最大和最小惯性系数,一般取为0.9和0.4;
  2. f a v e r a g e k = ∑ i = 1 n f ( x i k ) / n f_{average}^k = \sum^{n}_{i=1}f(x_i^k)/n faveragek=i=1nf(xik)/n,即第 k k k次迭代时所有粒子的平均适应度
  3. f m a x k f_{max}^k fmaxk = max ⁡ \max max{ f ( x 1 k ) , f ( x 2 k ) , ⋅ ⋅ ⋅ , f ( x n k ) {f(x_1^k),f(x_2^k),···,f(x_n^k)} f(x1k),f(x2k),⋅⋅⋅,f(xnk)},即第 k k k次迭代时所有粒子的最大适应度。

  算法参数设置:种群规模 20,进化300代。每个实验设置运行 100次,将100 次的平均值作为最终结果。将距离最优解1.0054 误差为0.01 的解视为接近最优解,将0.8477 及更小的解视为陷人局部最优的解。
粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现
  具体结果:

ω \omega ω 求得最优值 平均值 陷入次优解次数 接近次优解次数
自适应惯性权重 1.0054 0.9710 20 80

  由上图和上表可以看出,自适应惯性权重 ω \omega ω粒子群优化算法虽然略微优于惯性权重 ω \omega ω不变的粒子群算法,但其较于线性与非线性权重函数惯性权重,效果还是较差。但这只是对于这个例子而言,并不能说此方法不好。因为现在的惯性权重不仅与当前迭代次数、迭代总次数有关还与每个粒子的适应度有关

1.3、随机惯性权重

  随机的惯性权重可以避免在迭代前期局部搜索能力不足;也可以避免在迭代后期全局搜索能力不足。当然这也是前面几种改进方法的共性。
  惯性权重的公式如下:
ω ( k ) = ω m i n − ( ω m a x − ω m i n ) × r a n d + σ × r a n d n \omega(k) = \omega_{min} - (\omega_{max}-\omega_{min})\times rand + \sigma \times randn ω(k)=ωmin(ωmaxωmin)×rand+σ×randn
其中:

  1. ω m a x \omega_{max} ωmax ω m i n \omega_{min} ωmin是最大和最小惯性系数,一般取为0.9和0.4;
  2. rand为[0 1]之间均匀分布的随机数;
  3. randn为正态分布的随机数;
  4. σ \sigma σ(标准差,一般取0.2-0.5之间的数)用来度量随机惯性权重 ω \omega ω与其数学期望之间的偏离程度,该项是为了控制取值中的权重误差,是权重 ω \omega ω有利于向期望权重方向进化,这样做的依据是正常情况下实验误差服从正态分布。

  算法参数设置:种群规模 20,进化300代。每个实验设置运行 100次,将100 次的平均值作为最终结果。将距离最优解1.0054 误差为0.01 的解视为接近最优解,将0.8477 及更小的解视为陷人局部最优的解。
粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现
  具体结果:

ω \omega ω 求得最优值 平均值 陷入次优解次数 接近次优解次数
随机惯性权重 1.0054 0.9707 22 78

  由上图和上表可以看出,随机惯性权重ω粒子群优化算法与惯性权重ω不变的粒子群算法结果相差不大。但还是那句话,这只是对于这个例子而言,并不能说此方法不好。大家可以试一下其他例子。😂😂😂

2、学习因子的选择

2.1压缩(收缩)因子法

  个体学习因子c1和社会(群体)学习因子c2决定了粒子本身经验信息和其他粒子的经验信息对粒子运行轨迹的影响,其反映了粒子群之间的信息交流。设置c1较大的值,会使粒子过多地在自身的局部范围内搜索,而较大的c2的值,则又会促使粒子过早收敛到局部最优值。为了有效地控制粒子的飞行速度,使算法达到全局搜索与局部搜索两者间的有效平衡, Clerc构造了引入收缩因子的PSO模型,采用了压缩因子,这种调整方法通过合适选取参数,可确保PSO算法的收敛性,并可取消对速度的边界限制。
  学习因子的公式如下:
V i d k = Φ [ ω V i d k − 1 + c 1 r 1 ( P i d k − X i d k ) + c 2 r 2 ( P g d k − X i d k ) ] V_{id}^{k} = \Phi[\omega V_{id}^{k-1} + c_1r_1(P_{id}^k - X_{id}^k) + c_2r_2(P_{gd}^k - X_{id}^k)] Vidk=Φ[ωVidk1+c1r1(PidkXidk)+c2r2(PgdkXidk)]
压缩因子法中应用较多的个体学习因子c1和社会学习因子c2均取2.05。惯性权重 ω \omega ω = 0.9。收缩因子 Φ \Phi Φ = 2 ∣ ( 2 − C − C 2 − 4 C ) ∣ \frac{2}{|(2-C-\sqrt{C^2-4C})|} (2CC24C )2。C = c1+c2 = 4.1。
  算法参数设置:种群规模 20,进化300代。每个实验设置运行 100次,将100 次的平均值作为最终结果。将距离最优解1.0054 误差为0.01 的解视为接近最优解,将0.8477 及更小的解视为陷人局部最优的解。
粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现
  具体结果:

c 1 , c 2 c_1,c_2 c1,c2 求得最优值 平均值 陷入次优解次数 接近次优解次数
压缩(收缩)因子法 1.0054 0.9507 32 68

  由上图和上表可以看出,压缩(收缩)因子法粒子群优化算法连惯性权重ω不变的粒子群算法结果都不如(有点尴尬)。但永远还是还是那句话,这只是对于这个例子而言,并不能说此方法不好。大家可以试一下其他例子。😂😂😂大家知道有这个方法就行了。

2.1非对称学习因子

  学习因子c1和c2决定粒子个体经验信息和其他粒子经验信息对寻优轨迹的影响,反映了粒子之间的信息交换。设置较大的c1值,会使粒子过多的在局部搜索;反之,较大的c2值会使粒子过早收敛到局部最优值(没话说了,所以又把前面的抄了一遍😂😂😂)。因此,在算法搜索初期采用较大的c1值和较小的c2值,使粒子尽量发散到搜索空间即强调“个体独立意识”,而较少受到种群内其他粒子即“社会意识部分”的影响,以增加群内粒子的多样性。随着选代次数的增加,使c1线性递减, c2线性递增,从而加强了粒子向全局最优点的收敛能力。
  学习因子的公式如下:
c 1 k = c 1 i n i + ( c 1 f i n − c 1 i n i ) × k T M A X ; c 2 k = c 2 i n i + ( c 2 f i n − c 2 i n i ) × k T M A X c_1^k = c_1^{ini} + (c_1^{fin} - c_1^{ini}) \times \frac{k}{T_{MAX}};c_2^k = c_2^{ini} + (c_2^{fin} - c_2^{ini}) \times \frac{k}{T_{MAX}} c1k=c1ini+(c1finc1ini)×TMAXk;c2k=c2ini+(c2finc2ini)×TMAXk
其中:

  1. c 1 i n i c_1^{ini} c1ini = 2.5;个体学习因子初始值;
  2. c 1 f i n c_1^{fin} c1fin = 0.5:个体学习因子终止值;
  3. c 2 i n i c_2^{ini} c2ini = 1;社会学习因子初始值;
  4. c 2 f i n c_2^{fin} c2fin = 2.25:个体学习因子终止值;

  算法参数设置:种群规模 20,进化300代。每个实验设置运行 100次,将100 次的平均值作为最终结果。将距离最优解1.0054 误差为0.01 的解视为接近最优解,将0.8477 及更小的解视为陷人局部最优的解。
粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现
  具体结果:

c 1 , c 2 c_1,c_2 c1,c2 求得最优值 平均值 陷入次优解次数 接近次优解次数
非对称学习因子 1.0054 0.9507 5 95

  由上图和上表可以看出, 非对称学习因子粒子群优化算法较其他优化方法在这个例子中效果是最好的。(终于不用再说那句话了😂😂)。

3、自动退出迭代循环

  当粒子已经找到最佳位置后,再增加选代次数只会浪费计算时间,那么我们能否设计一个策略,能够自动退出迭代呢?
粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现

  1. 初始化最大迭代次数、计数器以及最大计数值(例如分别取100,0, 20);
  2. 定义“函数变化量容忍度”,一般取非常小的正数,例如10^(-6);
  3. 在迭代的过程中,每次计算出来最佳适应度后,都计算该适应度和上一次迭代时最佳适应度的变化量(取绝对值);
  4. 判断这个变化量和“函数变化量容忍度”的相对大小,如果前者小,则计数器
    加1;否则计数器清0;
  5. 不断重复这个过程,有以下两种可能:
    ①此时还没有超过最大选代次数,计数器的值超过了最大计数值,那么我们
    就跳出迭代循环,搜索结束。
    ②此时已经达到了最大选代次数,那么直接跳出循环,搜索结束。

进行一次搜索时可以发现这样做并不会对结果的准确度产生影响,结果如下图所示:
粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现

  算法参数设置:种群规模 20,进化300代。每个实验设置运行 100次,将100 次的平均值作为最终结果。将距离最优解1.0054 误差为0.01 的解视为接近最优解,将0.8477 及更小的解视为陷人局部最优的解。
  结果:

c 1 , c 2 c_1,c_2 c1,c2 求得最优值 平均值 陷入次优解次数 接近次优解次数 运行时间
非对称学习因子 1.0054 0.9507 5 95 5.404689
自动退出迭代循环(用非对称学习因子) 1.0054 1.0054 0 100 1.968886

  由上图和上表可以看出,自动退出迭代循环粒子群优化算法在保证准确率的情况下大大的缩短了运行时间。👍👍
  
  
  
  

喜欢的小伙伴麻烦点个赞加关注奥,谢谢啦🙏🙏
所有代码:https://pan.baidu.com/s/1opVfYGMtZDUBmtWGi8kGRg
提取码:6666

参考:
MATLAB智能算法30案例分析(第二版)
随机惯性权重的简化粒子群优化算法[J]. 计算机应用研究, 2014, 031(002):361-363,391.
毛开富,包广清,徐驰. 基于非对称学习因子调节的粒子群优化算法[J]. 计算机工程, 2010(19):188‐190.文章来源地址https://www.toymoban.com/news/detail-403432.html

到了这里,关于粒子群算法及通过惯性权重和学习因子对其进行改进—MATLAB实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习与深度学习——通过knn算法分类鸢尾花数据集iris求出错误率并进行可视化

    什么是knn算法? KNN算法是一种基于实例的机器学习算法,其全称为K-最近邻算法(K-Nearest Neighbors Algorithm)。它是一种简单但非常有效的分类和回归算法。 该算法的基本思想是:对于一个新的输入样本,通过计算它与训练集中所有样本的距离,找到与它距离最近的K个训练集样

    2024年02月03日
    浏览(39)
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子

    自用生信代码, 花费一个多月写下来的。自学R以来第一次写600多行的代码。我的文章已经发表,如对您的研究有帮助希望可以引用一下。文章点我 主要是借助e1071包, 实现mSVM-REF识别并筛选关键基因,没有安装的小伙伴需要安装一下。 mSVM-REF函数是John Colby教授写的链接点我

    2023年04月24日
    浏览(44)
  • Java实现输入学号、姓名、年龄,并对其进行输出

    一、前言 二、代码部分 三、程序运行结果(面板弹出)  四、涉及到的知识点代码 1.本代码是我在上学时写的,有一些地方没能完美实现,请包涵也请多赐教! 2.本弹窗界面可以根据简单的要求进行输入,并显示是否正确,该文章代码设置的是在代码实现输入学号、姓名、

    2024年02月07日
    浏览(50)
  • 【数据挖掘】基于粒子群算法优化支持向量机PSO-SVM对葡萄酒数据集进行分类

    PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一种基于种群的随机优化技术,由Eberhart和Kennedy于1995年提出。粒子群算法是模仿昆虫、兽群、鸟群和鱼群等的群集行为,这些群体按照一种合作的方法寻找食物,群体中的每个成员通过学习它自身的经验和其他成员

    2024年02月02日
    浏览(55)
  • 微信小程序获取元素节点并对其进行操作

    1.封装获取元素的方法 utils.js 2.页面js中引入 3.页面js中使用

    2024年02月16日
    浏览(44)
  • CVE漏洞是什么,如何对其进行针对性的防护

    CVE(Common Vulnerabilities and Exposures)漏洞是一个网安技术术语,用于描述和标识信息安全领域的已知漏洞和安全风险。CVE是一个公开的列表或数据库,它为各种公开知晓的信息安全漏洞和风险提供了标准化的名称。 每个CVE标识符都是唯一的,并按照一定的格式命名。这些标识符

    2024年04月10日
    浏览(35)
  • 基于 OpenCV 开发实现自动读取气泡测试表并对其进行评分

    文末提供免费的源代码下载链接 为了构建项目,我们需要遵循的步骤是: 找出图像中的轮廓。 使用文档的轮廓获取文档的自上而下视图。 找到文档上两个最大的轮廓。 遮盖文档中除最大轮廓区域之外的所有内容。 分割最大轮廓的区域以获得框中的每个 答案 。 仔细检查每

    2024年02月12日
    浏览(44)
  • 【能量管理系统( EMS )】基于粒子群算法对光伏、蓄电池等分布式能源DG进行规模优化调度研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 能量管理

    2024年02月15日
    浏览(52)
  • 请列举出Tomcat安装目录下的子目录,并对其进行简要说明

    Tomcat 安装目录下的子目录包括: bin:存放 Tomcat 的启动、停止脚本以及其他工具。 conf:存放 Tomcat 的配置文件,例如 server.xml、web.xml 等。 lib:存放 Tomcat 的核心 jar 包以及其他库文件。 logs:存放 Tomcat 的日志文件。 temp:存放 Tomcat 运行过程中生成的临时文件。 webapps:存放

    2024年02月08日
    浏览(48)
  • 数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)

    目录 基本介绍 平衡因子 平衡二叉树  平衡二叉树的高度  什么是平衡二叉树? 以一个例子来解释一下: 搜索树结点按不同的插入次序,将会导致不同的深度和平均查找长度ASL   在二叉搜索树中查找一个元素:  (a)要找到Jan,需要查找一次;要找到Feb,需要查找两次;

    2023年04月26日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包