pso粒子群优化算法+MATLAB代码
文章目录
- pso粒子群优化算法
- 1.概念
- 2.算法思想
- 简介
- 示例:
- 3.算法流程
- 4.算法不足
- 5.算法优化
- 6.代码
pso粒子群优化算法
1.概念
粒子群算法最早是由Eberhart和Kennedy于1995年提出的,属于进化算法的一种,它的基本概念源于对鸟群觅食行为的研究。用一种粒子来模拟鸟类个体,每个粒子可视为多维搜索空间中的一个搜索个体,粒子的当前位置即为对应优化问题的一个候选解,粒子的飞行过程即为该个体的搜索过程,粒子的飞行速度可根据粒子历史最优位置和种群历史最优位置进行动态调整,粒子仅具有速度和位置两种属性,速度代表移动的快慢,位置代表移动的方向,每个粒子单独搜寻的最优解叫做个体极值,粒子群中最优的个体极值作为当前全局最优解,通过在迭代过程中更新种群速度和位置,最终得到满足终止条件的最优解。
2.算法思想
简介
基础公式:
- 假设在一个D维的目标搜索空间中,有N个粒子组成的一个群体,其中第i个粒子的位置表示为一个D维向量:
Xi=(xi1,xi2,...xiD),i=1,2,3,...,NX_i=(x_{i1},x_{i2},...x_{iD}),i=1,2,3,...,N Xi=(xi1,xi2,...xiD),i=1,2,3,...,N
- 第i个粒子的“飞行”速度也是一个D维向量,记为:
Vi=(vi1,vi2,...viD),i=1,2,3,...,NV_i=(v_{i1},v_{i2},...v_{iD}),i=1,2,3,...,N Vi=(vi1,vi2,...viD),i=1,2,3,...,N
- 第t代的第i个粒子向t+1代进化时,根据以下式子更新(带惯性权重的pso):
vij(t+1)=wvij(t)+c1∗rand1(t)[pbestij(t)−xij(t)]+c2∗rand2(t)[gbestgj(t)−xij(t)]v_{ij}(t+1)=wv_{ij}(t)+c_1*rand_1(t)[pbest_{ij}(t)-x_{ij}(t)]+c_2*rand_2(t)[gbest_{gj}(t)-x_{ij}(t)] vij(t+1)=wvij(t)+c1∗rand1(t)[pbestij(t)−xij(t)]+c2∗rand2(t)[gbestgj(t)−xij(t)]
xij(t+1)=xij(t)+vij(t+1)x_{ij}(t+1)=x_{ij}(t)+v_{ij}(t+1) xij(t+1)=xij(t)+vij(t+1)
- 其中:
rand1和rand2为[0,1]的随机数,用于控制个体最优方向和群体左右方向在移动过程中的权值比重。
pbest为个体历史经过的最优位置,gbest为全体历史最优位置。根据新位置的适应度来判断是否要更新pbest或gbest。
该算法一般用于求函数极值,所以一般取该位置函数的值为适应度,
c1,c2为调节pbest和gbest相对重要性的加速因子,c1为个体学习系数,c2为全体学习系数均取定值 1.49445
w为惯性权重,为保留原来方向的速度。(最好前期大一些,保证搜索范围;后期小一些,便于向其他粒子学习,不会飞过)
示例:
C为粒子当前位置,A为全局最优位置,对应gbest,B为自身最优,对应pbest。
vij(t+1)=wvij(t)+c1∗rand1(t)[pbestij(t)−xij(t)]+c2∗rand2(t)[gbestgj(t)−xij(t)]v_{ij}(t+1)=wv_{ij}(t)+c_1*rand_1(t)[pbest_{ij}(t)-x_{ij}(t)]+c_2*rand_2(t)[gbest_{gj}(t)-x_{ij}(t)] vij(t+1)=wvij(t)+c1∗rand1(t)[pbestij(t)−xij(t)]+c2∗rand2(t)[gbestgj(t)−xij(t)]
黄色线为C当前飞行方向,绿色为个体最优步长,红色为全局最优步长。蓝色为下一步要飞行的方向和距离。
3.算法流程
输入参数:w(可为线性函数递减),c1,c2:0.1−2(一般取1.49455),vmax,xmax:取决于优化函数输入参数:w(可为线性函数递减),c_1,c_2:0.1-2(一般取1.49455),v_{max},x_{max}:取决于优化函数 输入参数:w(可为线性函数递减),c1,c2:0.1−2(一般取1.49455),vmax,xmax:取决于优化函数
1.初始化种群x
2.计算个体适应度*
3.更新粒子速度—>更新粒子位置
4.计算新位置的适应度,若新位置的适应度更高,则更新粒子pbest并判断更新gbest,否则不更新?。
5.判断终止条件(设定迭代进化次数,适应度n代不再变化等)
一般的,优化目标是最小化函数值。所以个体计算出的函数值越小,适应度越高
max f=min -f
更新速度后,先进行速度边界检测,一般采用v>vmax=vmax,同理,x>xmax=xmaxv>v_{max}=v_{max},同理,x>x_{max}=x_{max}v>vmax=vmax,同理,x>xmax=xmax
pso 流程图:
演示图:
4.算法不足
受pbest和gbest的影响,求解多峰问题时早熟收敛,容易陷入局部最优解。
- 当前gbest并非实际最优解,但是粒子可能会受他影响偏离实际最优解的位置 ,飞向局部最优
- pbest和gbest的位置过于接近,导致粒子过早陷入局部最优
vij(t+1)=wvij(t)+c1∗rand1(t)[pbestij(t)−xij(t)]+c2∗rand2(t)[gbestgj(t)−xij(t)]v_{ij}(t+1)=wv_{ij}(t)+c_1*rand_1(t)[pbest_{ij}(t)-x_{ij}(t)]+c_2*rand_2(t)[gbest_{gj}(t)-x_{ij}(t)] vij(t+1)=wvij(t)+c1∗rand1(t)[pbestij(t)−xij(t)]+c2∗rand2(t)[gbestgj(t)−xij(t)]
5.算法优化
1.实现参数自适应变化,如w
2.引入一些其他机制,如随机因素,速度、位置边界变化,压缩后期最大速度等
3.结合其他只能优化算法,遗传算法,模拟退火算法,帮助跳出局部最优
6.代码
%%清空环境
clc;
clear;
%格里旺克函数
%%绘制目标函数曲线
figure
x = -8:0.1:8;
y = x;
[X,Y] = meshgrid(x,y);
[row,col] = size(X);
for l = 1:colfor h = 1:rowz(h,l) = Griewan([X(h,l),Y(h,l)]);end
end
surf(X,Y,z);
shading interp
hold on%%参数初始化
c1 = 1.49445;
c2 = 1.49445;
N = 50; % 种群规模
D = 2;
T = 100; % 迭代次数
wa = 0.9;
wi = 0.4;
Xmax = 8 ;
Xmin = -8 ;
Vmax = 1 ; % 最大飞行速度
Vmin = -1 ; % 最小飞行速度% Xm(i,:)粒子i位置%%产生初始粒子和速度
for i=1:NXm(i,:)=8*rands(1,2); %初始位置 N*2的矩阵,第i行表示第i个粒子的位置V(i,:)=rands(1,2); %初始速度 fitness(i)=Griewan(Xm(i,:)); %粒子初始适应度,即函数值xm=Xm(i,:); % xm为初始位置f(i,:)=fitness(i); % f i 为粒子i初始适应度 %scatter3( xm(:,1),xm(:,2) ,fitness(i),'r*' ); %打印粒子初始位置%plot(xm,'ro')
end%%个体极值与群体极值
[bestfitness,bestindex]=min(fitness); %bestfitness=最佳适应度,bestindex为最佳适应度的粒子,为第几个
pbest = Xm; %个体最优初始为他本身位置 pbest存所有粒子的个人最优位置
gbest = Xm(bestindex,:); %全局最优为找出来的最佳适应值的那个粒子,第bestindex个粒子的位置
fitnesspbest=fitness; %个体历史最佳适应度为初始值
fitnessgbest=bestfitness; %全局历史最佳最佳适应度为找出来的最佳度%%迭代寻优
for i=1:T %从第一代到第T代,当前代数为iw=wa-(wa-wi)*i/T; %wa=0.9 wi=0.4 w=0.9-0.5*(i/T) w(0.9-0.4)前期w大,适合保持自己速度充分寻找,后期w小便于向其他学习for j=1:N %N个粒子,当前为第j个%速度更新V(j,:)=w*V(j,:)+c1*rand*(pbest(j,:)-Xm(j,:))+c2*rand*(gbest-Xm(j,:)); %速度矩阵第j行更新V(j,find(V(j,:)>Vmax))=Vmax; V(j,find(V(j,:)<Vmin))=Vmin;%种群更新Xm(j,:)=Xm(j,:)+V(j,:); %位置矩阵第j行更新Xm(j,find(Xm(j,:)>Xmax))=Xmax;Xm(j,find(Xm(j,:)<Xmin))=Xmin;%适应度值更新fitness(j)=Griewan(Xm(j,:)); %第j个粒子的适应度更新enddt=plot3(Xm(:,1),Xm(:,2),fitness(:),'bo','linewidth',2) % 动态绘图pause(0.1) delete(dt)for j=1:N%个体最优更新if fitness(j)<fitnesspbest(j) %第j个粒子更新后适应度pbest(j,:)=Xm(j,:);fitnesspbest(j)=fitness(j);endif fitness(j)<fitnessgbestgbest=Xm(j,:);fitnessgbest=fitness(j);end endyy(i)=fitnessgbest;
end %%输出结果
fitnessgbest=fitnessgbest
Xgbest=gbestplot3(gbest(1),gbest(2),fitnessgbest,'ro','linewidth',2) % 打印最佳粒子的位置figure
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);
ylabel('适应度','fontsize',12);
pso粒子群优化算法+MATLAB代码相关推荐
- 粒子群matlab工具箱,科学网—PSO粒子群优化算法Matlab工具箱 - 白途思的博文
PSO做实数优化有自身特性优势.而且全局寻优性能比较好. 只是该工具箱中的Trelea, Clerc两种类型的PSO我不了解,正在找这方面的资料看看. Robust Particle Swarm to ...
- Matlab:基于Matlab实现人工智能算法应用的简介(SVM支撑向量机GA遗传算法PSO粒子群优化算法)、案例应用之详细攻略
Matlab:基于Matlab实现人工智能算法应用的简介(SVM支撑向量机&GA遗传算法&PSO粒子群优化算法).案例应用之详细攻略 目录 1.SVM算法使用案例 1.1.Libsvm ...
- 【项目实战】Python实现用PSO粒子群优化算法对KMeans聚类模型进行优化项目实战
说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取. 1.项目背景 粒子群优化算法(Particle Swarm optimizat ...
- 【MATLAB教程案例11】基于PSO粒子群优化算法的函数极值计算matlab仿真及其他应用
FPGA教程目录 MATLAB教程目录 -------------------------------------------------------------------------------- ...
- PSO 粒子群优化算法 大整理
一.粒子群算法的概念 粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation).源于对鸟群捕食的行为 ...
- PSO粒子群优化算法
1算法简介 粒子群优化算法,在1995年由Eberhart博士和kennedy博士提出,源于对鸟群捕食的行为研究.该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型.算法流程 ...
- 粒子群优化算法matlab
目录 1.粒子群算法介绍 1.1发展概况 1.2算法原理 2.算法流程 2.1算法流程图 3.MATLAB实现 3.1代码 3.2实验结果分析 3.2.1待优化函数:Rastrigin ①基于种群规模 ...
- 基于PSO粒子群优化算法的TSP问题最短路径求解matlab仿真
up目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础 在PSO中,群中的每个粒子表示为向量.在投资组合优化的背景下,这是一个权重向量,表示每个资产的分配资本.矢量转换为多维搜索空间中的位置 ...
- 粒子群优化算法Matlab实现(待逐步解释)
迭代矩阵建模如下: 入口函数 %下面的粒子群优化适用于最值位于非边界 %当最值位于边界,收敛较慢 %粒子空间 % 1 2---2+(Xs-1) 2+Xs 3+Xs---3+Xs+(Xs-1) 3+2* ...
- Python实现PSO粒子群优化支持向量机回归模型(svr算法)项目实战
说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 在污水处理全过程中,为了更好地使解决后的水达到环保标准,在污水处 ...
最新文章
- 【译文】东京的外国工程师
- 在tomcat中部署web项目
- C#new出来的结构体内存分配在堆上
- 语言非递归求解树的高度_算法素颜(11):无死角“盘”它!二分查找树
- java语言概述、java语言特性、java语言发展史、java语言作用
- JAVA学习day07 1
- 评分预测会不会大于满分5.0的情况?
- NYOJ -11--奇偶数分离
- 使用TortoiseSVN的客户端钩子脚本触发Jenkins构建
- threejs 快速入门小技巧
- 移动安全-Android安全测试框架Drozer
- android 音频系统/声卡驱动 codec
- mysql命令报错-bash: mysql: command not found
- 训练网络时指定gpu显卡
- Ubuntu18.04修改软件源
- 日常生活中使用计算机要注意事项有哪些,笔记本电脑日常使用注意事项以及保养技巧...
- 拍好的视频如何添加配乐
- 计算机课程设计局域网广域网,计算机网络课程设计报告组建小区局域网
- 关于OC数据类型的资料整理
- SaltStack遇到的一些问题及解决