【PSO算法学习笔记】matlab学习之路

今天给各位分享一个我MATLAB学习网站:
https://yarpiz.com/
这个网站不仅有高质量的MATLAB源代码,而且还有对应的讲解视频,可谓是一应俱全。下面是网站的目录。

网站内容分为6部分:

  1. Metaheuristics(元启发式算法)
  2. Machine Learning(机器学习)
  3. Multiobjective Optimization(多目标优化)
  4. Fuzzy Systems(模糊系统)
  5. Applications(应用)
  6. Tutorials(视频教程)

记录一下本次学习PSO算法的笔记
官网给出了详细的笔记,教学视频以及代码,想要学习的友友们可以提前下载好所有的资料。关键是这个平台都是免费的!但是有一个不好的地方就是视频全部都是英语教学,且没有字幕,所以学好英语很重要。
网站的学习网址:
https://yarpiz.com/440/ytea101-particle-swarm-optimization-pso-in-matlab-video-tutorial
一共有三节视频课,第一节课:讲述PSO的内容,第二节:算法设计,第三节:优化代码

一、PSO的原理

相信网上已经有很多详细的讲解PSO算法的内容,在这里我就简单的说下PSO。
粒子的速度更新公式是:
vi(t+1)=vi(t)+c1(pi(t)-xi(t))+c1*(g(t)-xi(t))*
位置更新公式:
xi(t+1)=xi+vi(t+1)
i代表粒子的序列,粒子个数为N,且维度为D,t代表当前迭代次数,pi(t)表示粒子迭代次数中迭代最好的位置,即个体最优解,gi(t)表示全局中最好的粒子位置,即全局最优解。粒子主除了受自己的影响外还要受到这两个的影响。 黑色圆表示粒子当前的位置,绿色表示更新后的位置,可以看出迭代的位置主要受到3个箭头的影响,分别是自己的vi(t),蓝色的个体最优解pi(t)以及红色的全局最优解gi(t)
黑色圆表示粒子当前的位置,绿色表示更新后的位置,可以看出迭代的位置主要受到3个向量箭头的影响,分别是自己的vi(t),蓝色的个体最优解pi(t)以及红色的全局最优解gi(t)
以上的内容对应了视频教程的第一节课。

二、PSO代码设计

第二节视频课主要是讲述PSO算法的设计,虽然是英语教学,但是老师的英语讲解非常的慢,且非常详细,真的写一行代码解释一下是什么意思,手把手教学,适合初学者学习。

算法整体分成了五大部分:

  1. %% Problem Definition :问题表述
  2. %% Parameters of PSO:PSO的参数设计
  3. %% Initialization :初始化
  4. %% Main Loop of PSO :循环(也是算法的核心部分)
  5. %% Results:结果显示

1.问题表述

%% Problem Definition
CostFunction = @(x) Sphere(x);   %目标函数可以更改
nVar = 5;                          %决策变量的个数
VarSize = [1 nVar];                %决策变量的矩阵大小
VarMin = -10;
VarMax = 10;                    %变量的上下界

2.PSO的参数设计

%% Parameters of PSO
MaxIt = 100;        %最大迭代次数
nPop = 100;         %种群个数
w = 1;
wdamp=0.99;         %阻尼惯性系数,只有一个w对于优化结果并不好
c1 = 2;
c2 = 2;         %公式里面的系数

3.初始化

%% Initialization 
    % 粒子的属性,位置,速度,适应度值,粒子群中最优的位置以及适应度值
    empty_particle.Position = [];
    empty_particle.Velocity = [];
    empty_particle.Cost = [];
    empty_particle.Best.Position = [];
    empty_particle.Best.Cost = [];

    % 创建粒子群数组;repmat()函数表示重复,行数=种群数量,列数=1;其中每个empty_particle包含了5个属性
    particle = repmat(empty_particle, nPop, 1);
    % 初始化全局最优;本题是求解min,所以初始化最优为极大值,如果是max问题,则相反加上负号
    GlobalBest.Cost = inf;

    % 初始化种群
    for i=1:nPop

        % 初始化粒子位置;unifrnd()函数,表示从(VarMin,
        % VarMax)上下界之间随机产生VarSize方阵,如果是是矩阵则需要两个VarSize,表示行列
        particle(i).Position = unifrnd(VarMin, VarMax, VarSize);

        % 初始化速度,0矩阵
        particle(i).Velocity = zeros(VarSize);

        % 计算粒子的适应度函数
        particle(i).Cost = CostFunction(particle(i).Position);

        % 更新粒子最优位置以及适应度值,由于是初始化所以等于自身值
        particle(i).Best.Position = particle(i).Position;
        particle(i).Best.Cost = particle(i).Cost;

        % 更新全局最优,如果出现比GlobalBest.Cost更好的particle(i).Best.Cost,则更新 GlobalBest
        if particle(i).Best.Cost < GlobalBest.Cost
            GlobalBest = particle(i).Best;
        end

    end

    % 存储在每次迭代中保持最佳适应度值的数组,初始化全部为0
    BestCosts = zeros(MaxIt, 1)

