PSO算法

news2024/11/20 6:17:19
🍎道阻且长,行则将至。🍓

目录

    • 1.PSO算法主要步骤🌱
    • 2.PSO更新方法🌾
    • 3.PSO求解TSP问题🌴


粒子群算法(Particle Swarm Optimization,简称PSO)是一种优化算法,模拟了鸟群或鱼群等群体生物行为的优化思想。
在这里插入图片描述

其基本思想是将待求解问题看成一个在多维空间中寻找最优解的优化问题,将每个可能的解看成多维空间中的一个粒子,并将它们随机散布在搜索空间中。
粒子的位置表示一个可行解,粒子的速度表示更新时的变化量。通过给每个粒子分配一个随机的速度向量,指导每个粒子进行探索。同时,使用全局最优和局部最优导引粒子的搜索方向。全局最优即全局最优解的位置,局部最优为某个粒子在个体搜索阶段找到的最优解。将这些信息作为粒子的引导方向,逐渐逼近全局最优解,达到最优化的目的。

1.PSO算法主要步骤🌱

  1. 设定粒子群种群大小目标函数搜索空间
    初始化粒子群:每个粒子的位置和速度都要设置随机初值,并计算其个体适应度

  2. 更新每个粒子的速度位置:对于第i个粒子,分别计算其个体和全局最优解的影响,然后更新该粒子的速度和位置。

  3. 重新计算每个粒子的适应度

  4. 判断是否满足停止条件,若满足停止条件,则输出当前种群中最优的粒子。
    否则,返回第3步进行迭代。

PSO算法的优点是可以适应任意目标函数,复杂度不高,具有较好的搜索能力。根据个体最优和全局最优的影响参数的设置不同会影响算法收敛性和导致算法陷入局部最优。PSO算法由于其具有较强的随机性,导致其搜索过程缺乏自适应能力,可能会在搜索过程中出现较大波动。同时,在高维空间中表现欠佳,并且对于复杂问题,需要精细地调节参数才能取得良好的效果。

在这里插入图片描述

2.PSO更新方法🌾

粒子群算法的核心就在于更新粒子的速度和位置,从而不断搜索搜寻空间寻找最优解。其速度和位置的更新公式包括两个部分:个体最优引导和全局最优引导。
以下是粒子群算法的速度和位置更新公式:

  1. 速度更新公式:
    v i , d ( t + 1 ) = w v i , d ( t ) + c 1 r 1 ( p b e s t i , d − x i , d ( t ) ) + c 2 r 2 ( g b e s t d − x i , d ( t ) ) v_{i,d}(t+1) = wv_{i,d}(t) + c_{1}r_{1}(pbest_{i,d}-x_{i,d}(t)) + c_{2}r_{2}(gbest_{d}-x_{i,d}(t)) vi,d(t+1)=wvi,d(t)+c1r1(pbesti,dxi,d(t))+c2r2(gbestdxi,d(t))
    其中, v i , d ( t ) v_{i,d}(t) vi,d(t) 表示第 i 个粒子在第 d 维的速度, t t t表示迭代次数, w w w表示惯性权重, c 1 c_1 c1 c 2 c_2 c2 表示粒子个体和群体认知系数, r 1 r_1 r1 r 2 r_2 r2 是 0 到 1 之间的随机数, p b e s t i , d pbest_{i,d} pbesti,d 表示第 i 个粒子在第 d 维度的个体最优位置, g b e s t d gbest_{d} gbestd 表示全局最优位置在第 d 维度的取值, x i , d ( t ) x_{i,d}(t) xi,d(t) 是第 i 个粒子在第 d 维度的位置。 p b e s t pbest pbest是于该粒子之前最优的解, g b e s t gbest gbest是于所有粒子之前最优的解。
    公式中第一项是粒子本身的惯性,第二项是粒子向个体最优点的引力,第三项是粒子向全局最优点的引力。

  2. 位置更新公式:
    x i , d ( t + 1 ) = x i , d ( t ) + v i , d ( t + 1 ) x_{i,d}(t+1) = x_{i,d}(t) + v_{i,d}(t+1) xi,d(t+1)=xi,d(t)+vi,d(t+1)
    其中 x i , d ( t ) x_{i,d}(t) xi,d(t) 表示第 i 个粒子在维度 d 上的位置, v i , d ( t + 1 ) v_{i,d}(t+1) vi,d(t+1) 表示第 i 个粒子在维度 d 上的速度。通过以上公式,粒子群不断迭代,直到达到所要求的精度或者达到最大迭代次数。

