• 【MATLAB教程案例11】基于PSO粒子群优化算法的函数极值计算matlab仿真及其他应用


    FPGA教程目录

    MATLAB教程目录

    ---------------------------------------------------------------------------------------------------------------

    目录

    1.软件版本

    2.PSO粒子群优化的理论知识

    3.完整核心代码学习

    3.1通过PSO计算函数最小值

    3.2通过PSO计算函数最大值

    4.操作步骤与仿真结论

    4.1通过PSO计算函数最小值

    4.2通过PSO计算函数最大值

    5.其他应用分析


    1.软件版本

    MATLAB2021a或者高级版本

    2.PSO粒子群优化的理论知识

           PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一种基于种群的随机优化技术,由Eberhart和Kennedy于1995年提出。粒子群算法模仿昆虫、兽群、鸟群和鱼群等的群集行为,这些群体按照一种合作的方式寻找食物,群体中的每个成员通过学习它自身的经验和其他成员的经验来不断改变其搜索模式。

            在PSO算法中,用粒子来描述鸟类个体,每个粒子在搜索空间中搜索,飞行过程为搜索过程,飞行速度可以根据粒子历史最优位置和种群历史最优位置动态调整,粒子当前位置就是对应优化问题的一个候选解 ,称为个体极值,粒子群中的最优的个体极值称为全局最优解。不断地迭代,粒子更新速度和我位置,最终满足条件的全局最优解即为所求目标。PSO的基本步骤如下:

          (1)初始化:迭代次数,目标函数的自变量个数,粒子的最大速度,位置信息,我们在速度区间和搜索空间上随机初始化速度和位置,粒子群规模,每个粒子随机初始化一个飞翔速度。此外还有粒子位置信息和速度信息的最小值最大值约束范围。

          (2)适应度函数的定义。

            适应度函数为粒子群算法的求解目标函数,比如我们要计算某个函数f(x)的最小值,那么可以定义 适应度函数为f(x),x为粒子的位置,即搜索最优的粒子位置x,使得适应度函数f(x)达到最小值。

          (3)粒子更新。

        

    3.完整核心代码学习

    3.1通过PSO计算函数最小值

    首先,定义一个适应度函数程序:func_fitness.m

    1. function [minf,x,y] = func_fitness(x)
    2. minf = (x-5)^2;
    3. x=x;

    这个函数表达式为:

    然后定义粒子群优化算法程序:

    参数初始化

    1. %%
    2. c1 = 2;
    3. c2 = 2;
    4. %x的范围
    5. min1 = -100;
    6. max1 = 100;
    7. %速度的范围
    8. vmin =-1;
    9. vmax = 1;
    10. %粒子数目
    11. Pop = 100;
    12. BsJ = 1;
    13. %迭代次数
    14. tmax = 100;
    15. x = zeros(1,Pop);
    16. va = zeros(size(x));
    17. x_best = zeros(1,Pop);

    粒子群更新

    1. %速度1设置
    2. va(1,i) = va(1,i) + c1*rand(1)*(x_best(1,i)-x(1,i)) + c2*rand(1)*(Tx_best-x(1,i));
    3. %更新
    4. x(1,i) = x(1,i) + va(1,i);

    最优值输出

    1. [BsJ,x(1,i)] = func_fitness(x(1,i));
    2. if BsJ<BsJi(i)
    3. BsJi(i) = BsJ;
    4. x_best(1,i) = x(1,i);
    5. end
    6. if BsJi(i)<minJi
    7. minJi = BsJi(i);
    8. Tx_best = x(1,i);
    9. end

    完整程序如下:

    1. clc;
    2. clear;
    3. close all;
    4. warning off;
    5. rng('default');
    6. %%
    7. c1 = 2;
    8. c2 = 2;
    9. %x的范围
    10. min1 = -100;
    11. max1 = 100;
    12. %速度的范围
    13. vmin =-1;
    14. vmax = 1;
    15. %粒子数目
    16. Pop = 100;
    17. BsJ = 1;
    18. %迭代次数
    19. tmax = 100;
    20. x = zeros(1,Pop);
    21. va = zeros(size(x));
    22. x_best = zeros(1,Pop);
    23. %粒子初始化
    24. for i=1:Pop
    25. x(1,i) = rand(1)*(max1-min1)+min1;
    26. x_best(1,i) = rand(1)*(max1-min1)+min1;
    27. [BsJ,x(1,i)] = func_fitness(x(1,i));
    28. BsJi(i) = BsJ;
    29. va(1,i) =(vmax-vmin)*rand(1)+vmin;
    30. end
    31. [minJi,index]= min(BsJi);
    32. Tx_best = 10;
    33. for t=1:tmax
    34. t
    35. time(t) = t;
    36. for i=1:Pop
    37. rng(i);
    38. %N
    39. %速度1设置
    40. va(1,i) = va(1,i) + c1*rand(1)*(x_best(1,i)-x(1,i)) + c2*rand(1)*(Tx_best-x(1,i));
    41. %更新
    42. x(1,i) = x(1,i) + va(1,i);
    43. %变量1的限制
    44. if x(1,i) >= max1
    45. x(1,i) = max1;
    46. end
    47. if x(1,i) <= min1
    48. x(1,i) = min1;
    49. end
    50. [BsJ,x(1,i)] = func_fitness(x(1,i));
    51. if BsJ<BsJi(i)
    52. BsJi(i) = BsJ;
    53. x_best(1,i) = x(1,i);
    54. end
    55. if BsJi(i)<minJi
    56. minJi = BsJi(i);
    57. Tx_best = x(1,i);
    58. end
    59. end
    60. Jibest(t) = minJi;
    61. end
    62. Tx_best
    63. figure;
    64. plot(Jibest,'b','linewidth',1);
    65. xlabel('迭代次数');
    66. ylabel('J');
    67. grid on

    3.2通过PSO计算函数最大值

    首先,定义一个适应度函数程序:func_fitness.m

    1. function [minf,x] = func_fitness(x)
    2. minf = 1/(1+abs(x));
    3. x=x;

    这个函数表达式为:

    完整程序如下:

    1. clc;
    2. clear;
    3. close all;
    4. warning off;
    5. rng('default');
    6. %%
    7. c1 = 2;
    8. c2 = 2;
    9. %x的范围
    10. min1 = -1000;
    11. max1 = 1000;
    12. %速度的范围
    13. vmin =-1;
    14. vmax = 1;
    15. %粒子数目
    16. Pop = 100;
    17. BsJ = 1;
    18. %迭代次数
    19. tmax = 200;
    20. x = zeros(1,Pop);
    21. va = zeros(size(x));
    22. x_best = zeros(1,Pop);
    23. %粒子初始化
    24. for i=1:Pop
    25. x(1,i) = rand(1)*(max1-min1)+min1;
    26. x_best(1,i) = rand(1)*(max1-min1)+min1;
    27. [BsJ,x(1,i)] = func_fitness(x(1,i));
    28. BsJi(i) = BsJ;
    29. va(1,i) =(vmax-vmin)*rand(1)+vmin;
    30. end
    31. [maxJi,index]= max(BsJi);
    32. Tx_best = 0;
    33. for t=1:tmax
    34. t
    35. time(t) = t;
    36. for i=1:Pop
    37. rng(i);
    38. %N
    39. %速度1设置
    40. va(1,i) = va(1,i) + c1*rand(1)*(x_best(1,i)-x(1,i)) + c2*rand(1)*(Tx_best-x(1,i));
    41. %更新
    42. x(1,i) = x(1,i) + va(1,i);
    43. %变量1的限制
    44. if x(1,i) >= max1
    45. x(1,i) = max1;
    46. end
    47. if x(1,i) <= min1
    48. x(1,i) = min1;
    49. end
    50. [BsJ,x(1,i)] = func_fitness(x(1,i));
    51. if BsJ>BsJi(i)
    52. BsJi(i) = BsJ;
    53. x_best(1,i) = x(1,i);
    54. end
    55. if BsJi(i)>maxJi
    56. maxJi = BsJi(i);
    57. Tx_best = x(1,i);
    58. end
    59. end
    60. Jibest(t) = maxJi;
    61. end
    62. Tx_best
    63. figure;
    64. plot(Jibest,'b','linewidth',1);
    65. xlabel('迭代次数');
    66. ylabel('J');
    67. grid on

    4.操作步骤与仿真结论

    最后,通过MATLAB仿真:

    4.1通过PSO计算函数最小值

     

    从仿真可以看到,PSO的迭代过程,从0.6逐渐降低到0附近,说明优化成功,此时对应的最优解为4.9972,而实际最优解为5.所以优化成功。 

    4.2通过PSO计算函数最大值

     

     从仿真可以看到,PSO的迭代过程,从0.95逐渐提高到1附近,说明优化成功,此时对应的最优解为-2.3233e-4,而实际最优解为0.所以优化成功。 

    5.其他应用分析

            通过上面两个案例,我们学会了如何通过PSO算法搜索目标函数的最小值或者最大值。那么根据这个方法,我们还可以实现其他目标函数的最优值。

           比如:计算某个面积的最优覆盖了,结构最优化等等,其核心就是将适应度函数的表达式进行数学建模,而其解作为粒子群x的位置信息输入,那么当x达到最优位置时,自然就找到了目标函数的最优解。

  • 相关阅读:
    【Kafka源码分析】一、生产者Producer
    【Java设计模式】第5讲--建造者模式
    如何在Unity下采集音视频实现轻量级RTSP服务(类似于IPC)
    密码学基础知识
    17 柯西中值定理、不定式极限
    JS-获取网页滑动距离,并实时监听
    Install GDAL under Python3.7 in Ubuntu OS
    el-input设置max、min无效的解决方案
    linux——yum工具详解
    使用Visual Studio 2022实现透明按钮和标签、POPUP样式窗体的一种工业系统的UI例程
  • 原文地址:https://blog.csdn.net/ccsss22/article/details/126824920