4.循环(也是算法的核心部分)

%% Main Loop of PSO
 for it=1:MaxIt
        for i=1:nPop    %循环每个粒子

            % 速度更新公式
            particle(i).Velocity = w*particle(i).Velocity ...
                + c1*rand(VarSize).*(particle(i).Best.Position - particle(i).Position) ...
                + c2*rand(VarSize).*(GlobalBest.Position - particle(i).Position);

            % Apply Velocity Limits
%             particle(i).Velocity = max(particle(i).Velocity, MinVelocity);
%             particle(i).Velocity = min(particle(i).Velocity, MaxVelocity);
%             
            % 位置更新公式
            particle(i).Position = particle(i).Position + particle(i).Velocity;
            
            % Apply Lower and Upper Bound Limits
%             particle(i).Position = max(particle(i).Position, VarMin);
%             particle(i).Position = min(particle(i).Position, VarMax);

            % 适应度函数
            particle(i).Cost = CostFunction(particle(i).Position);

            % 更新个体最优
            if particle(i).Cost < particle(i).Best.Cost

                particle(i).Best.Position = particle(i).Position;
                particle(i).Best.Cost = particle(i).Cost;

                % 更新全局最优
                if particle(i).Best.Cost < GlobalBest.Cost
                    GlobalBest = particle(i).Best;
                end            
            end
        end

        % 储存每次迭代的全局最优值
        BestCosts(it) = GlobalBest.Cost;

        % 显示迭代信息
%         if ShowIterInfo
            disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCosts(it))]);
%         end

        % 阻尼惯性系数 (Damping Inertia Coefficient)
        w = w * wdamp;
    end
%     
%     out.pop = particle;
%     out.BestSol = GlobalBest;
%     out.BestCosts = BestCosts;
%     
% end

5.结果显示

%% Results
figure;
%plot(BestCosts,"LineWidth",2);
semilogy(BestCosts,"LineWidth",2);%使用semilogy绘图效果更加直观
xlabel("Iteration");
ylabel("BestCost");
grid on;

最后的结果显示图

在这里插入图片描述
在这里插入图片描述

感谢网友的分享,下面是网友的原贴内容。
https://blog.csdn.net/qq_43857549/article/details/115407517?spm=1001.2014.3001.5506

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PSO(Particle Swarm Optimization,粒子群优化)算法是一种模拟社会群体行为的优化算法,通过模拟鸟群或鱼群的行为方式,以求解各种优化问题。在MATLAB中,可以进行PSO算法的综合实验。 首先,需要定义优化问题的目标函数和约束条件。例如,我们可以选择一个典型的优化问题,如函数的最小化,通过定义目标函数和约束条件表达出来。 然后,需要确定PSO算法的参数,包括粒子数量、迭代次数、惯性因子、加速因子等。这些参数的选择会影响算法的收敛性和效果。 接下来,可以使用MATLAB中的优化工具箱编写PSO算法的代码。首先,初始化粒子的位置和速度。然后,根据当前位置和速度更新粒子的速度和位置。通过比较新位置的目标函数值和当前最优位置的目标函数值,更新粒子的最优位置。最后,循环迭代,直到满足停止条件。 在实验过程中,可以计算每次迭代的最优解和目标函数值,以及收敛情况的收敛曲线。可以通过对比不同参数和不同初始解的情况,评估PSO算法在解决优化问题中的效果。 最后,可以根据实验结果分析PSO算法的性能,并对算法进行改进。可能的改进包括调整参数、引入自适应机制、使用多种启发式策略等。 综上所述,使用MATLAB进行PSO算法的综合实验,可以帮助理解和掌握PSO算法的原理和应用,以及对算法的性能进行评估和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值