Matlab应用笔记--粒子群算法
注:本篇随笔依据《Matlab在数学建模上的应用》中第5章介绍来写,主要介绍粒子群算法思想及其Matlab实现
(博客以及Matlab小白,若有不当欢迎指出)
粒子群算法(PSO)简介
PSO属于智能算法,智能算法都属于软计算(动态自适应的求解方式)。
PSO依托群鸟觅食模型(Boid模型)寻找最优值。
粒子群算法的基本理论
群鸟觅食模型中,每只鸟的飞行基于自身经验和群体经验。
Boid模型遵守3个行为准则
- 冲突避免:避免碰撞。
- 速度匹配:配合群体中心的移动速度。
- 群体中心:个体向群体中心移动。
一只鸟是一个粒子,m只鸟的鸟群为m个粒子组成的粒子群。
每个粒子都在D维空间中,第i个粒子的位置表示为(相当于函数的一个解)
粒子个体经过的最优位置记为
所有粒子经理过的最优位置记为
粒子速度记为
则粒子速度更新公式为:
粒子位置更新公式为:
其中
为惯性因子(非负数)
为加速常数(非负数)
为内的随机数
为约束因子,用来控制速度的权重
此外还应该有,是粒子在每一维度方向上的最大速度。
PSO算法的优缺点
优点:
1.通用性强。
2.调整的参数少,原理简单。
3.协同搜索,个体局部信息和群体局部信息指导搜索。
4.收敛速度快,对内存和CPU要求低。
5.更容易飞跃局部最优信息。
缺点:
1.局部搜索能力差,搜索精度不高。
2.算法不能绝对保证搜索到全局最优解。
PSO算法实现的流程图
PSO算法的参数影响介绍以及选取建议
各参数影响介绍
1.粒子数:粒子数越多,搜索范围越大,越容易得到全局最优解,算法运行的时间也越长。
2.惯性因子:越大全局搜索能力越强,但搜索精度越低;反之,越小全局搜索能力越弱,但搜索精度越高。
3.加速常数:和是调整自身经验和社会经验在其运动中索契作用的权重。
1) 收敛快,但容易陷入局部最优点。
2) 等价于运行个单粒子,得到最优解的概率非常小。
3) 没有任何经验借鉴,各粒子盲目乱飞,很难得到最优解。
4.最大飞翔速度$v_{max}:若不限制飞行速度(过大),则有可能飘向无穷远处;若飞行速度太小,则很难跳出局部最优点。
各参数取值建议
1.粒子数:一般取值为。
2.惯性因子:若为变量应在迭代开始时设大,在迭代过程中逐步变小。若为定值一般取。
3.加速常数:一般取
4.最大飞翔速度:一般取每维变化范围的。
例题及相关函数模版
function main() clc;clear;close all; tic; %程序运行计时 %设置相关参数值 E0 = 0.001; %允许误差 MaxNum = 100; %粒子最大迭代次数 narvs = 1; %目标函数的自变量个数 particlesize = 30; %粒子群规模 c1 = 2; %个体学习因子,加速常数1 c2 = 2; %社会学习因子,加速常数2 w = 0.6; %惯性因子 vmax = 0.8; %粒子最大飞行速度 %初始化粒子的速度和位置以及目标函数 v = 2*rand(particlesize,narvs); %粒子的飞行速度 x = -5 + 10*rand(particlesize,narvs); %粒子所在的位置 fitness = @(x) 1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))); %适应度函数 %用匿名函数定义适应度函数(速度比单独编写一个m文件要快) %或者用inline定义 inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x'); %初始化粒子群的个体和全局最大值 f(particlesize,1) = 0; for i=1:particlesize for j=1:narvs f(i,j) = fitness(x(i,j)); end end personalbest_x = x; personalbest_fval = f; [globalbest_fval,i] = min(personalbest_fval); globalbest_x = personalbest_x(i,:); %迭代运算 k = 1; while k <= MaxNum %更新粒子的速度和位置信息 for i = 1:particlesize v(i,:) = w*v(i,:)+c1*rand*(personalbest_x(i,:)-x(i,:))... +c2*rand*(globalbest_x-x(i,:)); for j = 1:narvs if v(i,j) > vmax %约束粒子速度不超过设定的最大速度 v(i,j) = vmax; elseif v(i,j) < -vmax v(i,j) = -vmax; end end x(i,:) = x(i,:)+v(i,:); end %更新粒子群的个体和全局最大值 for i = 1:particlesize for j = 1:narvs f(i) = fitness(x(i,j)); end if f(i) < personalbest_fval personalbest_x(i,:) = x(i,:); personalbest_fval(i) = f(i); end end [globalbest_fval, i] = min(personalbest_fval); globalbest_x = personalbest_x(i,:); %检查是否符合停止迭代的条件 if abs(globalbest_fval) < E0,break,end k = k+1; end %输出最大值结果 Value1 = 1/globalbest_fval-1;Value1 = num2str(Value1); %strvat指令可以实现字符的组合输出 disp(strcat('the maximun value','=',Value1)); %输出最大值所在的横坐标位置 Value2 = globalbest_x;Value2 = num2str(Value2); disp(strcat('the corresponding coordinate','=',Value2)); %作图比对 x = -5:0.01:5; y = 2.1*(1-x+2*x.^2).*exp(-x.^2/2); plot(x,y,'m-','linewidth',3); hold on; plot(globalbest_x,1/globalbest_fval-1,'kp','linewidth',4); legend('目标函数','搜索到的最大值'); xlabel('x');ylabel('y'); grid on; toc; %程序运行计时结束
实机运行结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了