粒子群算法的寻优算法

粒子群优化算法概述

粒子群优化(PSO, particle swarm optimization)算法是计算智能领域,除了蚁群算法,鱼群算法之外的一种群体智能的优化算法,该算法最早由Kennedy和Eberhart在1995年提出的,该算法源自对鸟类捕食问题的研究。

PSO算法首先在可行解空间中初始化一群粒子,每个粒子都代表极值优化问题的一个潜在最优解,用位置、速度和适应度值三项指标表示该粒子特征。

粒子在解空间中运动,通过跟踪个体极值Pbest和群体极值Gbest更新个体位置,个体极值Pbest是指个体所经历位置中计算得到的适应度值最优位置,群体极值Gbest是指种群中的所有粒子搜索到的适应度最优位置。

粒子每更新一次位置,就计算一次适应度值,并且通过比较新粒子的适应度值和个体极值、群体极值的适应度值更新个体极值Pbest和群体极值Gbest位置。

在每一次迭代过程中,粒子通过个体极值和群体极值更新自身的速度和位置,更新公式如下:
在这里插入图片描述
迭代次数:对于复杂问题,进化代数可以相应地提高;
惯性权重:该参数反映了个体历史成绩对现在的影响
空间维数:粒子搜索的空间维数即为自变量的个数。
位置限制:限制粒子搜索的空间,即自变量的取值范围,对于无约束问题此处可以省略。
速度限制:如果粒子飞行速度过快,很可能直接飞过最优解位置,但是如果飞行速度过慢,会使得收敛速度变慢,因此设置合理的速度限制就很有必要了。

代码实现

%% 清空环境
clc
clear

%% 参数初始化
%粒子群算法中的三个参数
c1 = 1.49445;%加速因子
c11=c1;
c2 = 1.49445;
c22=c2;
w=0.8  %惯性权重
%w1=0.99 %希望改变的权重
%w0=w;
maxgen=1000;   % 进化次s数  
sizepop=200;   %种群规模1

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

func=1;       %选择待优化的函数,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
    
    fprintf('第%d代,',i);
    fprintf('最优适应度%f\n',fitnessgbest);
    %w=w+(w1-w0)/maxgen;
    %c1=c1+(1-c11)/maxgen;
    %c2=c2+(2-c22)/maxgen;
    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);

实验结果与分析

初始 c1 = 1.49445; c2 = 1.49445; w=0.8; sizepop=200;dim=10;
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述平均最优适应度=4.58496
使惯性权重线性变化
c1 = 1.49445; c2 = 1.49445; w从0.8线性变化到0.6
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述平均最优适应度=2.0068

c1 = 1.49445; c2 = 1.49445;w从0.8线性变化到0.4

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述平均最优适应值度=4.9747

c1 = 1.49445; c2 = 1.49445; w从0.8线性变化到0.99
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述平均最优适应值度=1.19488
实验结果分析:惯性权重随迭代次数变化而线性变小,会使得函数更容易收敛,但是如果惯性权重过小会导致过早陷入局部最优解,而无法拜托。惯性权重随迭代次数变化而线性变大,会使得种群多样性变大,容易跳出局部最优解,但是会使得函数不容易收敛。

使加速因子改变

c1从1.49445线性变化到1 ; c2 = 1.49445; w=0.8
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述平均最优适应度=3.3828

c1=1.49445 ; c2 从1.49445线性变化到 2; w=0.8
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述平均最优适应度=1.3956

c1 从1.49445线性变化到 1; c2 从1.49445线性变化到 2; w=0.8
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述平均最优适应度=0.99492

实验结果分析:从结果看,惯性权重随迭代次数线变小会使个体与自身最优适应度之间的关系减少,使得最后结果偏向全局最优解,但是如果惯性权重过小,刚开始运算时便无法找到局部最优解,而导致迭代完后效果不明显。而惯性权重随迭代次数变大,会使得个体更偏向与全局最优解,在迭代后期,惯性权重越大越容易使的结果跳出局部最优解,而得到全局最优解。如果两个同时变化,会使得函数更早得到全局最优解

改变种群规模和适应度函数维数
sizepop=500; dim=10;
在这里插入图片描述在这里插入图片描述在这里插入图片描述平均最优适应度=0.331635

sizepop=200;dim=10;
在这里插入图片描述在这里插入图片描述在这里插入图片描述平均最优适应度=3.3798

sizepop=200; dim=7;
在这里插入图片描述在这里插入图片描述在这里插入图片描述平均最优适应度=0.3783

sizepop=200; dim=4;
在这里插入图片描述在这里插入图片描述在这里插入图片描述平均最优适应度=0

实验结果分析:改变种群规模,种群规模变大会导致运行速度变慢,但是种群的多样性提示,不容易陷入局部最优解。种群规模变小虽然增加了运行速度,但是减小了种群的多样性,容易过早收敛陷入局部最优。改变适应度函数维数,适应度函数维数值变小是容易找到全局最优解。

版权声明:本文为qq_41958347原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41958347/article/details/103369364