粒子群优化算法

粒子群优化算法

概述

粒子群优化(PSO, particle swarm optimization)算法是计算智能领域,除了蚁群算法,鱼群算法之外的一种群体智能的优化算法,该算法最早由Kennedy和Eberhart在1995年提出的,该算法源自对鸟类捕食问题的研究。
  • PSO算法首先在可行解空间中初始化一群粒子,每个粒子都代表极值优化问题的一个潜在最优解,用位置、速度和适应度值三项指标表示该粒子特征。
  • 粒子在解空间中运动,通过跟踪个体极值Pbest和群体极值Gbest更新个体位置,个体极值Pbest是指个体所经历位置中计 算得到的适应度值最优位置,群体极值Gbest是指种群中的所有粒子搜索到的适应度最优位置。
  • 粒子每更新一次位置,就计算一次适应度值,并且通过比较新粒子的适应度值和个体极值、群体极值的适应度值更新个体 极值Pbest和群体极值Gbest位置。
在每一次迭代过程中,粒子通过个体极值和群体极值更新自身的速度和位置,更新公式

原理

PSO从这种模型中得到启示并用于解决优化问题。PSO 中,每个优化问题的潜在解都是搜索空间中的一只鸟,称之为粒子。所有的粒子都有一个由被优化的函数决定的适值( fitness value) ,每个粒子还有一个速度决定它们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索[1]。
PSO初始化为一群随机粒子(随机解),然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个极值来更新自己;第一个就是粒子本身所找到的最优解,这个解称为个体极值;另一个极值是整个种群目前找到的最优解,这个极值是全局极值。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。
假设在一个D维的目标搜索空间中,有N个粒子组成一个群落,其中第i个粒子表示为一个D维的向量在这里插入图片描述
第i个粒子的“飞行 ”速度也是一个D维的向量,记为
在这里插入图片描述
第I个粒子迄今为止搜索到的最优位置称为个体极值,记为
在这里插入图片描述
整个粒子群迄今为止搜索到的最优位置为全局极值,记为
在这里插入图片描述
在找到这两个最优值时,粒子根据如下的公式1和公式2来更新自己的速度和位置:
在这里插入图片描述

流程

算法的流程如下:
① 初始化粒子群,包括群体规模N,每个粒子的位置xi和速度 vi
② 计算每个粒子的适应度值 Fit[i];
③ 对每个粒子,用它的适应度值Fit[i]和个体极值Pbest(i)比较,如果Fit[i]>Pbest(i),则用Fit[i]替换掉Pbest(i);
④ 对每个粒子,用它的适应度值Fit[i]和全局极值gbest比较,如果Fit[i]>Pbest(i),则用Fit[i]替Pbest(i);
⑤ 根据公式1和公式2更新粒子的速度vi和位置xi;
⑥ 如果满足结束条件(误差足够好或到达最大循环次数)退出,否则返回②。
在这里插入图片描述

惯性权重算法

线性递减策略

在这里插入图片描述
其中,w是惯性权重,wmax是惯性权重最大值,wmin是惯性权重最小值,t是当前迭代次数,是变量;tmax是总共迭代次数,是常量
该方法中,惯性权重跟时间成负相关,并且惯性权重是时间的一次函数,斜率恒定。当初始迭代时,惯性权重w比较大,反应在速度v的计算公式上可以看出初始迭代的时候粒子的速度比较大,具有很好的全局搜索能力,而局部搜索能力较弱;随着迭代次数的累加,w的值越来越小,粒子的速度也越来越小,此时粒子具有很好的局部搜索能力,而全局搜索能力较弱。但是由于斜率恒定,所以速度的改变总是保持同一水平。
如果初始迭代的时候并没有产生较好的点,那么随着迭代的累加以及速度的迅速衰减很可能导致最后陷入局部最优值

代码

%% 清空环境
clc
clear

%% 参数初始化
%粒子群算法中的三个参数
c1 = 1.49445;%加速因子
c2 = 1.49445;
ws=0.9   %惯性权重
we=0.4

maxgen=1000;   % 进化次s数  
sizepop=200;   %种群规模

Vmax=1;       %限制速度围
Vmin=-1;     
popmax=5;    %变量取值范围
popmin=-5;
dim=10;       %适应度函数维数

