当前位置:   article > 正文

粒子群优化算法(PSO)_粒子群优化算法流程

粒子群优化算法流程

目录

一、算法基本流程

1.1算法概述

1.2 算法流程图

二、代码实现

三、结果分析


一、算法基本流程

1.1算法概述

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

算法步骤:

 (1)初始化所有的微粒,包括它们的位置和速度,把个体的历史最优pBest设为当前位置,群体的最优个体作为当前的gBest;
 (2)每一代的进化中,计算每个粒子的适应度函数值;
 (3)对每个微粒,将它的适应值和它经历过的最好位置pbest的作比较,如果较好,则将其作为当前的最好位置pBest;
 (4)对每个微粒,将它的适应值和全局所经历最好位置gbest的作比较,如果较好,则重新设置gBest的索引号;
 (5)变化微粒的速度和位置;
 (6)如未达到结束条件(通常为足够好的适应值或达到一个预设最大代数Gmax) ,回到(2),否则输出gBest并结束。
 

  在每一次迭代过程中,粒子通过个体极值和群体极值更新自身的速度和位置,更新公式 如下:

 

 

1.2 算法流程图

 

 

 

二、代码实现

PSO.m

  1. %% 清空环境
  2. clc
  3. clear
  4. %% 参数初始化
  5. %粒子群算法中的三个参数
  6. c1 = 1.49445;%加速因子
  7. c2 = 1.49445;
  8. w=0.8 %惯性权重
  9. maxgen=1000; % 进化次s数
  10. sizepop=200; %种群规模
  11. Vmax=1; %限制速度围
  12. Vmin=-1;
  13. popmax=5; %变量取值范围
  14. popmin=-5;
  15. dim=10; %适应度函数维数
  16. func=1; %选择待优化的函数,1为Rastrigin,2为Schaffer,3为Griewank
  17. Drawfunc(func);%画出待优化的函数,只画出二维情况作为可视化输出
  18. %% 产生初始粒子和速度
  19. for i=1:sizepop
  20. %随机产生一个种群
  21. pop(i,:)=popmax*rands(1,dim); %初始种群
  22. V(i,:)=Vmax*rands(1,dim); %初始化速度
  23. %计算适应度
  24. fitness(i)=fun(pop(i,:),func); %粒子的适应度
  25. end
  26. %% 个体极值和群体极值
  27. [bestfitness bestindex]=min(fitness);
  28. gbest=pop(bestindex,:); %全局最佳
  29. pbest=pop; %个体最佳
  30. fitnesspbest=fitness; %个体最佳适应度值
  31. fitnessgbest=bestfitness; %全局最佳适应度值
  32. %% 迭代寻优
  33. for i=1:maxgen
  34. fprintf('第%d代,',i);
  35. fprintf('最优适应度%f\n',fitnessgbest);
  36. for j=1:sizepop
  37. %速度更新
  38. V(j,:) = w*V(j,:) + c1*rand*(pbest(j,:) - pop(j,:)) + c2*rand*(gbest - pop(j,:)); %根据个体最优pbest和群体最优gbest计算下一时刻速度
  39. V(j,find(V(j,:)>Vmax))=Vmax; %限制速度不能太大
  40. V(j,find(V(j,:)<Vmin))=Vmin;
  41. %种群更新
  42. pop(j,:)=pop(j,:)+0.5*V(j,:); %位置更新
  43. pop(j,find(pop(j,:)>popmax))=popmax;%坐标不能超出范围
  44. pop(j,find(pop(j,:)<popmin))=popmin;
  45. if rand>0.98 %加入变异种子,用于跳出局部最优值
  46. pop(j,:)=rands(1,dim);
  47. end
  48. %更新第j个粒子的适应度值
  49. fitness(j)=fun(pop(j,:),func);
  50. end
  51. for j=1:sizepop
  52. %个体最优更新
  53. if fitness(j) < fitnesspbest(j)
  54. pbest(j,:) = pop(j,:);
  55. fitnesspbest(j) = fitness(j);
  56. end
  57. %群体最优更新
  58. if fitness(j) < fitnessgbest
  59. gbest = pop(j,:);
  60. fitnessgbest = fitness(j);
  61. end
  62. end
  63. yy(i)=fitnessgbest;
  64. end
  65. %% 结果分析
  66. figure;
  67. plot(yy)
  68. title('最优个体适应度','fontsize',12);
  69. xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

 Rastrigin.m

