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

接着上篇文章继续,之前记录的是视频课的前面两节课,分别介绍了PSO算法的内容,以及代码设计,虽然这个代码可以实现优化,但是却不够简洁,代码的重复利用度不高。最后一节课就是对基本编码的优化。

代码的优化

前面基础设计,可以看出每次循环问题都有着5个模块,那么是否可以将PSO问题抽离出来,设计成一个函数,这样想要更改问题的参数直接更改函数的参数即可,不用打开代码一个个进行修改。
首先设计一个PSO函数,使其包含问题,和参数属性

function out = PSO (problem,params)

problem中的属性


CostFunction = problem.CostFunction;   %目标函数可以更改nVar = problem.nVar;                          %决策变量的个数VarSize = [1 nVar];                %决策变量的矩阵大小VarMin = problem.VarMin;
VarMax = problem.VarMax;                    %变量的上下界

params的属性

%% Parameters of PSOMaxIt = params.MaxIt;        %最大迭代次数
nPop = params.nPop;         %种群个数
w = params.w;
wdamp=params.wdamp;         %阻尼惯性系数
c1 = params.c1;
c2 = params.c2;         %公式里面的系数
% 在命令行窗口显示迭代信息,true显示,false不显示
ShowIterInfo = params.ShowIterInfo;
%速度的取值范围
MaxVelocity = 0.2*(VarMax-VarMin);
MinVelocity = -MaxVelocity;

删除结果显示模块,因为这里PSO是函数,如果要显示结果,直接调用函数后显示。
将PSO函数保存。新建一个pso1.m文件,在这个文件里可以设计想要问题的参数直接调用PSO算法。
pso1中的代码:

  1. %% Problem Definition :设计PSO函数的problem参数
  2. %% Parameters of PSO:设计PSO函数的params参数
  3. %% Calling PSO :调用PSO函数
  4. %% Results :显示结果
clc;
clear;
close all;%% Problem Definition
problem.CostFunction = @(x) Sphere(x);   %目标函数可以更改
problem.nVar = 5;                          %决策变量的个数
problem.VarMin = -10;
problem.VarMax = 10;                    %变量的上下界%% Parameters of PSO
params.MaxIt = 100;        %最大迭代次数
params.nPop = 100;         %种群个数
params.w = 1;
params.wdamp=0.99;         %阻尼惯性系数
params.c1 = 2;
params.c2 = 2;         %公式里面的系数
params.ShowIterInfo = true;  %在命令行窗口显示迭代信息,true显示,false不显示%% Calling PSO
out = PSO(problem,params);
BestCosts=out.BestCosts;
BestSol=out.BestSol ;%% Results
figure;
%plot(BestCosts,"LineWidth",2);
semilogy(BestCosts,"LineWidth",2);
xlabel("Iteration");
ylabel("BestCost");
grid on;

运行结果图
在这里插入图片描述
每次迭代之后的结果也要判断是否在取值范围内,避免出现最终的解无法取到,于是在PSO函数循环模块中加入速度的判断和位置的判断:
在速度更新公式后加入:

       %         更新后的速度要在范围之内 Apply Velocity Limitsparticle(i).Velocity = max(particle(i).Velocity, MinVelocity);particle(i).Velocity = min(particle(i).Velocity, MaxVelocity);

在位置更新公式后加入:

   % 粒子的位置要在规定的范围之内       Apply Lower and Upper Bound Limits%如果粒子的位置低于取值范围之内,则舍去该值,用最小值替代particle(i).Position = max(particle(i).Position, VarMin);      particle(i).Position = min(particle(i).Position, VarMax);

带收缩系数的PSO模型

可以看出运行结果与之前的结果差不多,但是代码的重复利用度和可读性更高了。
以上被视为标准的PSO算法。为了使PSO算法效果优化,2002年有学者提出了带收缩系数的PSO模型。公式如下:
在这里插入图片描述
在这里插入图片描述
所以要在原先的基础上对算法进一步设计参数。复制pso1.m中的代码,到新建的pso2.m中,在params系数部分添加更新后的部分,
代码如下:

%% Parameters of PSO% 收敛系数,后期学者增加的系数Constriction Coefficients
kappa = 1;
phi1 = 2.05;
phi2 = 2.05;
phi = phi1 + phi2;
chi = 2*kappa/abs(2-phi-sqrt(phi^2-4*phi));params.MaxIt = 100;        %最大迭代次数
params.nPop = 100;         %种群个数
params.w = chi;
params.wdamp=1;         %阻尼惯性系数
params.c1 = chi*phi1;
params.c2 = chi*phi2;         %公式里面的系数
params.ShowIterInfo = true;  %在命令行窗口显示迭代信息,true显示,false不显示

运行pso2结果如下图所示,迭代的效果图接近直线下降,效果要比之前都要好。
在这里插入图片描述
我后面也会将前面的代码文档上传。上一次的笔记代码放在pso_class2.m文件中,上述的所有代码文件都在文件夹中,大家可以免费下载。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部