首页 > 其他分享 >基于PSO的最优路径优化仿真,带GUI界面,可以设置粒子数目,迭代次数,优化目标,输出最优解和最优路径

基于PSO的最优路径优化仿真,带GUI界面,可以设置粒子数目,迭代次数,优化目标,输出最优解和最优路径

时间:2023-04-05 10:34:09浏览次数:35  
标签:xnew1 end 路径 c1 c2 dist 最优 优化 id

1.算法描述

        PSO从这种模型中得到启示并用于解决优化问题。PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitnessvalue),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。

 

      粒子群优化算法(PSO),粒子群中的每一个粒子都代表一个问题的可能解, 通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性。

 

       在求解TSP这种整数规划问题的时候, PSO显然与ACO不同, PSO需要对算法本身进行一定的修改, 毕竟PSO刚开始是应用在求解连续优化问题上的.

 

    在路径规划中,我们将每一条路径规划为一个粒子,每个粒子群群有 n 个粒 子,即有 n 条路径,同时,每个粒子又有 m 个染色体,即中间过渡点的个数,每 个点(染色体)又有两个维度(x,y),在代码中用 posx 和 posy 表示一个种群。 通过每一代的演化,对粒子群进行演化操作,选择合适个体(最优路径)。

 

 

 

 

最终算法伪代码如下:

 

初始化: 每个粒子获得一个随机解和一个随机的SS (命名为速度)

 

For 在位置 X_{id} 的所有粒子, 计算新的位置 X_{id}':

 

计算 P_{id} 与 X_{id} 之间的差 A = P_{id} - X_{id}, 其中 A 为 BSS

 

计算 B = P_{gd} - X_{id}, 其中 B 为 BSS

 

根据速度更新公式计算新的速度 V_{id}', 并将 V_{id}' 转换为一个 BSS

 

计算新的解 X_{id}' = X_{id} + V_{id} (也就是 V_{id} 作用在 X_{id} 上)

 

更新 P_{id} 如果新的解更好

 

更新 P_{gd} 若出现新的全局最好的解

 

2.仿真效果预览

matlab2022a仿真结果如下:

 

 

 

 

 

 

3.MATLAB核心程序

 

%  nummin=xulie(Pb)           %最小适应度种群序号
    a1=Pb(1);
    a2=1;
    for i=1:m
        if a1>=Pb(i)
            a1=Pb(i);
            a2=i;
        end
    end
    nummin=a2;
    Gb(N)=Pb(nummin);          %当前群体最优长度
    for i=1:m
      %% 与个体最优进行交叉
      c1=round(rand*(n-2))+1;  %在[1,n-1]范围内随机产生一个交叉位
      c2=round(rand*(n-2))+1;
      while c1==c2
          c1=round(rand*(n-2))+1;  %在[1,n-1]范围内随机产生一个交叉位
          c2=round(rand*(n-2))+1;
      end   
      chb1=min(c1,c2);
      chb2=max(c1,c2);
      cros=Tour_pbest(i,chb1:chb2); %交叉区域矩阵
      ncros=size(cros,2);       %交叉区域元素个数
      %删除与交叉区域相同元素
      for j=1:ncros
          for k=1:n
              if xnew1(i,k)==cros(j)
                 xnew1(i,k)=0;
                  for t=1:n-k
                      temp=xnew1(i,k+t-1);
                      xnew1(i,k+t-1)=xnew1(i,k+t);
                      xnew1(i,k+t)=temp;
                  end                 
              end
          end
      end
      xnew=xnew1;
      %插入交叉区域
      for j=1:ncros
          xnew1(i,n-ncros+j)=cros(j);
      end
      %判断产生新路径长度是否变短
      dist=0;
      for j=1:n-1
          dist=dist+D(xnew1(i,j),xnew1(i,j+1));
      end
      dist=dist+D(xnew1(i,1),xnew1(i,n));
      if F(i)>dist
          x(i,:)=xnew1(i,:);
      end
      %% 与全体最优进行交叉
      c1=round(rand*(n-2))+1;  %在[1,n-1]范围内随机产生一个交叉位
      c2=round(rand*(n-2))+1;
      while c1==c2
          c1=round(rand*(n-2))+1;  %在[1,n-1]范围内随机产生一个交叉位
          c2=round(rand*(n-2))+1;
      end   
      chb1=min(c1,c2);
      chb2=max(c1,c2);
      cros=Tour_gbest(chb1:chb2); %交叉区域矩阵
      ncros=size(cros,2);       %交叉区域元素个数
      %删除与交叉区域相同元素
      for j=1:ncros
          for k=1:n
              if xnew1(i,k)==cros(j)
                 xnew1(i,k)=0;
                  for t=1:n-k
                      temp=xnew1(i,k+t-1);
                      xnew1(i,k+t-1)=xnew1(i,k+t);
                      xnew1(i,k+t)=temp;
                  end                 
              end
          end
      end
      xnew=xnew1;
      %插入交叉区域
      for j=1:ncros
          xnew1(i,n-ncros+j)=cros(j);
      end
      %判断产生新路径长度是否变短
      dist=0;
      for j=1:n-1
          dist=dist+D(xnew1(i,j),xnew1(i,j+1));
      end
      dist=dist+D(xnew1(i,1),xnew1(i,n));
      if F(i)>dist
          x(i,:)=xnew1(i,:);
      end
      %% 进行变异操作
      c1=round(rand*(n-1))+1;   %在[1,n]范围内随机产生一个变异位
      c2=round(rand*(n-1))+1;
      temp=xnew1(i,c1);
      xnew1(i,c1)=xnew1(i,c2);
      xnew1(i,c2)=temp;
       %判断产生新路径长度是否变短
      dist=0;
      for j=1:n-1
          dist=dist+D(xnew1(i,j),xnew1(i,j+1));
      end
      dist=dist+D(xnew1(i,1),xnew1(i,n));
      %dist=dist(xnew1(i,:),D);
      if F(i)>dist
          x(i,:)=xnew1(i,:);
      end
    end
  %  F=(x,C,D)         %计算种群适应度 
    %xuhao=xulie(F)           %最小适应度种群序号
    a1=F(1);
    a2=1;
    for i=1:m
       if a1>=F(i)
            a1=F(i);
            a2=i;
        end
    end
    xuhao=a2;

 

  

 

