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

news2024/11/14 13:47:31

        本文根据一个较为简单的粒子群算法框架详细分析粒子群算法的实现过程,对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:25
    F=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:maxgen
    time(gen)=gen;
    %---------------------------- 粒子位置移动 -----------------------------
    for i=1:1:NP
        for j=1:1:D
            dX(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;end
            if X(i,j)<MinX X(i,j)=MinX;end
        end
    end
    F=fun(X);
    %----------------------------- 适应度统计 ------------------------------
    [Bestf,Indexf]=sort(F); Bestfi=Bestf(NP);
    BestX=X(Indexf(NP),:);
    %---------------------------- 更新自身最优 -----------------------------
    for i=1:1:NP
        if F(i)>=selfF(i)
            selfF(i)=F(i);selfX(i,:)=X(i,:);
        end
    end
    %---------------------------- 更新全局最优 -----------------------------
    if Bestfi>=globalfi
        globalfi=Bestfi;globalBestX=BestX;
    end
    %----------------------------- 记录结果 --------------------------------
    BestJ(gen)=globalfi;
    if mod(gen,10)==0
        disp(sprintf('当前代数:%d;当前结果:%f',gen,globalfi));
    end
    plot(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:NP
        if F(i)>=selfF(i)
            selfF(i)=F(i);selfX(i,:)=X(i,:);
        end
    end

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

全局最优:

    if Bestfi>=globalfi
        globalfi=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:maxgen
    time(gen)=gen;
    %---------------------------- 粒子位置移动 -----------------------------
    for i=1:1:NP
        for j=1:1:D
            dX(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;end
            if X(i,j)<MinX X(i,j)=MinX;end
        end
    end
    F=fun(X);
    %----------------------------- 适应度统计 ------------------------------
    [Bestf,Indexf]=sort(F); Bestfi=Bestf(NP);
    BestX=X(Indexf(NP),:);
    %---------------------------- 更新自身最优 -----------------------------
    for i=1:1:NP
        if F(i)>=selfF(i)
            selfF(i)=F(i);selfX(i,:)=X(i,:);
        end
    end
    %---------------------------- 更新全局最优 -----------------------------
    if Bestfi>=globalfi
        globalfi=Bestfi;globalBestX=BestX;
    end
    %----------------------------- 记录结果 --------------------------------
    BestJ(gen)=globalfi;
    if mod(gen,10)==0
        disp(sprintf('当前代数:%d;当前结果:%f',gen,globalfi));
    end
    plot(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:25
    F=F+1./(j+(X(:,1)-a(1,j)).^6+(X(:,2)-a(2,j)).^6);%计算适应度
end

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

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

相关文章

flutter 实现表单的封装包含下拉框和输入框

一、表单封装组件实现效果 //表单组件 Widget buildFormWidget(List<InputModel> formList,{required GlobalKey<FormState> formKey}) {return Form(key: formKey,child: Column(children: formList.map((item) {return Column(crossAxisAlignment: CrossAxisAlig…

【BUG】Hexo|GET _MG_0001.JPG 404 (Not Found),hexo博客搭建过程图片路径正确却找不到图片

我的问题 我查了好多资料&#xff0c;结果原因是图片名称开头是_则该文件会被忽略。。。我注意到网上并没有提到这个问题&#xff0c;遂补了一下这篇博客并且汇总了我找到的所有解决办法。 具体检查方式&#xff1a; hexo生成一下静态资源&#xff1a; hexo g会发现这张图片…

配置静态路由实现全网互通

1、实验环境 如图下所示&#xff0c;三台路由器R1&#xff0e;R2&#xff0c;R3两两互连&#xff0c;每台路由器上都配置了Loopback地址模拟网络环境。 2、需求描述 需要在三台路由器上配置静态路由&#xff0c;以实现各网段之间的互通。 若要实现全网互通,必须明确如下两个问…

【GlobalMapper精品教程】075:将影像的颜色赋予点云实现点云真彩色

文章目录 一、加载点云与影像数据二、将影像色彩赋予点云三、保存色彩点云四、注意事项一、加载点云与影像数据 加载本实验数据(data075.rar)中的影像、点云数据,并用Globalmapper提供的卷帘工具(快速浏览图像)查看: 启动卷帘工具,左右拖动实现卷帘效果: 影像VS点云:…

【硬十宝典】——1.4【基础知识】电源完整性——理解与设计

定义&#xff1a; 电源完整性&#xff08;Power integrity&#xff09;简称PI&#xff0c;是确认电源来源及目的端的电压及电流是否符合需求。 电源完整性在现今的电子产品中相当重要。有几个有关电源完整性的层面&#xff1a;芯片层面、芯片封装层面、电路板层面及系统层面。…

EelasticSearch使用

1. Easy-ES介绍 Easy-Es 2. 导入依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions>//排除框架中原有的依赖包<exclusion><groupId>org.elast…

Elasticsearch:(二)2.安装kibana

1.环境安装介绍: 安装java环境安装Elasticsearch安装kibana安装Elasticsearch-head插件 本节文章主要讲解kibana的安装。 2.下载 下载Elasticsearch对应的版本,参考官方自身产品兼容版本:支持一览表 | Elastic 下载地址:Kibana 7.17.20 | Elastic Kibana 7.17.20 | Ela…

机器学习与深度学习 --李宏毅(笔记与个人理解)Day 20

Day 20 RNN 2 实际使用和其他应用 在实际的学习&#xff08;training&#xff09;过程中是如何工作的&#xff1f; step 1 Loss step 2 training Graindent Descent 反向传播的进阶版 – BPTT CLIpping 设置阈值~ 笑死昨天刚看完关伟说的有这玩意的就不是好东西 Why&#xff1…

FastChat启动与部署通义千问大模型

FastChat简介 FastChat is an open platform for training, serving, and evaluating large language model based chatbots. FastChat powers Chatbot Arena, serving over 10 million chat requests for 70 LLMs.Chatbot Arena has collected over 500K human votes from sid…

详细剖析多线程4----锁策略(八股文/面试常考)

文章目录 前言一、常见锁策略(八股文)1.1乐观锁和悲观锁1.2轻量级锁和重量级锁1.3自旋锁和挂起等待锁1.4普通互斥锁和读写锁1.5公平锁和非公平锁1.6可重入锁和不可重入锁1.7总结 二、synchronized内部原理三、CAS四、JUC(java.util.concurrent) 的常见类4.1Callable 接⼝4.2Ree…

基于SpringBoot+Vue七匹狼商城系统的设计与实现

系统介绍 近年来随着社会科技的不断发展&#xff0c;人们的生活方方面面进入了信息化时代。计算机的普及&#xff0c;使得我们的生活更加丰富多彩&#xff0c;越来越多的人使用通过网络来购买各类的商品。早期商品的销售和购买都是通过实体店&#xff0c;这种购买方式需要耗费…

openGauss学习笔记-267 openGauss性能调优-TPCC性能调优测试指导-网络配置-网卡多中断队列设置

文章目录 openGauss学习笔记-267 openGauss性能调优-TPCC性能调优测试指导-网络配置-网卡多中断队列设置267.1 操作步骤 openGauss学习笔记-267 openGauss性能调优-TPCC性能调优测试指导-网络配置-网卡多中断队列设置 本章节主要介绍openGauss数据库内核基于鲲鹏服务器和openE…

[jinja2]模板访问对象属性

甚至可以用. 访问字典 .访问一般用得是最多的

R绘图--峰峦图/山脊图/ggridges包

山脊图是部分重叠的线图&#xff0c;可产生山脉的印象。它们对于可视化分布随时间或空间的变化非常有用。 绘图 加载包和数据 # install.packages("ggridges") # 加载包 library(ggplot2) library(ggridges) library(viridis) library(tidyverse)# 准备输入数据 d…

Java发送邮件 启用SSL

使用的maven依赖: <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.4.7</version> </dependency> 配置文件mail.properties如下: # 邮箱配置 email.username=your-email@exa…

const成员函数 以及 取地址及const取地址操作符重载

目录 const成员函数 结论&#xff1a; 取地址及const取地址操作符重载 const成员函数 将const 修饰的 “ 成员函数 ” 称之为 const成员函数 &#xff0c; const 修饰类成员函数&#xff0c;实际修饰该成员函数的&#xff08;*this&#xff09; &#xff0c;表明在该成员函数…

嵌入式Linux开发实操(十七):Linux Media Infrastructure userspace API

视频和无线电流媒体设备使用的Linux内核到用户空间API,包括摄像机、模拟和数字电视接收卡、AM/FM接收卡、软件定义无线电(SDR)、流捕获和输出设备、编解码器设备和遥控器。典型的媒体设备硬件如下: 媒体基础设施API就是用于控制此类设备的,分五个部分。 第一部分V4L2 API…

【Interconnection Networks 互连网络】Dragonfly Topology 蜻蜓网络拓扑

蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数2. Topology Description 拓扑描述3. Topology Variations 拓扑变体 蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数 Dragonfly拓扑参数&#xff1a; N N N: 网络中终端(terminal)的总数量 p p p: 连接到每个路由器的终端数量 a a a: 每…

【网站项目】“最多跑一次”小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…