图像为:

 

  1. function y = Rastrigin(x)
  2. % Rastrigin函数
  3. % 输入x,给出相应的y值,在x = ( 0 , 0 ,…, 0 )处有全局极小点0.
  4. % 编制人:
  5. % 编制日期:
  6. [row,col] = size(x);
  7. if row > 1
  8. error( ' 输入的参数错误 ' );
  9. end
  10. y =sum(x.^2-10*cos(2*pi*x)+10);
  11. %y =-y;

 Schaffer.m

函数写法:

此函数在(0,...,0)处有最大值1,因此不需要取相反数。

图像为:

 

  1. function y=Schaffer(x)
  2. [row,col]=size(x);
  3. if row>1
  4. error('输入的参数错误');
  5. end
  6. y1=x(1,1);
  7. y2=x(1,2);
  8. temp=y1^2+y2^2;
  9. y=0.5-(sin(sqrt(temp))^2-0.5)/(1+0.001*temp)^2;
  10. %y=-y;

Griewank.m

图像为:

 

  1. function y=Griewank(x)
  2. %Griewan函数
  3. %输入x,给出相应的y值,在x=(0,0,…,0)处有全局极小点0.
  4. %编制人:
  5. %编制日期:
  6. [row,col]=size(x);
  7. if row>1
  8. error('输入的参数错误');
  9. end
  10. y1=1/4000*sum(x.^2);
  11. y2=1;
  12. for h=1:col
  13. y2=y2*cos(x(h)/sqrt(h));
  14. end
  15. y=y1-y2+1;
  16. %y=-y;

 

fun.m

函数用于计算粒子适应度值,选择待优化的函数,1为Rastrigin,2为Schaffer,3为Griewank

  1. function y = fun(x,label)
  2. %x input 输入粒子
  3. %y output 粒子适应度值
  4. if label==1
  5. y=Rastrigin(x);
  6. elseif label==2
  7. y=Schaffer(x);
  8. else
  9. y= Griewank(x);
  10. end

fun1.m 

  1. function y = fun1(x)
  2. %函数用于计算粒子适应度值
  3. %x input 输入粒子
  4. %y output 粒子适应度值
  5. y=-20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+exp(1);
  6. %y=x(1)^2-10*cos(2*pi*x(1))+10+x(2)^2-10*cos(2*pi*x(2))+10;

 

Drawfunc.m

画出待优化的函数,只画出二维情况作为可视化输出 

  1. function Drawfunc(label)
  2. x=-5:0.05:5;%41列的向量
  3. if label==1
  4. y = x;
  5. [X,Y] = meshgrid(x,y);
  6. [row,col] = size(X);
  7. for l = 1 :col
  8. for h = 1 :row
  9. z(h,l) = Rastrigin([X(h,l),Y(h,l)]);
  10. end
  11. end
  12. surf(X,Y,z);
  13. shading interp
  14. xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis');
  15. title('mesh');
  16. end
  17. if label==2
  18. y = x;
  19. [X,Y] = meshgrid(x,y);
  20. [row,col] = size(X);
  21. for l = 1 :col
  22. for h = 1 :row
  23. z(h,l) = Schaffer([X(h,l),Y(h,l)]);
  24. end
  25. end
  26. surf(X,Y,z);
  27. shading interp
  28. xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis');
  29. title('mesh');
  30. end
  31. if label==3
  32. y = x;
  33. [X,Y] = meshgrid(x,y);
  34. [row,col] = size(X);
  35. for l = 1 :col
  36. for h = 1 :row
  37. z(h,l) = Griewank([X(h,l),Y(h,l)]);
  38. end
  39. end
  40. surf(X,Y,z);
  41. shading interp
  42. xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis');
  43. title('mesh');
  44. end

