粒子群优化算法

粒子群优化算法

  • 1、概念
  • 2、基本思想
  • 3、流程
  • 4、代码
  • 5、参数变换测试
  • 6、结论

1、概念

粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解

2、基本思想

粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。

3、流程

标准PSO的算法流程如下:
  i)初始化一群微粒(群体规模为m),包括随机的位置和速度;
  ii)评价每个微粒的适应度;
  iii)对每个微粒,将它的适应值和它经历过的最好位置pbest的作比较,如果较好,则将其作为当前的最好位置pbest;
  iv)对每个微粒,将它的适应值和全局所经历最好位置gbest的作比较,如果较好,则重新设置gbest的索引号;
  v)变化微粒的速度和位置;
  vi)如未达到结束条件(通常为足够好的适应值或达到一个预设最大代数Gmax),回到ii)。

4、代码


%% 清空环境
clc
clear

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

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

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

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);
    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,:)popmax))=popmax;%坐标不能超出范围
        pop(j,find(pop(j,:)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);


5、参数变换测试

1 、改变惯性权重
这里的w根据迭代次数的改变而改变呈线性减少,从1下降到0.2
主要代码:w=(maxgen-i)/maxgen*0.8+0.2;
最终最优适应度的平均值为:(0.000000+1.989981+0.000000+1.028232+6.964713+3.979836+3.979836+2.984877+0.103725+2.984877)/10=2.401608

2 、改变加速因子和惯性权重参数
c1从2降到1,c2从1升到2,w从0.9降到0.3
主要代码部分:w=(maxgen-i)/maxgen0.6+0.3; c1=(maxgen-i)/maxgen1+1; c2=i/maxgen*1+1;
测试10次后最终最优适应度的平均值为:(5.969754+2.984877+0.000000+0.000000+0.000000+1.989918+0.994959+0.000000+0.000000+6.964713)/10=1.890422

3 、只改变加速因子参数
c1从2降到1.2,c2从1.2升到2,其他参数不变。
主要代码部分:c1=(maxgen-i)/maxgen0.8+1.2; c2=i/maxgen0.8+1.2;
测试10次后最终最优适应度的平均值为:(3.979836+6.964713+0.000000+0.994959+0.994959+0.000000+1.989918+4.974795+2.984877+0.000000)/10=2.288406

4 、改变维度
维度为10时,最终最优适应度的平均值为:(6.964713+5.969754+1.989918+2.984877+6.964713+5.111020+4.974795+0.158339+4.974795+3.979836)/10=4.407276

维度为15时,最终最优适应度的平均值为:
(5.969754+4.974795+9.949591+3.979836+6.964713+2.984877+3.979836+2.986606+11.939509+6.964713)/10=6.029423

6、结论

(1)它是一类不确定算法。不确定性体现了自然界生物的生物机制,并且在求解某些特定问题方面优于确定性算法。
(2)是一类概率型的全局优化算法。非确定算法的优点在于算法能有更多机会求解全局最优解。
(3)不依赖于优化问题本身的严格数学性质。
(4)是一种基于多个智能体的仿生优化算法。粒子群算法中的各个智能体之间通过相互协作来更好的适应环境,表现出与环境交互的能力.
(5)具有本质并行性。包括内在并行性和内含并行性。
(6)具有突出性。粒子群算法总目标的完成是在多个智能体个体行为的运动过程中突现出来的。
(7)具有自组织和进化性以及记忆功能,所有粒子都保存优解的相关知识。
(8)都具有稳健性。稳健性是指在不同条件和环境下算法的实用性和有效性,但是现在粒子群算法的数学理论基础还不够牢固,算法的收敛性还需要讨论。

你可能感兴趣的:(粒子群优化算法)