Matlab新手快速上手2(粒子群算法)

        本文根据一个较为简单的粒子群算法框架详细分析粒子群算法的实现过程,对matlab新手友好,源码在文末给出。

粒子群算法简介

        粒子群算法(Particle Swarm Optimization,PSO)是一种群体智能优化算法,灵感来源于鸟群或鱼群等生物群体的行为。在PSO中,每个潜在解被表示为粒子,这些粒子在解空间中移动,并且其位置和速度根据个体经验和群体经验进行更新。

        PSO 算法的核心思想是通过模拟群体行为来搜索解空间中的最优解。每个粒子代表了解空间中的一个潜在解,并且根据其当前位置和速度来调整其移动方向。粒子的速度和位置的更新依赖于两个重要的信息:个体最优(局部最优)和全局最优。

PSO 算法的基本步骤如下:

  1. 初始化粒子群:随机生成一组粒子,并随机初始化它们的位置和速度。

  2. 评估适应度:对每个粒子根据其当前位置计算适应度值。

  3. 更新个体最优位置:对于每个粒子,根据其当前位置和个体历史最优位置,更新其个体最优位置。

  4. 更新全局最优位置:根据整个粒子群的个体最优位置,更新全局最优位置。

  5. 更新粒子速度和位置:根据个体历史最优位置和全局历史最优位置,以及一些随机因素,更新每个粒子的速度和位置。

  6. 重复迭代:重复步骤 3~5 直到达到停止条件(例如达到最大迭代次数或找到满意的解)。

        PSO 算法的优点包括简单易实现、不需要太多的参数调整、能够处理高维问题以及对于非线性、非凸优化问题有较好的收敛性。然而,它也有一些缺点,例如对于高度多模态函数可能会陷入局部最优、收敛速度慢等。

参数与子函数定义:

function PSO
%---------------------------------- 共性参数 -------------------------------
NP=20;D=2;                    % 种群规模,变量个数
selfw=2.0;globalw=2.0;        % 自身因子,全局因子
w=0.5;maxgen=1000;       % 惯性因子,限定步数
%---------------------------------- 个性参数 -------------------------------
MinX=-65.536;MaxX=65.536; %变量范围
%------------------------------- 粒子位置初始化 ----------------------------
X=MinX+(MaxX-MinX)*rand(NP,D);
F=fun(X);
selfX=X;selfF=F;dX=zeros(NP,D);
%--------------------------------- 适应度统计 ------------------------------
[Bestf,Indexf]=sort(F); globalfi=Bestf(NP);
globalBestX=X(Indexf(NP),:);
function F=fun(X)
a=[-32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32;...-32 -32 -32 -32 -32 -16 -16 -16 -16 -16 0 0 0 0 0 16 16 16 16 16 32 32 32 32 32];
F=0.002*ones(size(X,1),1);
for j=1:1:25F=F+1./(j+(X(:,1)-a(1,j)).^6+(X(:,2)-a(2,j)).^6);%计算适应度
end

如代码中,省略号的意思是将代码延续到下一行,使代码更易读。无实际意义

参数定义

X矩阵表示NP行2列,元素为0-1的随机值的矩阵,每一行表示一个粒子,两个参数分别为粒子的x坐标和y坐标。

 F矩阵与计算适应度

 ones函数在上一个遗传算法的文章中已经介绍,F=0.002*ones(size(X,1),1);这个代码生成了一个列数为1,与X矩阵行数相等的矩阵,矩阵元素全为0.002。

        下面的for循环就是计算适应度的过程,如代码所示,这个函数根据距离权重也就是j的值(1-25)计算了每个粒子到25个参考点之间的距离之和,得出与最优距离的适应度(0-1)越接近1表示适应度越好,最终目的也就是使用算法找到最结果最趋近1的解,也就是第一个点(-32,-32)的解,为什么是第一个点,带入点的坐标计算就得知,若距离每个点都不相近,那么结果就是一个很大的值除1,就是趋近于0的值,当粒子趋近于第一个点时,结果就趋近1/1也就是1。 

zeros函数

  • 作用:创建一个全为0的矩阵。
  • 用法:Z = zeros(m,n);表示创建了一个mxn的元素全为0的矩阵。
  • 举例:Z = zreos(3,4);这样就创建了一个3行4列的元素全为0的矩阵

sort函数:

[Bestf,Indexf]=sort(F);这个sort函数是给Bestf排序的,其中排序后的结果存储在 Bestf中,排序后元素在原向量中的索引存储在 Indexf中。例如:

  • 假设有以下向量 F= [10, 30, 20, 50, 40]运行[Bestf,Indexf] = sort(F)
  • Bestf 存储了排序后的结果:Bestf = [10, 20, 30, 40, 50]。
  • Indexf 存储了排序后元素在原向量中的索引:Indexf = [1, 3, 2, 5, 4]。