在实际应用中,惯性权重 w 是一个非常重要的参数,控制着算法的局部变化和全局探索的平衡。在迭代过程中,w 的值通常逐渐递减。同时,也需要通过多次实验和调整,确定其他参数的合理取值,以获得更好的优化结果。

  
  

在这里插入图片描述

3.PSO求解TSP问题🌴

实现粒子群算法求解TSP问题的代码:

定义一个 Particle 类用于存储粒子的相关信息;
initialize() 方法来初始化种群;
updatePBest()方法用于更新个体历史最优路径;
updateVelocity() 方法更新粒子速度;
updatePosition()方法更新粒子位置;
定义了 calculateFitness() 方法用于计算适应度(路径长度)。
main() 方法中,我们首先调用 initialize() 方法初始化种群,然后通过迭代不断更新粒子的速度、位置、适应度等相关参数,更新个体最优路径和全局最优路径
最终输出最优解路径和路径长度。

public class PSOTSP {
    // 城市集合,第i号城市的编码为i
    public static int[][] coordinates = {
            {200,  40}, {180,  80}, {160, 100}, {140, 120}, {160, 140}, 
            {180, 160}, {200, 200}, {220, 160}, {240, 140}, {260,120}, 
            {240, 100}, {220,  60}, {200,  20}, {240,  20}, {260,  40}
    };
    // 城市数目
    public static int cityNum = coordinates.length;
    // 种群规模
    public static int populationSize = 50;
    // 最大迭代次数
    public static int maxGeneration = 200;
    // 学习因子,用于控制粒子速度和位置的更新
    public static double learningFactor = 0.7;
    // 粒子群
    public static Particle[] particles = new Particle[populationSize];
    // 全局最优解
    public static int[] gbest = new int[cityNum];
    // 全局最优解路径长度
    public static double gbestValue = Double.MAX_VALUE;
    // 计算城市间距离,采用欧氏距离
    public static double[][] distanceMatrix = new double[cityNum][cityNum];
    static {
        for (int i = 0; i < cityNum; i++) {
            for (int j = i + 1; j < cityNum; j++) {
                int xDistance = coordinates[i][0] - coordinates[j][0];
                int yDistance = coordinates[i][1] - coordinates[j][1];
                distanceMatrix[i][j] = Math.sqrt(xDistance * xDistance + yDistance * yDistance);
                distanceMatrix[j][i] = distanceMatrix[i][j];
            }
        }
    }
    public static void main(String[] args) {
        initialize();
        for (int g = 0; g < maxGeneration; g++) {
            for (int i = 0; i < populationSize; i++) {
                for (int j = 0; j < cityNum; j++) {
                    particles[i].updateVelocity(gbest, learningFactor);
                    particles[i].updatePosition();
                    particles[i].calculateFitness(distanceMatrix);
                }
                // 更新个体最优解
                particles[i].updatePBest();
                // 更新全局最优解
                if (particles[i].getPBestValue() < gbestValue) {
                    gbestValue = particles[i].getPBestValue();
                    System.arraycopy(particles[i].getPBest(), 0, gbest, 0, cityNum);
                }
            }
        }
        System.out.print("最优解路径: ");
        for (int i = 0; i < cityNum; i++) {
            System.out.print(gbest[i] + 1 + " ");
        }
        System.out.println();
        System.out.println("最短路径长度: " + gbestValue);
    }
    public static void initialize() {
        // 初始化粒子
        for (int i = 0; i < populationSize; i++) {
            particles[i] = new Particle(cityNum);
            particles[i].initialize();
            particles[i].calculateFitness(distanceMatrix);
            // 更新全局最优解
            if (particles[i].getPBestValue() < gbestValue) {
                gbestValue = particles[i].getPBestValue();
                System.arraycopy(particles[i].getPBest(), 0, gbest, 0, cityNum);
            }
        }
    }
    // 定义粒子实体类
    public static class Particle {
        // 存储粒子经过的路径,初始化为-1
        private int[] path;
        // 存储粒子历史最优路径
        private int[] pbest;
        // 粒子当前位置的适应度值
        private double fitness;
        // 粒子历史最优位置的适应度值
        private double pbestValue;
        // 存储粒子当前速度
        private double[] velocity;
        // 最大速度
        private static double vmax = 5;
        public Particle(int length) {
            path = new int[length];
            pbest = new int[length];
            velocity = new double[length];
        }
        // 随机初始化粒子位置和速度
        public void initialize() {
            List<Integer> list = new ArrayList<Integer>();
            for (int i = 0; i < path.length; i++) {
                list.add(i);
                path[i] = -1;
                velocity[i] = 0;
            }
            Collections.shuffle(list);
            for (int i = 0; i < path.length; i++) {
                path[i] = list.get(i);
            }
            System.arraycopy(path, 0, pbest, 0, path.length);
            pbestValue = fitness;
        }
        // 计算当前位置的适应度值
        public void calculateFitness(double[][] distanceMatrix) {
            double pathLength = 0;
            for (int i = 0; i < path.length - 1; i++) {
                pathLength += distanceMatrix[path[i]][path[i + 1]];
            }
            pathLength += distanceMatrix[path[path.length - 1]][path[0]];
            fitness = pathLength;
        }
        // 更新个体历史最优位置
        public void updatePBest() {
            if (fitness < pbestValue) {
                System.arraycopy(path, 0, pbest, 0, path.length);
                pbestValue = fitness;
            }
        }
        // 更新粒子速度
        public void updateVelocity(int[] gbest, double learningFactor) {
            // 计算个体和全局最优差距
            double[] deltaPbest = new double[path.length];
            double[] deltaGbest = new double[path.length];
            for (int i = 0; i < path.length; i++) {
                deltaPbest[i] = pbest[i] - path[i];
                deltaGbest[i] = gbest[i] - path[i];
            }
            for (int i = 0; i < path.length; i++) {
                // 估算粒子的局部最优解和全局最优解的距离占所有点之间距离的比值
                double alpha = Math.random() * learningFactor;
                // 更新速度
                velocity[i] = alpha * velocity[i] + deltaPbest[i] * Math.random()
                        + (1 - alpha) * deltaGbest[i] * Math.random();
                // 控制速度不超过最大限制
                if (velocity[i] > vmax) {
                    velocity[i] = vmax;
                } else if (velocity[i] < -vmax) {
                    velocity[i] = -vmax;
                }
            }
        }
        // 更新粒子位置
        public void updatePosition() {
            List<Integer> list = new ArrayList<Integer>();
            for (int i = 0; i < path.length; i++) {
                list.add(path[i]);
            }
            for (int i = 0; i < path.length; i++) {
                int index = list.indexOf(i);
                int moveLength = (int) Math.round(velocity[i]);
                int newPosition = (index + moveLength + path.length) % path.length;
                if (newPosition < list.size() && newPosition > 0) {
                    list.add(newPosition, i);
                    list.remove(index < 0 ? list.size() - 1 : index);
                }
            }
            for (int i = 0; i < path.length; i++) {
                path[i] = list.get(i);
            }
        }
        public double getPBestValue() {
            return pbestValue;
        }
        public int[] getPBest() {
            return pbest;
        }
    }
}

☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓

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

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

相关文章

美国全力打击币圈 “一套花式组合拳”,打得从业者透不过气

银行危机“平息”过后&#xff0c;美国监管机构对币圈接连出手&#xff0c;一套花式组合拳打得从业者透不过气&#xff0c;也使得加密行业在政府的拳头之下风声鹤唳。 首先&#xff0c;切断加密货币与传统金融机构的联系。美国金融体系陷入混乱之际&#xff0c;一系列历史性的银…

顺序表(数据结构)

目录 线性表 顺序表 1、顺序表创建 2、初始化 3、扩容 4、尾插 5、尾删 6、头插 7、头删 8、指定位置插入 9、指定位置删除 10、查询 11、打印 12、销毁 顺序表总代码 Leetcode编程题 1、移除元素 题目链接&#xff1a; 题目描述&#xff1a; 题目解析&#xff1a; 2、删除有序…

游戏内嵌社区服务开放,助力开发者提升玩家互动与留存

华为 HMS Core 游戏内嵌社区服务提供快速访问华为游戏中心论坛能力&#xff0c;支持玩家直接在游戏内浏览帖子和交流互动&#xff0c;助力开发者扩展内容生产和触达的场景。 一、为什么要游戏内嵌社区&#xff1f; 二、游戏内嵌社区的典型使用场景 1、游戏内打开论坛 您可以在…