PSOMutation.m

  1. %% 清空环境
  2. clc
  3. clear
  4. %% 参数初始化
  5. %粒子群算法中的两个参数
  6. c1 = 1.49445;
  7. c2 = 1.49445;
  8. maxgen=500; % 进化次数
  9. sizepop=100; %种群规模
  10. Vmax=1;
  11. Vmin=-1;
  12. popmax=5;
  13. popmin=-5;
  14. %% 产生初始粒子和速度
  15. for i=1:sizepop
  16. %随机产生一个种群
  17. pop(i,:)=5*rands(1,2); %初始种群
  18. V(i,:)=rands(1,2); %初始化速度
  19. %计算适应度
  20. fitness(i)=fun(pop(i,:)); %染色体的适应度
  21. end
  22. %% 个体极值和群体极值
  23. [bestfitness bestindex]=min(fitness);
  24. zbest=pop(bestindex,:); %全局最佳
  25. gbest=pop; %个体最佳
  26. fitnessgbest=fitness; %个体最佳适应度值
  27. fitnesszbest=bestfitness; %全局最佳适应度值
  28. %% 迭代寻优
  29. for i=1:maxgen
  30. for j=1:sizepop
  31. %速度更新
  32. V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
  33. V(j,find(V(j,:)>Vmax))=Vmax;
  34. V(j,find(V(j,:)<Vmin))=Vmin;
  35. %种群更新
  36. pop(j,:)=pop(j,:)+0.5*V(j,:);
  37. pop(j,find(pop(j,:)>popmax))=popmax;
  38. pop(j,find(pop(j,:)<popmin))=popmin;
  39. if rand>0.98
  40. pop(j,:)=rands(1,2);
  41. end
  42. %适应度值
  43. fitness(j)=fun(pop(j,:));
  44. end
  45. for j=1:sizepop
  46. %个体最优更新
  47. if fitness(j) < fitnessgbest(j)
  48. gbest(j,:) = pop(j,:);
  49. fitnessgbest(j) = fitness(j);
  50. end
  51. %群体最优更新
  52. if fitness(j) < fitnesszbest
  53. zbest = pop(j,:);
  54. fitnesszbest = fitness(j);
  55. end
  56. end
  57. yy(i)=fitnesszbest;
  58. end
  59. %% 结果分析
  60. plot(yy)
  61. title('最优个体适应度','fontsize',12);
  62. xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

 

三、结果分析

POS.m运行结果

最优个体适应度最接近于零时算法达到很好

 

算法中的参数:

 

  1. %粒子群算法中的三个参数
  2. 加速因子
  3. c1 向自身推进的加速权值
  4. c2 向全局推进的加速权值
  5. w 惯性权重
  6. sizepop 种群规模
  7. dim 适应度函数维数

 

初始时设置:c1 = 1.49445,c2 = 1.49445,w = 0.8,sizepop=200,dim=10

(1)c1 = 1.49445,c2 = 1.49445,sizepop=200,dim=10,改变惯性权重的值  w

w适应度平均值
0.83.581852
0.72.586893
0.62.967745
0.41.893848

w关系到前一速度对当前速度的影响,一般取值在0.9~0.4。因初始种群是随机产生的,当权重w固定为某一个值的时候,我们可以用多次结果取平均值的方法来处理数据。

(2)利用线性递减的函数设置w从0.9到0.4变化,观察记录这时多个结果不同

 典型线性递减策略的w计算公式如下:

w=wmax-(wmax-wmin)\times t\div maxgen

其中 wmax是惯性权重最大值,wmin是惯性权重最小值,t 是当前迭代次数,是个变量,

maxgen是总共迭代次数,是常量,实验中取 1000。

当初始迭代时,惯性权重w比较大,反应在速度v的计算公式上(V(j,:) = w*V(j,:) + c1*rand*(pbest(j,:) - pop(j,:)) + c2*rand*(gbest - pop(j,:)))可以看出初始迭代的时候粒子的速度比较大,具有很好的全局搜索能力,而局部搜索能力较弱。随着迭代次数的累加,w的值越来越小,粒子的速度也越来越小,此时粒子具有很好的局部搜索能力,而全局搜索能力较弱。但是由于斜率恒定,所以速度的改变总是保持同一水平。

 12345678910平均适应度