变量定义:

globalfi =Bestf(NP);表示记录粒子与所有目标点的最佳的权重距离之和,最佳值记录在globalfi 中。

globalBestX=X(Indexf(NP),:);表示索引这个最佳粒子并记录在globalBestX中。

a矩阵

a矩阵存储了15个的参考点坐标,第i个参考点的坐标就是(x_{i},y_{i}) = (a(1,i),a(2,i)),例如第一个参考点坐标就是(32,32)

size函数

  • 作用:函数用于获取数组的尺寸。
  • 一个参数:例如:A = [1, 2, 3; 4, 5, 6]; s = size(A);这时输出[2,3]表示这是2行3列的矩阵
  • 两个参数:s = size(A, 1);这样会返回A的行数2,s = size(A, 2);这样会返回A的列数3

算法开始

for gen=1:1:maxgentime(gen)=gen;%---------------------------- 粒子位置移动 -----------------------------for i=1:1:NPfor j=1:1:DdX(i,j)=w*dX(i,j)+selfw*rand*(selfX(i,j)-X(i,j))+...globalw*rand*(globalBestX(1,j)-X(i,j));X(i,j)=X(i,j)+dX(i,j);    %移动后的位置if X(i,j)>MaxX X(i,j)=MaxX;endif X(i,j)<MinX X(i,j)=MinX;endendendF=fun(X);%----------------------------- 适应度统计 ------------------------------[Bestf,Indexf]=sort(F); Bestfi=Bestf(NP);BestX=X(Indexf(NP),:);%---------------------------- 更新自身最优 -----------------------------for i=1:1:NPif F(i)>=selfF(i)selfF(i)=F(i);selfX(i,:)=X(i,:);endend%---------------------------- 更新全局最优 -----------------------------if Bestfi>=globalfiglobalfi=Bestfi;globalBestX=BestX;end%----------------------------- 记录结果 --------------------------------BestJ(gen)=globalfi;if mod(gen,10)==0disp(sprintf('当前代数:%d;当前结果:%f',gen,globalfi));endplot(time,BestJ,'r');axis([1,maxgen,0,1.1]);xlabel('迭代步数');ylabel('优化结果');drawnow;pause(0.1);if globalfi>1.0 break;end
end
disp(sprintf('迭代步数:%d;优化结果:%f',gen,globalfi));
%---------------------------- 子函数1:目标函数 ----------------------------
disp(F);
disp(BestX);

        首先for循环规定迭代次数为1000次,也就是粒子最多行进1000次,time存储for循环的的第几次迭代。

粒子移动:

        接下来是粒子移动,这是整个代码的核心部分,首先两个for循环更新所有粒子的x和y坐标,dX用于存储每个粒子的坐标变化包括x和y两个值也就是两个变化方向,可以理解为粒子的变化向量,也就是粒子的行进方向和速度。

惯性因子:

        w表示粒子的惯性因子,w*dX(i,j)表示粒子沿上一次的速度与方向行进,w的值为0.5表示速度减慢为一半,后面的算式表示根据自身最优与全局最优改变方向并增加速度,详细实现在下面给出:。

自身最优:

    for i=1:1:NPif F(i)>=selfF(i)selfF(i)=F(i);selfX(i,:)=X(i,:);endend

这个表示更新自身最优的过程,selfF表示粒子每次的与最优解的适应度(0-1),越接近1表示越接近最优解,selfX表示记录所有粒子的自身最优解的位置,因此selfw*rand*(selfX(i,j)-X(i,j))就是得出当前粒子坐标与最优坐标的差,并乘上自身因子与随机值selfw*rand,表示速度。

全局最优:

    if Bestfi>=globalfiglobalfi=Bestfi;globalBestX=BestX;end

与上面自身最优同理,根据最好粒子的适应度,更新全局最优解的坐标,其实也就是适应度最好的粒子,同理globalw*rand*(globalBestX(1,j)-X(i,j))也就是向全局最优解方向移动一定的值。

总结:根据惯性因子、自身最优、全局最优实现粒子的更新,惯性因子让粒子保持上一次的移动方向,自身最优与全局最优都是让粒子改变方向,根据权重向着这两个方向偏移一定的角度和速度,最终实现粒子的寻优过程。

源代码:

