粒子群算法(PSO)以及Matlab实现

算法背景

粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。

PSO同遗传算法类似,是一种基于迭代的优化算法。系统初始化为一组随机解,通过迭代搜寻最优值。但是它没有遗传算法用的交叉(crossover)以及变异(mutation),而是粒子在解空间追随最优的粒子进行搜索。同遗传算法比较,PSO的优势在于简单容易实现并且没有许多参数需要调整。目前已广泛应用于函数优化,神经网络训练,模糊系统控制以及其他遗传算法的应用领域。

基本原理

假设在一个 D D D维的目标搜索空间中,有 N N N个粒子组成一个群落,其中第 i i i个粒子表示为一个 D D D维的向量
X i = ( x i 1 , x i 2 , … , x i D ) , i = 1 , 2 , … , N X_i=(x_{i1},x_{i2},\dots,x_{iD}),i=1,2,\dots,N Xi​=(xi1​,xi2​,…,xiD​),i=1,2,…,N
第 i i i个粒子的速度也是一个 D D D维向量,记为
V i = ( v i 1 , v i 2 , … , v i D ) , i = 1 , 2 , … , N V_i=(v_{i1},v_{i2},\dots,v_{iD}),i=1,2,\dots,N Vi​=(vi1​,vi2​,…,viD​),i=1,2,…,N
在第 i i i代的第 i i i个粒子向第 i + 1 i+1 i+1代进化时,根据如下表达式更新
v i j ( t + 1 ) = w v i j ( t ) + c 1 r 1 ( t ) [ p i j ( t ) − x i j ( t ) ] + c 2 r 2 ( t ) [ p g j ( t ) − x i j ( t ) ] x i j ( t + 1 ) = x i j ( t ) + v i j ( t + 1 ) v_{ij}(t+1)=wv_{ij}(t)+c_1r_1(t)[p_{ij}(t)-x_{ij}(t)]+c_2r_2(t)[p_{gj}(t)-x_{ij}(t)]\\x_{ij}(t+1)=x_{ij}(t)+v_{ij}(t+1) vij​(t+1)=wvij​(t)+c1​r1​(t)[pij​(t)−xij​(t)]+c2​r2​(t)[pgj​(t)−xij​(t)]xij​(t+1)=xij​(t)+vij​(t+1)
w w w是惯性权重, c 1 c_1 c1​是个体学习权重, c 2 c_2 c2​是社会学习权重

我们给出一个比较直观的图片

我们给出粒子群算法的流程图

编程实现

我们给出两个例题

例1:求解 f ( x ) = x sin ⁡ x cos ⁡ 2 x − 2 x sin ⁡ 3 x + 3 x sin ⁡ 4 x f(x)=x\sin x\cos 2x-2x\sin 3x+3x\sin 4x f(x)=xsinxcos2x−2xsin3x+3xsin4x在 [ 0 , 50 ] [0,50] [0,50]的最小值

%% obj:求解f(x)=xsinxcos2x-2xsin3x+3xsin4x在[0,50]的最小值
%% 初始化
clear
clc
f=@(x)x.*sin(x).*cos(2*x)-2*x.*sin(3*x)+3*x.*sin(4*x);
N=20;           %初始化种群个数
d=1;            %可行解维数
ger=120;        %最大迭代次数
limit=[0,50];   %设置位置参数限制
vlimit=[-10,10];%设置速度最大限制
w=0.8;          %惯性权重
c1=0.5;         %自我学习因子
c2=0.5;         %群体学习因子
figure(1);
ezplot(f,[0,0.01,limit(2)]);x=limit(1)+(limit(2)-limit(1)).*rand(N,d);  %初始种群的位置
v=rand(N,d);                                %初始种群的速度xm=x;                                       %每个个体的历史最佳位置
ym=zeros(1,d);                              %种群的历史最佳位置
fxm=ones(N,1)*inf;                          %每个个体的历史最佳适应度
fym=inf;                                    %种群历史最佳适应度hold on
plot(xm,f(xm),'ro');
title('init state');%% 群体更新
figure(2);
iter=1;while iter<=gerfx=f(x);                    %fx是每个粒子的种群适应度,即每个向量x的函数值fxfor i=1:Nif fx(i)<fxm(i)         %fxm(i)表示第i个粒子的历史最佳适应度,是个体学习因子。fxm(i)=fx(i);xm(i,:)=x(i,:);     %xm(i)表示第i个粒子的历史最佳位置,x(i)表示第i个粒子当前的位置endendif min(fxm)<fym             %fym表示所有粒子中的最佳适应度,是社会学习因子。fxm是一个N维向量,表示每个粒子的历史最佳适应度[fym,nmin]=min(fxm);ym=xm(nmin,:);endv=v*w+c1*rand*(xm-x)+c2*rand*(repmat(ym,N,1)-x);%粒子群算法的核心表达式%边界速度处理v(v>vlimit(2))=vlimit(2);%超过最大速度的粒子限制为最大速度v(v<vlimit(1))=vlimit(1);x=x+v;%边界位置处理x(x>limit(2))=limit(2); %超出位置极限的粒子要回到极限位置x(x<limit(1))=limit(1);record(iter)=fym;%record是一个向量,每次迭代,都为这个向量向后拼接一个适应度x0=0:0.01:limit(2);%每10次迭代记录一次粒子位置if iter/10-floor(iter/10)==0subplot(3,4,iter/10)plot(x0,f(x0),'b-',x,f(x),'ro');%标记粒子在曲线上面title(['迭代次数' num2str(iter)])endpause(0.01)iter=iter+1;
end
figure
plot(record);
title('最优适应度进化过程');

