今天给各位分享一个我MATLAB学习网站:
https://yarpiz.com/
这个网站不仅有高质量的MATLAB源代码,而且还有对应的讲解视频,可谓是一应俱全。下面是网站的目录。
网站内容分为6部分:
- Metaheuristics(元启发式算法)
- Machine Learning(机器学习)
- Multiobjective Optimization(多目标优化)
- Fuzzy Systems(模糊系统)
- Applications(应用)
- 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)
以上的内容对应了视频教程的第一节课。
二、PSO代码设计
第二节视频课主要是讲述PSO算法的设计,虽然是英语教学,但是老师的英语讲解非常的慢,且非常详细,真的写一行代码解释一下是什么意思,手把手教学,适合初学者学习。
算法整体分成了五大部分:
- %% Problem Definition :问题表述
- %% Parameters of PSO:PSO的参数设计
- %% Initialization :初始化
- %% Main Loop of PSO :循环(也是算法的核心部分)
- %% 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