%---------------------------------- 程序说明 -------------------------------%                           该程序实现了普通粒子群算法%---------------------------------- 程序正文 -------------------------------
function PSO
%---------------------------------- 共性参数 -------------------------------
NP=20;D=2;                    % 种群规模,变量个数
selfw=2.0;globalw=2.0;        % 自身因子,全局因子
w=0.5;maxgen=1000;       % 惯性因子,限定步数
%---------------------------------- 个性参数 -------------------------------
MinX=-65.536;MaxX=65.536; %变量范围
%------------------------------- 粒子位置初始化 ----------------------------
X=MinX+(MaxX-MinX)*rand(NP,D);
F=fun(X);
selfX=X;selfF=F;dX=zeros(NP,D);
%--------------------------------- 适应度统计 ------------------------------
[Bestf,Indexf]=sort(F); globalfi=Bestf(NP);
globalBestX=X(Indexf(NP),:);
%------------------------------- 程序主循环开始 ----------------------------
for gen=1:1:maxgentime(gen)=gen;%---------------------------- 粒子位置移动 -----------------------------for i=1:1:NPfor j=1:1:DdX(i,j)=w*dX(i,j)+selfw*rand*(selfX(i,j)-X(i,j))+...globalw*rand*(globalBestX(1,j)-X(i,j));X(i,j)=X(i,j)+dX(i,j);    %移动后的位置if X(i,j)>MaxX X(i,j)=MaxX;endif X(i,j)<MinX X(i,j)=MinX;endendendF=fun(X);%----------------------------- 适应度统计 ------------------------------[Bestf,Indexf]=sort(F); Bestfi=Bestf(NP);BestX=X(Indexf(NP),:);%---------------------------- 更新自身最优 -----------------------------for i=1:1:NPif F(i)>=selfF(i)selfF(i)=F(i);selfX(i,:)=X(i,:);endend%---------------------------- 更新全局最优 -----------------------------if Bestfi>=globalfiglobalfi=Bestfi;globalBestX=BestX;end%----------------------------- 记录结果 --------------------------------BestJ(gen)=globalfi;if mod(gen,10)==0disp(sprintf('当前代数:%d;当前结果:%f',gen,globalfi));endplot(time,BestJ,'r');axis([1,maxgen,0,1.1]);xlabel('迭代步数');ylabel('优化结果');drawnow;pause(0.1);if globalfi>1.0 break;end
end
disp(sprintf('迭代步数:%d;优化结果:%f',gen,globalfi));
%---------------------------- 子函数1:目标函数 ----------------------------
disp(F);
disp(BestX);
function F=fun(X)
a=[-32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32 -32 -16 0 16 32;...-32 -32 -32 -32 -32 -16 -16 -16 -16 -16 0 0 0 0 0 16 16 16 16 16 32 32 32 32 32];
F=0.002*ones(size(X,1),1);
for j=1:1:25F=F+1./(j+(X(:,1)-a(1,j)).^6+(X(:,2)-a(2,j)).^6);%计算适应度
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/1400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标检测YOLO数据集的三种格式及转换

目标检测YOLO数据集的三种格式 在目标检测领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;算法是一个流行的选择。为了训练和测试YOLO模型&#xff0c;需要将数据集格式化为YOLO可以识别的格式。以下是三种常见的YOLO数据集格式及其特点和转换方法。 1. YOL…

计算机系统结构(二) (万字长文建议收藏)

计算机系统结构 (二) 本文首发于个人博客网站&#xff1a;http://www.blog.lekshome.top/由于CSDN并不是本人主要的内容输出平台&#xff0c;所以大多数博客直接由md文档导入且缺少审查和维护&#xff0c;如果存在图片或其他格式错误可以前往上述网站进行查看CSDN留言不一定能够…

大话设计模式-里氏代换原则

里氏代换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09; 概念 里氏代换原则是面向对象设计的基本原则之一&#xff0c;由美国计算机科学家芭芭拉利斯科夫&#xff08;Barbara Liskov&#xff09;提出。这个原则定义了子类型之间的关系&#xff0…

【人工智能基础】经典逻辑与归结原理

本章节的大部分内容与离散数学的命题、谓词两章重合。 假言推理的合式公式形式 R,R→P⇒PR,R∨P⇒P 链式推理 R→P,P→Q⇒R→QR∨P,P∨Q⇒R∨Q 互补文字&#xff1a;P和P 亲本子句&#xff1a;含有互补文字的子句 R∨P,P∨Q为亲本子句 注意&#xff1a; 必须化成析取范式…

命理八字之电子木鱼的代码实现

#uniapp# #电子木鱼# 不讲废话&#xff0c;上截图 目录结构如下图 功能描述&#xff1a; 点击一下&#xff0c;敲一下&#xff0c;伴随敲击声&#xff0c;可自动点击。自动点击需看视频广告&#xff0c;或者升级VIP会员。 疑点解答&#xff1a; 即animation动画的时候&…

Window中Jenkins部署asp/net core web主要配置

代码如下 D: cd D:\tempjenkins\src\ --git工作目录 dotnet restore -s "https://nuget.cdn.azure.cn/v3/index.json" --nuget dotnet build dotnet publish -c release -o %publishPath% --发布路径

