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

还是先看图:

图中的粉红色线画出来的就是我们求的目标函数
然后,我们是打算求最大值的,那个点,就是我们求出来的最大值位置
还是很准的对吧?
一般的话,我们会进行一些处理,转成求最小值(不只是倒数,还有一些简单的处理过程)

代码如下,代码中会有详细的讲解,如有不懂,可以在评论区问

function main()
clc;clear all; close all;
tic;                                    % 程序运行计时
E0 = 0.001;                             % 允许误差
MaxNum = 100;                           % 粒子最大迭代次数
narvs = 1;                              % 目标函数的自变量个数
particlesize = 30;                      % 粒子群规模
c1 = 2;                                 % 个体经验学习因子
c2 = 2;                                 % 社会经验学习因子
w =0.6;                                 % 惯性因子
vmax = 0.8;                             % 粒子的最大飞翔速度
x = -5 + 10 * rand(particlesize, narvs);% 粒子所在的位置 (rand产生的大小为0,1),规模是 粒子群数和参数需求数 设置了x的取值范围[-5,5]
v = 2*rand(particlesize,narvs);         % 粒子的飞翔速度  生成每个粒子的飞翔速度,由于是只有一个变量,所以速度是一维的
% 用inline定义适应度函数以便将子函数文件与主程序文件放到一起
% 目标函数是:y = 1+(2.1*(1- x + 2*x.^2).*exp(-x.^2 / 2)) # 与Python不同的是,这里必须要写成.*
% .^之类的,因为定义不同
fitness = inline('1/(1+(2.1*(1 - x + 2 * x.^2).*exp(-x.^2/2)))','x'); % 这里求倒数,还在分母上加了个1,确保不会出现分母为0的情况,转为求最小值位置
% inline函数定义可以大大降低程序运行速度
for i= 1:particlesizef(i) = fitness(x(i,1));
end
% 完成了对每一个粒子,在各自位置上的适应值
% 粒子开始学习
personalbest_x=x;         % 用于存储对于每一个粒子最佳经历点的x值
personalbest_faval=f;     % 同时存储对于每一个粒子的最佳经历点的数值,用于更改
[globalbest_faval,i] = min(personalbest_faval); % min函数返回的第一个是最小值,还有一个就是最小值的下标,这里就是告诉了是在哪个粒子上
globalbest_x = personalbest_x(i,:);   % 这个是必定是全局最优点的位置
k = 1; % 开始迭代计数
while k <= MaxNum   % 当迭代次数达到设定的最大值的时候,就不要再进行迭代了for i = 1:particlesize   % 对于每一个粒子f(i) = fitness(x(i,1)); % 得到每个粒子的当前位置 在函数上的适应值 if f(i) < personalbest_faval(i)   % 如果这个值是小于个人最优解的位置的时候,就更新,我们经过转换,所以只用考虑求最小值的情况personalbest_faval(i) = f(i); % 将第i个粒子的个人最优解设置为personalbest_x(i,:) = x(i,:); % 同时更改最有地址的位置endend [globalbest_faval,i] = min(personalbest_faval); globalbest_x = personalbest_x(i,:); % 更新全局 全局信息由个体信息描述组成for i = 1:particlesizev(i,:) = w*v(i,:) + c1*rand*(personalbest_x(i,:) - x(i,:)) + c2*rand*(globalbest_x -x(i,:)); % 由个人和全局的最佳信息数据进行更新移动速度% 上面中rand会随机生成一个rand(0,1)然后会随机的降低学习因子的比例for j = 1:narvs   % 这个个循环确定了每个自变量上的速度,有没有超过对应的最大值if v(i,j) > vmaxv(i,j) = vmax;elseif v(i,j) < -vmaxv(i,j) = -vmax;endend x(i,:) = x(i,:) + v(i,:); % 通过速度更新位置endif abs(globalbest_faval) < E0,break,end         k = k + 1;
end
Value1 = 1/globalbest_faval - 1; % 还记得上面做了一个加1,求倒数的操作么?
Value1 = num2str(Value1);
disp(strcat('the maximum value',' = ', Value1)); % 主要是在这进行了展示
Value2 = globalbest_x;    % 得到了全局最优解的位置
Value2 = num2str(Value2);
disp(strcat('the maximum x = ', Value2));% 绘图
x = -5:0.01:5;
y = 2.1*(1 - x + 2 * x.^2).*exp(-x.^2/2);
plot(x,y,'m--','linewidth',3); % m表示的是粉红色,-是表示的是连续的曲线线
hold on;
plot(globalbest_x, 1/globalbest_faval-1,'kp','linewidth',4);
legend('目标函数','搜索到的最大值');
xlabel('x'); % 给x轴贴标签
ylabel('y'); % 给y轴贴标签
grid on;
end

