JamesB 发表于 2023-1-9 12:07

Matlab标准粒子群优化算法代码

更新:
不要再私信我问各种奇奇怪怪的问题了!!!
我真的不明白流程控制机电系统水域测算电磁干扰裂纹定位分布式电源优化这些领域!!!
毕设不要再来问我了!!!
我真的不懂!!!!!!(超大声)
<hr/>原文章
开门先推荐三本书吧


前两本书电子版连接将在文末给出。
第三本比较新,作者手里这本是2017年9月第一版,目前没有找到电子版,等有了电子版可能会回来更新一下。
ps:1. 前两本PSO算法代码差不多,可以考虑二者选其一,大家看电子版自己决定好了
       2. PSO算法即标准粒子群优化算法(Particle Swarm Optimization),是基本粒子群算法的升级版。由于标准版本的性能更好,应用范围更广,因此PSO算法默认为标准粒子群优化算法。其与基本粒子群优化算法的区别在于是否使用惯性权重Omega。

具体算法不做赘述,直接进入正题:
清空运行环境
clc;
clear all;
各种参数赋值
c1=1.49445;         %加速系数,这里1.49445为某一论文中取值,能使PSO发挥不错的性能
c2=1.49445;
maxg=1000;          %迭代次数
sizepop=20;         %种群规模
D=30;               %维度
popmax=600;         %种群上下边界值,这里使用Griewank函数,测试范围为(-600,600)
popmin=-popmax;   %取对称区间
Vmax=0.15*popmax;   %速度限定,通常在搜索范围的10%~20%均可,这里作者取15%
Vmin=0.15*popmin;ps:粒子位置每一维被限定在一个范围内,即,粒子速度也被限定在,通常速度范围为搜索范围的10%~20%,这里取为15%

种群初始化
%%产生初始粒子位置及速度
for i=1:sizepop                           %将popsize个粒子依次初始化
    pop(i,:)=popmax*rands(1,D);         %初始位置
    V(i,:)=Vmax*rands(1,D);               %初始速度
    fitness(i)=Griewank(pop(i,:));      %计算适应度,Griewank为用来测试的函数
                                          %fitness只作每次迭代变量临时储存,不具有记忆性
endps:1. 这里 rands(1,D) 函数产生1行D列的矩阵,其中每一元素为(0,1)区间内随机数;
       2. Griewank为智能算法领域经典的测试的函数,其图像如封面所示,目标值为0;
       3. pop为粒子位置,V为粒子速度;
       4. fitness只作为每次迭代变量临时储存用,不具有记忆性

根据初始种群,计算各初始值
%寻找最优个体
%因目前第一代,故其当前取值即历史最优,全部赋值即可
=min(fitness);   %从fitness中寻找最小值,依次返回值和索引,由变量接收
pBest=pop;                              %个体历史最佳位置
gBest=pop(bestindex,:);               %全局历史最佳位置
fitnesspbest=fitness;                   %个体历史最佳适应度
fitnessgbest=bestfitness;               %全局历史最佳适应度ps:1. 因目前只有第一代,故其当前取值即历史最优,全部赋值即可
       2. pBest、gBest代表位置,fitnesspbest、fitnessgbest代表适应度值,均具有记忆性,即遇到更好的取值才被更新
       3. fitness、bestfitness均作临时储存变量之用,代代更替

迭代寻优
%%迭代寻优
for i=1:maxg             %每一代循环
    for j=1:sizepop      %每个粒子循环

      %速度更新
      w=0.8;         %w即omega,惯量权重,这里取固定值
      V(j,:)=w*V(j,:)+c1*rand*(pBest(j,:)-pop(j,:))+c2*rand*(gBest-pop(j,:));
      %越界处理
      V(j,find(V(j,:)>Vmax))=Vmax;
      V(j,find(V(j,:)<Vmin))=Vmin;
      
      %位置更新
      pop(j,:)=pop(j,:)+V(j,:);
      %越界处理
      pop(j,find(pop(j,:)>popmax))=popmax;
      pop(j,find(pop(j,:)<popmin))=popmin;

      %计算适应度值
      fitness(j)=Griewank(pop(j,:));

      %个体历史最优更新
      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
    result(i)=fitnessgbest;    %储存历代全局历史最优适应度值
endps:w为惯性权重,这里取定值0.8,惯性权重也可更改为其他形式,如线性递减、自适应等形式,读者可以自行拓展

绘图
semilogy(result);   %对y轴取对数
grid on;            %打格

%坐标含义说明
title('适应度曲线 ');
xlabel('进化代数');
ylabel('适应度');
迭代收敛结果   如下



标准PSO在Griewank函数测试下收敛曲线

ps:1. 并非每次运行都能收敛于目标值附近,算法有概率“早熟”,即陷入局部最优值
       2. 由于作者最早是通过30个案例分析那本书接触代码,因此变量命名风格很像。在后期的学习中,代码也是基于此更改。

文末福利
《Matlab智能算法30个案例分析(第2版)》
链接:https://pan.baidu.com/s/1qH08dCrrLbGZZZTrr80vYg
提取码:pkzw
《matlab智能算法超级学习手册》
链接:https://pan.baidu.com/s/1bxn4h3bx0eluaSz80N4QHw
提取码:nw0t

转载请注明出处:
koko可可:Matlab标准粒子群优化算法代码

redhat9i 发表于 2023-1-9 12:13

您好。
我有两个参数需要优化,并且两个参数的取值范围不同,一个是2~10,另一个为1000~5000,这个需要怎么编程呢?

maltadirk 发表于 2023-1-9 12:17

是哪方面的两个参数呀

stonstad 发表于 2023-1-9 12:21

我用粒子群算法优化变分模态分解(信号处理)的两个重要参数。

ainatipen 发表于 2023-1-9 12:26

直接跑pso即可,算法优化的维度为2维,只是不同维度的参数在生成时的范围不同,迭代时判断范围的标准不同,其他和普通参数优化一样。例如第一维度从【-2,2】里随机选取,第二维度从【-5,5】里随机选取;迭代时针对第一维度参数用【-2,2】判断是否越界,第二维度参数用【-5,5】判断是否越界。

RecursiveFrog 发表于 2023-1-9 12:32

谢谢

量子计算9 发表于 2023-1-9 12:39

您好,请问您能推荐一些有关粒子群算法优化滑模控制方面如何编程的书吗,正在学习这方面的东西,但是只找到一个有关优化PID参数的例子,没有优化滑模控制编程的例子不知道要如何编程

c0d3n4m 发表于 2023-1-9 12:48

滑模控制我真的不了解啊[可怜]

mastertravels77 发表于 2023-1-9 12:56

谢谢您的回复
[思考]

maltadirk 发表于 2023-1-9 13:00

你好   作者   在粒子群中,如何加入约束条件,并且初始化粒子时如何根据实际问题作出相应的变化?如果你知道,私聊我,具体详谈万分感谢
页: [1] 2 3
查看完整版本: Matlab标准粒子群优化算法代码