Day08React——第八天

useEffect 概念&#xff1a;useEffect 是一个 React Hook 函数&#xff0c;用于在React组件中创建不是由事件引起而是由渲染本身引起的操作&#xff0c;比如发送AJAx请求&#xff0c;更改daom等等 需求&#xff1a;在组件渲染完毕后&#xff0c;立刻从服务器获取频道列表数据…

Java:二叉树(1)

从现在开始&#xff0c;我们进入二叉树的学习&#xff0c;二叉树是数据结构的重点部分&#xff0c;在了解这个结构之前&#xff0c;我们先来了解一下什么是树型结构吧&#xff01; 一、树型结构 1、树型结构简介 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>…

Matlab无基础快速上手1(遗传算法框架)

本文用经典遗传算法框架模板&#xff0c;对matlab新手友好&#xff0c;快速上手看懂matlab代码&#xff0c;快速应用实践&#xff0c;源代码在文末给出。 基本原理&#xff1a; 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一种受生物学启发的优化算法…

在Gtiee搭建仓库传代码/多人开发/个人代码备份---git同步---TortoiseGit+TortoiseSVN

文章目录 前言1.安装必要软件2. Gitee建立新仓库git同步2.1 Gitee建立新仓库2.2 Gitee仓库基本配置2.3 Git方式进行同步 3. TortoiseGitTortoiseSVN常用开发方式3.1 秘钥相关3.2 TortoiseGit拉取代码TortoiseGit提交代码 4. 其他功能探索总结 前言 正常企业的大型项目都会使用…

TR5 - Transformer的位置编码

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 前言什么是位置编码1. 定义2. 三角函数3. 位置编码公式4. 位置编码示例 可视化理解位置编码1. 代码实现2. 观察不同位置对应的曲线3. 整句话的位置编码可…

排序 “贰” 之选择排序

目录 ​编辑 1. 选择排序基本思想 2. 直接选择排序 2.1 实现步骤 2.2 代码示例 2.3 直接选择排序的特性总结 3. 堆排序 3.1 实现步骤 3.2 代码示例 3.3 堆排序的特性总结 1. 选择排序基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个…

Guitar Pro简谱输入方法 Guitar Pro简谱音高怎么调整,Guitar Pro功能介绍

一、新版本特性概览 Guitar Pro v8.1.1 Build 17在保留了前版本强大功能的基础上&#xff0c;进一步优化了用户体验和功能性能。新版本主要更新包括以下几个方面&#xff1a; 界面优化&#xff1a;新版界面更加简洁美观&#xff0c;操作更加便捷&#xff0c;即使是初学者也能快…

在线拍卖系统,基于SpringBoot+Vue+MySql开发的在线拍卖系统设计和实现

目录 一. 系统介绍 二. 功能模块 2.1. 管理员功能模块 2.2. 用户功能模块 2.3. 前台首页功能模块 2.4. 部分代码实现 一. 系统介绍 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系…

Docker - 简介

原文地址&#xff0c;使用效果更佳&#xff01; Docker - 简介 | CoderMast编程桅杆https://www.codermast.com/dev-tools/docker/docker-introduce.html Docker是什么&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 D…

vulfocus靶场couchdb 权限绕过 (CVE-2017-12635)

Apache CouchDB是一个开源数据库&#xff0c;专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式&#xff0c;JavaScript作为查询语言&#xff0c;MapReduce和HTTP作为API的NoSQL数据库。应用广泛&#xff0c;如BBC用在其动态内容展示平台&…

串口RS485

1.原理 全双工&#xff1a;在同一时刻可以同时进行数据的接收和数据的发送&#xff0c;两者互不影响 半双工&#xff1a;在同一时刻只能进行数据的接收或者数据的发送&#xff0c;两者不能同时进行 差分信号幅值相同&#xff0c;相位相反&#xff0c;有更强的抗干扰能力。 干…

vlan的学习笔记1

vlan&#xff1a; 1.一般情况下:以下概念意思等同: 一个vlan一个广播域 一个网段 一个子网 2.一般情况下: &#xff08;1&#xff09;相同vlan之间可以直接通信&#xff0c;不同vlan之间不能直接通信! &#xff08;2&#xff09;vlan技术属于二层技术&…

C语言中, 文件包含处理,#include< > 与 #include ““的区别

文件包含处理 指一个源文件可以将另外一个文件的全部内容包含进来 &#xff23;语言提供了#include命令用来实现文件包含的操作 #include< > 与 #include ""的区别 <> 表示系统直接按系统指定的目录检索 "" 表示系统先在 "" 指定…

Rust序列化和反序列化

Rust 编写python 模块 必备库 docker 启动 nginx 服务 NGINX 反向代理配置