[Linux]环境变量

目录 基本概念 常见的环境变量 PATH测试 HOME测试 SHELL测试 和环境变量相关的命令 main函数的三个参数 环境变量的组织方式 通过代码如何获取环境变量 通过系统调用获取或设置环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系…

FreeRTOS 系统内核控制函数

FreeRTOS 中有一些函数只供系统内核使用&#xff0c;用户应用程序一般不允许使用&#xff0c;这些 API 函数就是系统内核控制函数。 内核控制函数 顾名思义&#xff0c;内核控制函数就是 FreeRTOS 内核所使用的函数&#xff0c;一般情况下应用层程序不使用这些函数&#xff0…

6基于二阶锥规划的主动配电网最优潮流求解

matlab代码&#xff1a;基于二阶锥规划的主动配电网最优潮流求解 参考文献&#xff1a;主动配电网多源协同运行优化研究_乔珊 摘要&#xff1a;最优潮流研究在配 电网规划运行 中不可或缺 &#xff0c; 且在大量分布式能源接入 的主动配 电网环境下尤 为重要 。传统的启发式算…

设计师一定要知道这5个免费样机素材网

本期推荐5个设计师必备的样机素材网站&#xff0c;免费下载&#xff0c;建议收藏~ 1、菜鸟图库 https://www.sucai999.com/searchlist/3217----all-0-1.html?vNTYxMjky 网站有多种类型的设计素材&#xff0c;像平面、电商、UI、办公等素材这里面都能找到。样机素材分类清晰&…

GitHub“疯狂”求阿里内部开源这份10W字Java面试手册,竟遭拒绝

行业风向标&#xff0c;猎聘发布的数据报告显示&#xff1a; 相比以往&#xff0c;2023年企业招聘两大变化体现在&#xff1a;对人才各方面能力要求更高、对人岗的匹配性要求更细。不同规模的企业用人各有侧重&#xff0c;大中型企业更注重人的全面能力&#xff0c;小型企业更…

我写系列博客的缘由

我写系列博客的缘由 每个经历不是一帆风顺的人&#xff0c;都将深刻地体会到&#xff0c;少走弯路对一个人来说是多么重要。人的生存不是浪漫的幻想&#xff0c;而是建立在能立足于现实社会上&#xff0c;教育的真正意义&#xff0c;是培养你的认识水平、提升智慧&#xff0c;借…

JAVA语言-比较器Comparator

目录 一、什么是Comparator 二、Java compare方法和compareTo方法 三、java中Comparable和Comparator的区别 Comparator的例子 一、什么是Comparator Comparator 是javase中的接口&#xff0c;位于java.util包下。 数组工具类和集合工具类中提供的工具方法sort方法都给出…

