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

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

文章目录

  • 粒子群算法
    • 一、理论基础
      • 1、介绍
      • 2、核心公式
      • 3、图形直观解释
    • 二、问题描述
    • 三、解题思路
    • 四、MATLAB实现
      • 1、参数设置
      • 2、种群初始化
      • 3、寻找初始极值
      • 4、迭代寻优
      • 5、结果分析
    • 五、算法优化
      • 1、惯性权重的选择
      • 1.1、线性递减惯性权重与非线性递减权重
        • 1.1.1、线性与非线性权重函数的性能对比
      • 1.2、自适应惯性权重
      • 1.3、随机惯性权重
      • 2、学习因子的选择
        • 2.1压缩(收缩)因子法
        • 2.1非对称学习因子
      • 3、自动退出迭代循环

粒子群算法

一、理论基础

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实现_第1张图片

   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
  函数图像如下:

  从函数图形可以看出,该函数有很多局部极大值点,而最大值在(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实现_第2张图片

  最终得到的最优个体适应度值为1.0054,对应的粒子位置是(-0.00019024,-0.00034630)。可以看出得出的解接近实际最优解,说明PSO(粒子群算法)具有较强的函数极值寻优。
  寻优过程如下所示:

五、算法优化

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实现_第3张图片
  线性惯性权重只是一种经验做法,常用的惯性权重的选择还包括如下几种(非线性权重):
ω ( 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实现_第4张图片

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

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

ω \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实现_第6张图片
  具体结果:

ω \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实现_第7张图片
  具体结果:

ω \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实现_第8张图片
  具体结果:

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实现_第9张图片
  具体结果:

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

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

3、自动退出迭代循环

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

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

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

  算法参数设置:种群规模 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.

你可能感兴趣的:(算法,matlab,启发式算法)