在这里,个体学习因子就是每个粒子历史的最佳适应度对应的位置,社会学习因子就是整个种群的历史最佳适应度对应的位置。

这是初始状态


每当经过10次迭代,记录一次粒子群的位置,可以发现,粒子最终在向最优解收敛

例2:求解 g ( x , y ) = 20 + x 2 + y 2 − 10 cos ⁡ ( 2 π x ) − 10 cos ⁡ ( 2 π y ) g(x,y)=20+x^2+y^2-10\cos(2\pi x)-10\cos(2\pi y) g(x,y)=20+x2+y2−10cos(2πx)−10cos(2πy)在 [ − 5.12 , 5.12 ] × [ − 5.12 , 5.12 ] [-5.12,5.12]\times[-5.12,5.12] [−5.12,5.12]×[−5.12,5.12]的最小值
二元函数的情形和一元函数比较相似,上问代码稍作修改即可。

%% obj:求解g(x,y)=20+x^2+y^2-10cos(2*pi*x)-10cos(2*pi*y)在[-5.12,5.12]*[-5.12,5.12]的最小值
clear
clc
%% 初始化
figure(1);
g=@(x,y)20+x.^2+y.^2-10*cos(2*pi.*x)-10*cos(2.*pi*y);
X0=[-5.12:0.05:5.12];
Y0=X0;
[X,Y]=meshgrid(X0,Y0);
Z=g(X,Y);
mesh(X,Y,Z)
colormap(parula(5))
N=50;           %初始化种群个数
d=2;            %可行解维数
ger=120;        %最大迭代次数
limit=[-5.12,5.12];   %设置位置参数限制
vlimit=[-1,1];%设置速度最大限制
w=0.8;          %惯性权重
c1=0.5;         %自我学习因子
c2=0.5;         %群体学习因子coordinate=limit(1)+(limit(2)-limit(1)).*rand(N,d);  %初始种群的位置
v=rand(N,d);                                %初始种群的速度local_best=coordinate;                                       %每个个体的历史最佳位置
group_best=zeros(1,d);                              %种群的历史最佳位置
fit_best_each=ones(N,1)*inf;                          %每个个体的历史最佳适应度
fit_best_group=inf;                                    %种群历史最佳适应度hold on
scatter3(local_best(:,1),local_best(:,2),g(local_best(:,1),local_best(:,2)),'r*');%把粒子构成的散点图加到我们的函数图像上
title('init state');%% 群体更新
iter=1;%iter表示我们的迭代次数,ger是最大迭代次数while iter<=gerfit_each=g(coordinate(:,1),coordinate(:,2));    %fit_each是每个粒子的种群适应度,即每个向量(x,y)的函数值g(x,y)for i=1:Nif fit_each(i)<fit_best_each(i)             %fit_best_each(i)表示第i个粒子的历史最佳适应度,是个体学习因子。fit_best_each(i)=fit_each(i);local_best(i,:)=coordinate(i,:);        %local_best(i)表示第i个粒子的历史最佳位置,coordinate(i)表示第i个粒子当前的位置endendif min(fit_best_each)<fit_best_group            %fit_best_group表示所有粒子中的最佳适应度,是社会学习因子。fit_best_each是一个N维向量,表示每个粒子的历史最佳适应度[fit_best_group,nmin]=min(fit_best_each);group_best=local_best(nmin,:);endv=v*w+c1*rand*(local_best-coordinate)+c2*rand*(repmat(group_best,N,1)-coordinate);%粒子群算法的核心表达式%边界速度处理v(v>vlimit(2))=vlimit(2);%超过最大速度的粒子限制为最大速度v(v<vlimit(1))=vlimit(1);coordinate=coordinate+v;%边界位置处理coordinate(coordinate>limit(2))=limit(2);   %超出位置极限的粒子要回到极限位置coordinate(coordinate<limit(1))=limit(1);record(iter)=fit_best_group;                %record是一个向量,每次迭代,都为这个向量向后拼接一个适应度if iter/10-floor(iter/10)==0subplot(3,4,iter/10)mesh(X,Y,Z)hold onscatter3(coordinate(:,1),coordinate(:,2),g(coordinate(:,1),coordinate(:,2)),'r*')%标记粒子在曲面上面title(['迭代次数' num2str(iter)])endpause(0.01)iter=iter+1;
end
disp(['最优值点:','(',num2str(group_best(1)),',',num2str(group_best(2)),')',',','最优值:',num2str(fit_best_group)])
%% 最佳状态位置
figure(4)
mesh(X,Y,Z)
hold on
scatter3(coordinate(:,1),coordinate(:,2),g(coordinate(:,1),coordinate(:,2)),'r*')
figure
plot(record);
title('最优适应度进化过程');