func=3;       %选择待优化的函数,1为Rastrigin,2为Schaffer,3为Griewank
Drawfunc(func);%画出待优化的函数,只画出二维情况作为可视化输出

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

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

%% 迭代寻优
for i=1:maxgen
    w=ws-(ws-we)*i/maxgen; %线性递减
    fprintf('第%d代,',i);
    fprintf('最优适应度%f\n',fitnessgbest);
    for j=1:sizepop
        %速度更新
        V(j,:) = w*V(j,:) + c1*rand*(pbest(j,:) - pop(j,:)) + c2*rand*(gbest - pop(j,:)); %根据个体最优pbest和群体最优gbest计算下一时刻速度
        V(j,find(V(j,:)>Vmax))=Vmax;   %限制速度不能太大
        V(j,find(V(j,:)<Vmin))=Vmin;
        
        %种群更新
        pop(j,:)=pop(j,:)+0.5*V(j,:);       %位置更新
        pop(j,find(pop(j,:)>popmax))=popmax;%坐标不能超出范围
        pop(j,find(pop(j,:)<popmin))=popmin;
        
        if rand>0.98                         %加入变异种子,用于跳出局部最优值
            pop(j,:)=rands(1,dim);
        end
        
        %更新第j个粒子的适应度值
        fitness(j)=fun(pop(j,:),func); 
   
    end
    
    for j=1:sizepop
        
        %个体最优更新
        if fitness(j) < fitnesspbest(j)
            pbest(j,:) = pop(j,:);
            fitnesspbest(j) = fitness(j);
        end
        
        %群体最优更新
        if fitness(j) < fitnessgbest
            gbest = pop(j,:);
            fitnessgbest = fitness(j);
        end
    end 
    yy(i)=fitnessgbest;    
        
end
%% 结果分析
figure;
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

参数对比

注:每组实验进行10次,取平均值与最优值进行对比

待优化的函数为Rastrigin函数

关于加速因子(c1,c2)与惯性参数(w)
1、设置c1=1.49445,c2=1.49445,迭代次数1000
1.1、设置最大权重ws=0.9,最小权重we=0.4

实验结果:
在这里插入图片描述

1.2、设置最大权重ws=0.8,最小权重we=0.3

实验结果:
在这里插入图片描述

1.3、设置最大权重ws=0.7,最小权重we=0.2

实验结果:
在这里插入图片描述

1.4、设置最大权重ws=0.6,最小权重we=0.1

实验结果:
在这里插入图片描述

实验结论

试验表明权值w将影响PSO 的全局与局部搜优能力,w值较大,全局搜优能力强,局部搜优能力弱;反之,则局部搜优能力增强,而全局搜优能力减弱。
由多次实验对比得,设置惯性权重最大值越小,实验结果越优。最优值可设置惯性权重最大值ws=0.6,惯性权重最小值we=0.1.

2、设置ws=0.6,we=0.1,迭代次数1000
2.1、设置加速因子c1=1.9,加速因子c2=1.1

实验结果:
在这里插入图片描述

2.2、设置加速因子c1=1.8,加速因子c2=1.2

实验结果:
在这里插入图片描述

2.3、设置加速因子c1=1.7,加速因子c2=1.3

在这里插入图片描述

2.4、设置加速因子c1=1.6,加速因子c2=1.4

在这里插入图片描述

2.5、设置加速因子c1=1.5,加速因子c2=1.5

在这里插入图片描述

实验结论

由多次实验对比得,当c1与c2接近时,结果越优;但相同且等于1.5时,结果不尽人意。可取加速因子c1=1.6,加速因子c2=1.4作为较优参数值

关于进化次数(maxgen)与适应度函数维数(dim)
3、设置ws=0.6,we=0.1,加速因子c1=1.6,加速因子c2=1.4,进化次数maxgen=1000
3.1、设置适应度函数维数dim=11

在这里插入图片描述

3.2、设置适应度函数维数dim=10

在这里插入图片描述

3.3、设置适应度函数维数dim=9

在这里插入图片描述

3.4、设置适应度函数维数dim=8

在这里插入图片描述

3.5、设置适应度函数维数dim=7

在这里插入图片描述

3.6、设置适应度函数维数dim=6

在这里插入图片描述

实验结果

通过多次实验对比,发现对于进化次数1000来说,适应度函数维数越小,结果越优.当适应度函数维数为6时,结果已经达到最优

  • 4
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值