13.9798363.97983601.9899182.5383814.9747956.96471305.9697544.9747953.537203
200.0000090.9949625.9697543.979836004.9747954.9771370.9950122.189151
30.9949596.9647134.9747951.0481674.9747955.9697540.9949593.9914312.9848772.9848773.588333

 

在迭代寻找最优的代码循环里利用公式来取惯性权重w:

  1. %% 迭代寻优
  2. for i=1:maxgen
  3. fprintf('第%d代,',i);
  4. fprintf('最优适应度%f\n',fitnessgbest);
  5. for j=1:sizepop
  6. %速度更新
  7. V(j,:) = w*V(j,:) + c1*rand*(pbest(j,:) - pop(j,:)) + c2*rand*(gbest - pop(j,:)); %根据个体最优pbest和群体最优gbest计算下一时刻速度
  8. V(j,find(V(j,:)>Vmax))=Vmax; %限制速度不能太大
  9. V(j,find(V(j,:)<Vmin))=Vmin;
  10. %种群更新
  11. pop(j,:)=pop(j,:)+0.5*V(j,:); %位置更新
  12. pop(j,find(pop(j,:)>popmax))=popmax;%坐标不能超出范围
  13. pop(j,find(pop(j,:)<popmin))=popmin;
  14. if rand>0.98 %加入变异种子,用于跳出局部最优值
  15. pop(j,:)=rands(1,dim);
  16. end
  17. %更新第j个粒子的适应度值
  18. fitness(j)=fun(pop(j,:),func);
  19. end
  20. for j=1:sizepop
  21. %个体最优更新
  22. if fitness(j) < fitnesspbest(j)
  23. pbest(j,:) = pop(j,:);
  24. fitnesspbest(j) = fitness(j);
  25. end
  26. %群体最优更新
  27. if fitness(j) < fitnessgbest
  28. gbest = pop(j,:);
  29. fitnessgbest = fitness(j);
  30. end
  31. end
  32. yy(i)=fitnessgbest;
  33. w=wmax-(wmax-wmin)*i/1000;
  34. end

 

 线性微分递减策略的w的计算公式如下:

w=wmax-(wmax-wmin)\times t^{2}\div maxgen^{2}

初始迭代的时候,w变化缓慢,有利于在初始迭代时寻找满足条件的局部最优值,在接近最大迭代次数时,w变化较快,在寻找到局部最优值之后能够快速地收敛逼近于全局最优值,提高运算效率。

(3)其他参数不变,只改变适应度函数维度dim:

dim最优适应度收敛(次)
50469
60697
80752
100483

 

  1. pop(i,:)=popmax*rands(1,dim); %初始种群
  2. V(i,:)=Vmax*rands(1,dim); %初始化速度

适应度函数维度用于初始化种群和速度,以及后面若是算法陷入局部最优时加入的变异因子。当dim越大,初始种群和速度比较大的几率高。实验取dim=5或者dim=10时迭代收敛得比较快。 

(4)其他参数不变,只c1、c2改变

适应度c2=1.08324c2=1.49445c2=1.99857
c1=1.083243.9798360.9949593.979836
c1=1.494453.9798361.9899184.974795
c1=1.998575.9697632.9848771.989918

可以看出在此目标函数中,相对三个取值中,c1取1.08324,c2取1.49445,适应度的值更接近于0。

(5)其他参数不变,改变种群规模sizepop

sizepop最优适应度达到最优适应度时收敛次数总用时
10003756.041 s
20005308.334 s
300011512.173 s
40008714.392 s
500052318.376 s
600023920.882 s

   种群规模sizepop影响算法的搜索能力和计算量。当种群规模越大时,达到最优适应度所用的时间越长,此目标函数中种群规模设置在300或400时达到最优适应度时收敛次数比较小,算法效果较好。

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/783533
推荐阅读
相关标签
  

闽ICP备14008679号