标签:xnew1,end,路径,c1,c2,dist,最优,优化,id
From: https://www.cnblogs.com/51matlab/p/17288913.html

相关文章

  • 第三十八篇 vue - 最佳实践 - 性能优化
    概述Vue在大多数常见场景下性能都是很优秀的,通常不需要手动优化。然而,总会有一些具有挑战性的场景需要进行针对性的微调。在本节中,我们将讨论用Vue开发的应用在性能方面该注意些什么首先,让我们区分一下web应用性能的两个主要方面1、页面加载性能首次访问时,应......
  • 2023-04-04 哈密尔顿问题和路径压缩
    哈密尔顿问题和路径压缩1哈密尔顿回路和TSP路径与回路哈密尔顿问题偏计算机,欧拉问题偏数学,所以本章我们主要讲哈密尔顿回路和哈密尔顿路径哈密尔顿回路哈密尔顿路径欧拉回路欧拉路径哈密尔顿回路定义从一个点出发,沿着边走,经过每个顶点恰好一次,之后再回到出发点,过程......
  • Gradle下载的依赖jar包路径位置
    Gradle依赖默认下载路径Mac系统默认下载路径:C:/Users/(用户名)/.gradle/caches/modules-2/files-2.1Windows系统默认下载路径:C:\Users(用户名).gradle\caches\modules-2\files-2.1修改Gradle缓存文件夹路径1.配置环境变量添加变量GRADLE_USER_HOME,值为gradle依赖下载......
  • Redis 在 vivo 推送平台的应用与优化实践
    一、推送平台特点vivo推送平台是vivo公司向开发者提供的消息推送服务,通过在云端与客户端之间建立一条稳定、可靠的长连接,为开发者提供向客户端应用实时推送消息的服务,支持百亿级的通知/消息推送,秒级触达移动用户。推送平台的特点是并发高、消息量大、送达及时性较高。目前现状最高......
  • Nginx——Nginx生产环境压测与性能优化实战
    摘要nginx的主要作用有三个方面:1、作为Web服务器;2、负载均衡服务器;3、邮件代理服务器等三个方面。其特点是占有内存少,并发能力强,给使用者带来了很多的便利。nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like协议下发行。但是在日常的工作......
  • case的穿透优化
    importjava.util.Scanner;publicclasspenetrate{publicstaticvoidmain(String[]args){}publicstaticvoidswitchTest1(){//键盘录入一个数值,其中1-5表示工作日,6-7表示休息日Scannersc=newScanner(System.in);System.out......
  • Redis 内存优化在 vivo 的探索与实践
    作者:vivo互联网服务器团队-TangWenjian一、背景使用过Redis的同学应该都知道,它基于键值对(key-value)的内存数据库,所有数据存放在内存中,内存在Redis中扮演一个核心角色,所有的操作都是围绕它进行。我们在实际维护过程中经常会被问到如下问题,比如数据怎么存储在Redis里面能......
  • 缓存优化——环境搭建
    maven坐标在项目的pom.xml文件中导入springdataredis的maven坐标:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 配置文件在项目的application.yml中加入redis相关配......
  • DataLeap 数据资产实战:如何实现存储优化?
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群背景DataLeap作为一站式数据中台套件,汇集了字节内部多年积累的数据集成、开发、运维、治理、资产、安全等全套数据中台建设的经验,助力企业客户提升数据研发治理效率、降低管理成本。Da......
  • 前端项目首页加载速度及项目性能优化
    提升首屏的加载速度或项目整体优化,是前端性能优化中最重要的环节,接下来跟大家分享一些常规且有效的首屏优化建议及做法。一、路由懒加载SPA项目,一个路由对应一个页面,如果不做处理,项目打包后,会把所有页面打包成一个文件,当用户打开首页时,会一次性加载所有的资源,造成首页加载很慢,降......