Vector - CAPL - CAN x 总线信息获取

在CAN&CANFD测试中&#xff0c;我们经常需要获取到CAN总线的负载、错误帧、过载帧、发送错误等等CAN总线上面的信息&#xff0c;这些信息如此重要&#xff0c;但是如果真的要写代码去实现也是相当不易的&#xff0c;那我们该如何去获取到的呢&#xff1f;下面我们就来一起看…

系统集成作业——公司网络系统集成设计,总公司、分公司地跨两个不同城市。

一 实验需求 完成公司网络系统集成设计&#xff08;2000台电脑&#xff09;&#xff0c;总公司、分公司地跨两个不同城市 二实验分析 本次实验继续建立在实验三的基础之上&#xff0c;对其升级改造为地跨不同城市的总公司和分公司的大型局域网网建设。 实验三配置点击链接&…

经营软件公司五年,从外包到SaaS的踩坑笔记

文章目录摘要开公司的两个误区关于管理关于合作关于SaaS其他经验大和强是两码事。大不是目的&#xff0c;强才是。小步试错、慢慢迭代不要掉入流量陷阱摘要 经营公司已有五年&#xff0c;经历了三年的疫情停滞&#xff0c;现在正在转型为一家SaaS公司。虽然曾经迷茫过&#xf…

包装类,String,String的方法

针对八种基本数据类型相应的引用类型-----包装类。有了类的特点&#xff0c;就可以调用类中的方法 基本数据类型包装类booleanBoolean char CharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDouble Byte---Double类的父类是Number 关系图 拆箱&#xff0c;装箱 …

如何微调Segment Anything Model

文章目录什么是SAM&#xff1f;什么是模型微调&#xff1f;为什么要微调模型&#xff1f;如何微调 Segment Anything 模型背景与架构创建自定义数据集输入数据预处理训练设置循环训练保存检查点并从中启动模型下游应用程序的微调随着 Meta 上周发布的 Segment Anything Model (…

DAY 33 shell编程 常用的文本命令

sort命令####排序 sort将文件的每一行作为一个单位相互比较&#xff0c;比较原则是从首字符向后依次按ASCII码进行比较&#xff0c;最后将它们按升序输出。&#xff08;以行为单位来排序输出&#xff09; sort [选项] 参数​cat file | sort 选项常用选项&#xff1a; 常用选…

计算机综合题汇总

(数学计算题) 把6个相同的球分到三个不同的学生身上,允许有的学生没有球,请问有多少种不同的方法? C(8,2)=28。 典型的插板问题,直接套公式,C(n+m-1,m-1)。6个球,本身5个空,有同学可以不分,再加3个空,共8个空;插入2个板。 (软件选择题) 软件质量保证是什么? A. 确保…

超外差收音机的制作-电子线路课程设计-实验课

超外差收音机的制作 一、原理部分&#xff1a; 超外差收音机&#xff1a;超外差式收音机是将接收到的不同频率的高频信号全部变成一个固定的中频信号进行放大&#xff0c;因而电路对各种电台信号的放大量基本是相同的&#xff0c;这样可以使中放电路具有优良的频率特性。 超…

Adobe考证

在数字化时代&#xff0c;Adobe软件已成为许多人工作和创造的必备工具。为了证明自己在使用Adobe软件方面的专业能力&#xff0c;许多人选择参加Adobe认证考试并获取Adobe认证证书。 本文将从以下几个方面介绍Adobe考证的相关内容...... 什么是Adobe认证考试&#xff1f; Ado…

我的面试八股(JAVA并发)

重点AQS以及几种锁的底层需要补充&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 程序计数器为什么是线程私有的? 程序计数器主要有下面两个作用&#xff1a; 字节码解释器通过改变程序计数器来依次读取指令&#xff0c;从而实现代码的流程控制&#xff0c…