由于上面给出的例子比较简单(二维的)
所以,我们完全可以用硬计算的方法找到最值(硬计算)
具体代码如下:

x = -5:0.01:5;
y = 2.1*(1 - x + 2 * x.^2).*exp(-x.^2/2);
[v, index_x] = max(y);
disp(v);
% 画图
plot(x,y,'m-','linewidth',3); % m表示的是粉红色,-是表示的是连续的曲线线
hold on;
plot(x(index_x), v,'kp','linewidth',4);
legend('目标函数','搜索到的最大值');
xlabel('x'); % 给x轴贴标签
ylabel('y'); % 给y轴贴标签
grid on;

但是,要清楚的是,如果这个时候是三维,或者是更高维度的时候,这样的方法,可能就没有“粒子群算法”好用了。

由于采用的时候硬计算方法,所以,函数更奇怪的时候,或者就是给出的函数本身就是一个隐函数的时候,可能粒子群算法,就会比较好用一点。

最后,老套路,宣传一波自己的公众号!(求关注哇!)
本人中大一肥宅,欢迎大家关注,请扫下面的二维码(〃‘▽’〃)

![二维码](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTcxMTE3MDAxNjIwMDY3?x-oss-process=image/format,png)

如果觉得有帮助的话,可以扫码,赞赏鼓励一下!谢谢!

粒子群算法(PSO)Matlab实现(两种解法)相关推荐

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

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

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

    粒子群算法(PSO)以及Matlab实现 算法背景 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy ...

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

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

  4. 粒子群算法的matlab实现

    转自:https://blog.csdn.net/just_do_it_123/article/details/50993439 粒子群算法,也称粒子群优化算法(Particle Swarm Opti ...

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

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

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

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

  7. jeremy的路径规划学习-1.三维地图定义,散点拟合插值与粒子群算法(matlab实现)

    jeremy的路径规划学习-1.三维地图定义,散点拟合插值与粒子群算法(matlab实现) 本文基于小黎的ally学习资料实现,感谢该博主的无私奉献 三维地图与二维地图的差别 1.二维无高度信息,多用 ...

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

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

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

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

最新文章

  1. android 代码获取图片信息吗,Android 通过网络获取图片的代码
  2. 简述bios在计算机系统中的作用,BIOS的主要作用
  3. java获取jsp 组件,利用Observer模式解决组件间通信问题-JSP教程,Java技巧及代码
  4. access开发精要(3)-子数据表
  5. 『奇葩问题集锦』Fedora ubuntu 下使用gulp 报错 Error: watch ENOSPC 解决方案
  6. 编程统计BUF字单元数据中所含1的个数,并将结果存入COUNT单元中。
  7. 你见过出道即巅峰吗?
  8. 汇编学习笔记(二):转移指令
  9. [原]逆向iOS SDK -- _UIImageAtPath 的实现(SDK 5.1)
  10. Hadoop配置项整理(hdfs-site.xml)
  11. ORACLE--Connect By、Level、Start With的使用(Hierarchical query-层次查询)
  12. 浅入MFC之对话框及MFC程序的运行
  13. 用netbeans开发Swing程序,添加自定义控件
  14. 好文汇总(不断更新)
  15. spring源码-第三个后置处理器
  16. windows下解压tar.gz文件
  17. android取消输入法联想,输入法联想功能,怎么清除输入法联想
  18. VS2022-更换背景壁纸
  19. 大数据写入到Oracle数据库(批量插入数据)
  20. 导入导出Excel-JAVA

热门文章

  1. leetcode_486. Predict the Winner
  2. Flutter实现动画卡片式Tab导航 | 掘金技术征文
  3. 【代码审计】使用SonarQube进行代码质量分析管理
  4. scikit-learn K近邻法类库使用小结
  5. python 爬虫之爬取大街网(思路)
  6. iOS开发之加载大量网络图片优化
  7. struts标签判断两个session中的字符串值是否相等
  8. NET 2.0中WinForm自定义的程序配置存放到哪里去了
  9. linux下配置Docker的jupyter notebook环境
  10. Leetcode 398. 随机数索引 解题思路及C++实现