粒子群算法的改进策略综述(及MATLAB代码实现)

一:粒子群优化算法(Partical Swarm Optimization PSO),粒子群中的每一个粒子都代表一个问题的可能解,通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性。同时,PSO算法的缺点也是显而易见的:经典的粒子群算法随着粒子种群的进化,其多样性不断减小,导致了过早的快速收敛到局部最优。以下主要通过两个方面增强粒子群的迭代寻优能力。

二:经典的粒子群算法的寻优性能在很大程度上依赖于其惯性权重、学习因子参数的设置选择。由此,初始粒子的每一次迭代都进行了空间位置、速度的更新,忽略了不同代粒子间的差异性,应用了统一的固定参数 。

针对于这一问题在参数设置上:采用了线性递减的参数设置,以较大的惯性权重和学习因子为开局,有利于增加初始粒子群的全局迭代寻优能力;以较小的惯性权重和学习因子为结束,有利于加强最终粒子群跳出局部最好解。

(1)通常对粒子群算法的参数设置(惯性权重和学习因子进行改进):

1:线性递减的惯性权重和学习因子

下列公式为动态线性递减的惯性权重和学习因子,一般来讲w_{max}=0.9w_{min}=0.4;c_{max}=1.5,c_{min}=0.5,由此可以得到线性递减的惯性权重和学习因子,其递减情况如下图所示。


w=w_{max}-\frac{w_{max}-w_{min}}{t_{max}}*t

c_{1}=c_{2}=c_{max}-\frac{c_{max}-c_{min}}{t_{max}}*t

粒子群算法的改进策略综述(及MATLAB代码实现)_第1张图片粒子群算法的改进策略综述(及MATLAB代码实现)_第2张图片

2:非线性递减的惯性权重和学习因子

同理可以得到非线性递减的惯性权重和学习因子:

w=(w_{max}-w_{min}-d_{1})e^{\frac{1}{1+d_{2}*t/t_{max}}}

c_{1}=c_{2}=(c_{max}-c_{min}-d_{1})e^{\frac{1}{1+d_{2}*t/t_{max}}}

粒子群算法的改进策略综述(及MATLAB代码实现)_第3张图片粒子群算法的改进策略综述(及MATLAB代码实现)_第4张图片

 (2)融合其他算法,形成混合算法(以遗传算法为例):

针对于经典的粒子群优化算法易陷入局部最好解,在迭代后期粒子种群多样性减少的
问题,将遗传算法中的遗传操作与动态参数的粒子群算法结合起来 ,提出改进的粒子群
优化算法(简写为GW-PSO算法),通过交叉因子更新当前粒子群的空间位置,这个过程产生新的粒子群更加符合目标优化函数,得到了更好的适应度,进而提高了经典的粒子群算法的局部搜索能力;利用变异因子对影响新的粒子种群的产生,提高粒子的多样性和全局搜索能力。在进行交叉因子操作时,将每一代的粒子的交叉概率设置为,每次交叉与上一代的全局最优粒子进行交叉,得到的后一代即为新产生的更符合目标优化函数的粒子种群。(以下为数学公式依据)

GApop_{id}^{n+1}=\varepsilon \times GApop_{id}^{n}+(1-\varepsilon )\times gbest_{id}^{n}

 参考以上公式对粒子群进行交叉操作,以下公式对粒子群进行变异操作,增强粒子群在迭代后期的突变能力,有利于其突破局部最优解。

GApop_{id}^{n+1}=GApop_{id}^{n}+r_{id}^{n}

#############交叉变异因子部分代码
for z=1:N
   GApop1(z,:)=GApop(e(z),:);
 end
[n1 m1]=size(GApop1);
thebest=gbest'*ones(1,n1);
 GApops=0.5*GApop1+0.5*thebest';
 %进行变异操作
 %max1=max(max(gbest));
% min1=min(min(gbest));
% % max2=round(max1);
% % min2=round(min1);
c3=randperm(sizepop);
b1=c3(1:M);
e1=b1';
for z1=1:M
  GApop2(z1,:)=GApop(e1(z1),:);
end
GApops1=GApop2+randi([popmin,popmax],M,Dim);
GApops2=[GApops;GApops1];
pop=GApops2;

三:调用经典函数进行测试,检验优化效果。

主函数调用命令,以及待测试函数声明:

maxgen=100;popmax=200;popmin=-200;index=1;esp=10^-10;
[fitnessgbest,gen]= pso1( maxgen,popmax,popmin,index,esp);   
zuicha=max(fitnessgbest)
zuihao=min(fitnessgbest)
pingjun=mean(fitnessgbest)
fangcha=std(fitnessgbest)
[bestfitness bestindex] = min(fitnessgbest)
gen(bestindex)
mean(gen)

    case 1 %Sphere函数
        y=sum(x.^2);

    case 2 %Rosenbrock函数
        y=0;
        for i=2:length(x)
        	y=y+100*(x(i)-x(i-1)^2)^2+(x(i-1)-1)^2;
        end
    case 3 %Rastrigin函数
        s = 0;
        for j = 1:length(x)
            s = s+(x(j)^2-10*cos(2*pi*x(j)));
        end
        y = 10*length(x)+s;
    case 4 %Griewank函数
        fr = 4000;
        s = 0;
        p = 1;
        for j = 1:length(x); s = s+x(j)^2; end
        for j = 1:length(x); p = p*cos(x(j)/sqrt(j)); end
        y = s/fr-p+1;

end

选取一个为例作图分析,横坐标为迭代次数,纵坐标为适应度:

粒子群算法的改进策略综述(及MATLAB代码实现)_第5张图片

 ddhttps://download.csdn.net/download/qq_42430957/85460865?spm=1001.2014.3001.5503

欢迎交流,微信:gzry3360

你可能感兴趣的:(matlab,算法,开发语言)