全局最优解是(0,0),我们可以发现,粒子群正在向(0,0)收敛

题目选自B站up主:青青草原灰太郎

粒子群算法(PSO)以及Matlab实现相关推荐

  1. 【老生谈算法】标准粒子群算法(PSO)及其Matlab程序和常见改进算法——粒子群算法

    1.算法详解: 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]标准粒子群算法(PSO)及其Matlab程序和常见改进算法.docx 2 ...

  2. 粒子群算法(PSO)Matlab实现(两种解法)

    粒子群算法(PSO) 用途:可以用于寻求最优解问题 生物机理:鸟群寻找湖泊 在函数中,有很多是无法求出最优解的 在这时,我们会采用软计算方法,而PSO算法,在软计算算法中有重要的地位: 好吧,这个仁者 ...

  3. C语言实现粒子群算法(PSO)一

    C语言实现粒子群算法(PSO)一 最近在温习C语言,看的书是<C primer Plus>,忽然想起来以前在参加数学建模的时候,用过的一些智能算法,比如遗传算法.粒子群算法.蚁群算法等等. ...

  4. 粒子群优化算法和python代码_Python编程实现粒子群算法(PSO)详解

    1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位 ...

  5. 基于多目标算法的冷热电联供型综合能源系统运行优化 粒子群算法 平台:MATLAB

    基于多目标算法的冷热电联供型综合能源系统运行优化 粒子群算法 平台:MATLAB ID:8722678838679712路过蜻蜓

  6. 粒子群算法(PSO)的C++实现

    粒子群算法(PSO)的C++实现 粒子群算法(PSO----Particle Swarm Optimization)是常用的智能算法之一,它模拟了 鸟群觅食 行为,是一种具有随机性的 仿生算法 .PS ...

  7. 粒子群算法(PSO)初识

    粒子群算法PSO是模拟群体智能所建立起来的一种优化算法,用于解决各种优化问题. 抽象问题实例化: 假设一群 鸟在觅食,只有一个地方有 食物,所有鸟儿都看不见食物(不知道食物的具体位置,知道了就不无需觅 ...

  8. 【ELM预测】基于粒子群算法PSO优化极限学习机预测含Matlab源码

    1 模型 为了提高空气质量预测精度,提出一种基于粒子群算法优化极限学习机的空气质量预测模型.运用粒子群算法优化极限学习机的初始权值和偏置,在保证预测误差最小的情况下实现空气质量最优预测.选择平均绝对百 ...

  9. 【回归预测-ELM预测】基于粒子群算法PSO优化极限学习机预测附matlab代码

    1 内容介绍 风电功率预测为电网规划提供重要的依据,研究风电功率预测方法对确保电网在安全稳定运行下接纳更多的风电具有重要的意义.针对极限学习机(ELM)回归模型预测结果受输入参数影响的问题,现将粒子群 ...

最新文章

  1. systemd进程管理工具实战教程
  2. IEnumerable和IQueryable在使用时的区别
  3. oc09--NSString
  4. 这个德国山寨工厂靠抄袭干到240亿,让硅谷恨之入骨
  5. asp 导出excel数据 fso 单元格格式
  6. 4g能用吗64java_java – 用于4G内存的JBoss 7内存配置,64位
  7. python人脸识别框很小_人脸识别:从传统方法到深度学习
  8. 【opencv有趣应用】opencv + YOLOV3 + COCO数据集的简单应用
  9. 一个动态增长的栈实现
  10. ibm服务器查看刀片状态,IBM刀片服务器宕机故障巧排除
  11. java 员工管理系统
  12. 缓存框架 EhCache 使用 4
  13. 台式计算机装机,DIY台式电脑装机教程之新手装机图解!手把手教你组装电脑
  14. EMD(Exploiting Modification Direction)
  15. android 系统重新安装程序,Android应用程序更新时的安装与卸载(调用系统方法)...
  16. 前端实现高效的海报系统
  17. 沃顿商学院自我管理课——埃里克.格雷腾斯
  18. ArcGIS空间校正和地理配准
  19. grafana+alertmanager 微信报警发送给不同告警人
  20. java锁的种类及研究

热门文章

  1. 关于Win10外接显示屏显示自定义分辨率和显示异常的问题
  2. 阿里云IoT物模型上报数据流转到实例内TSDB
  3. S21与S12的区别
  4. 通过TreeMap理解红黑树
  5. Redis实现微博用户注册amp;发送微博
  6. zabbix4.2服务端安装
  7. java headless_java.awt.headless系统设定
  8. 什么是AOP?AOP有哪些优点?
  9. nginx扩容(重点集群化处理)
  10. 无意中看到一篇不一样的励志文章