粒子群算法(PSO算法)求解实例---旅行商问题 (TSP)

目录

  • 一、采用PSO求解 (TSP)
  • 二、 旅行商问题
    • 2.1 实际例子:求解 6 个城市的 TSP
    • 2.2 ==**求解该问题的代码**==
    • 2.3 代码运行过程截屏
    • 2.4 代码运行结果截屏(后续和其他算法进行对比)
  • 三、 ==如何修改代码?==
    • 3.1 减少城市坐标,如下:
    • 3.2 增加城市坐标,如下:
  • 四、PSO粒子群算法原理
    • 4.1 PSO算法定义
    • 4.2 PSO算法的基本思想
    • 4.3 PSO算法的工作原理
    • 4.4 PSO算法的参数
    • 4.5 PSO算法的优缺点
      • 4.5.1 优点
      • 4.5.2 缺点
    • 4.6 PSO算法的应用场景

一、采用PSO求解 (TSP)

求解代码在文中,后续会出其他算法求解TSP问题,你们参加数学建模竞赛只需要会改代码即可。

用来对比此专栏的遗传算法(GA算法)求解实例—旅行商问题 (TSP),注意每次运行PSO算法得到的结果可能不太一样。

我知道大家对原理性的东西不感兴趣,我把原理性的东西放在后面,大家如果需要写数模论文可以拿去,但是记得需要改一改,要不然查重过不去。

二、 旅行商问题

2.1 实际例子:求解 6 个城市的 TSP

假设有 6 个城市,其坐标如下:

城市X 坐标Y 坐标
01020
13040
22010
34030
41010
55020

目标是找到一个经过所有城市且总距离最短的路径。

2.2 求解该问题的代码

import numpy as np
import random# 定义城市坐标
cities = np.array([[10, 20],[30, 40],[20, 10],[40, 30],[10, 10],[50, 20]
])# 计算两城市之间的欧几里得距离
def calculate_distance(city1, city2):return np.sqrt(np.sum((city1 - city2) ** 2))# 计算总旅行距离
def total_distance(path):distance = 0for i in range(len(path) - 1):distance += calculate_distance(cities[path[i]], cities[path[i + 1]])distance += calculate_distance(cities[path[-1]], cities[path[0]])  # 回到起点return distance# 粒子群优化算法主函数
def pso_tsp(cities, num_particles=30, max_iter=500, w=0.5, c1=1.5, c2=1.5):num_cities = len(cities)# 初始化粒子群particles = [np.random.permutation(num_cities).tolist() for _ in range(num_particles)]velocities = [random.sample(range(num_cities), 2) for _ in range(num_particles)]  # 初始化每个粒子的速度为两两交换# 初始化每个粒子的历史最佳位置和全局最佳位置p_best = particles.copy()p_best_scores = [total_distance(p) for p in particles]g_best = p_best[np.argmin(p_best_scores)]g_best_score = min(p_best_scores)for iteration in range(max_iter):for i in range(num_particles):# 更新每个粒子的速度r1, r2 = random.random(), random.random()swap_prob = w * np.array(velocities[i]) \+ c1 * r1 * np.random.randint(0, num_cities, size=2) \+ c2 * r2 * np.random.randint(0, num_cities, size=2)# 随机选择两个位置进行交换操作swap_idx = np.argsort(swap_prob)[:2]particles[i][swap_idx[0]], particles[i][swap_idx[1]] = particles[i][swap_idx[1]], particles[i][swap_idx[0]]# 评估新位置current_distance = total_distance(particles[i])# 更新历史最佳位置if current_distance < p_best_scores[i]:p_best[i] = particles[i].copy()p_best_scores[i] = current_distance# 更新全局最佳位置if current_distance < g_best_score:g_best = particles[i].copy()g_best_score = current_distanceprint(f"Iteration {iteration} Best distance: {g_best_score:.2f}")return g_best, g_best_score# 运行粒子群优化算法
best_path, best_distance = pso_tsp(cities)
print("Best path:", best_path)
print("Best distance:", best_distance)

2.3 代码运行过程截屏

在这里插入图片描述

2.4 代码运行结果截屏(后续和其他算法进行对比)

在这里插入图片描述

三、 如何修改代码?

这一部分是重中之重,大家参加数学建模肯定是想跑出自己的结果,所以大家只需要把自己遇到的数学问题,抽象成TSP问题,然后修改代码的城市坐标,然后运行即可。

# 定义城市坐标
cities = np.array([[10, 20],[30, 40],[20, 10],[40, 30],[10, 10],[50, 20]
])

3.1 减少城市坐标,如下:

# 定义城市坐标
cities = np.array([[10, 20],[30, 40],[20, 10],[40, 30]
])

3.2 增加城市坐标,如下:

# 定义城市坐标
cities = np.array([[10, 20],[30, 40],[20, 10],[40, 30],[30, 40],[20, 10],[10, 10],[50, 20]
])

四、PSO粒子群算法原理

4.1 PSO算法定义

粒子群优化算法 (Particle Swarm Optimization, PSO) 是一种基于群体智能的优化算法,由 Kennedy 和 Eberhart 在 1995 年提出。PSO 模拟了鸟群或鱼群的群体行为,通过个体之间的信息共享和相互学习,搜索解空间以找到问题的最优解。PSO 被广泛应用于函数优化、机器学习、神经网络训练、路径规划等领域。

4.2 PSO算法的基本思想

粒子群优化算法的核心思想是利用群体中各个“粒子”的位置和速度来表示可能的解,粒子在搜索空间中移动,受其自身经验(历史最优位置)和群体经验(全局最优位置)的影响。在迭代过程中,每个粒子根据当前的速度、历史最佳位置和全局最佳位置来调整自己的位置,从而逐步逼近最优解。

4.3 PSO算法的工作原理

  1. 初始化种群:随机初始化一组粒子的位置和速度,每个粒子代表问题的一个潜在解。

  2. 计算适应度值:根据适应度函数(目标函数)计算每个粒子的适应度值,评价粒子的优劣。

  3. 更新个体最佳位置和全局最佳位置

    • 每个粒子记录其迄今为止找到的最佳位置(个体最佳位置 p_best)。
    • 记录群体中的最佳位置(全局最佳位置 g_best)。
  4. 更新速度和位置

    • 粒子的速度根据以下公式更新:
      v i ( t + 1 ) = w ⋅ v i ( t ) + c 1 ⋅ r 1 ⋅ ( p i _ b e s t − x i ( t ) ) + c 2 ⋅ r 2 ⋅ ( g b e s t − x i ( t ) ) v_{i}(t+1) = w \cdot v_{i}(t) + c_{1} \cdot r_{1} \cdot (p_{i\_best} - x_{i}(t)) + c_{2} \cdot r_{2} \cdot (g_{best} - x_{i}(t)) vi(t+1)=wvi(t)+c1r1(pi_bestxi(t))+c2r2(gbestxi(t))
      其中:
      • v i ( t ) v_{i}(t) vi(t) 表示粒子 (i) 在第 (t) 次迭代的速度。
      • x i ( t ) x_{i}(t) xi(t) 表示粒子 (i) 在第 (t) 次迭代的位置。
      • w w w 是惯性权重,控制粒子保持其当前速度的趋势。
      • c 1 , c 2 c_{1}, c_{2} c1,c2 是加速度常数,分别表示粒子向个体最佳位置和全局最佳位置移动的加速因子。
      • r 1 , r 2 r_{1}, r_{2} r1,r2 是介于 0 和 1 之间的随机数,增加搜索的随机性。
    • 粒子的位置根据以下公式更新:
      x i ( t + 1 ) = x i ( t ) + v i ( t + 1 ) x_{i}(t+1) = x_{i}(t) + v_{i}(t+1) xi(t+1)=xi(t)+vi(t+1)
  5. 重复迭代:重复步骤 2-4,直到满足终止条件(如达到最大迭代次数或找到满意解)。

4.4 PSO算法的参数

  • 惯性权重(w):控制粒子当前速度的影响,较大的惯性权重有助于全局搜索,较小的惯性权重有助于局部搜索。
  • 个体学习因子(c1):控制粒子向其自身历史最佳位置学习的程度。
  • 群体学习因子(c2):控制粒子向全局最佳位置学习的程度。
  • 种群大小:粒子的数量,通常根据问题的复杂度来选择。
  • 最大迭代次数:算法运行的最大迭代次数。

4.5 PSO算法的优缺点

4.5.1 优点

  • 简单易懂:PSO 算法相对简单,易于实现,具有较少的参数需要调整。
  • 全局搜索能力强:通过个体和群体的合作,能够有效地避免局部最优解,具有较强的全局搜索能力。
  • 计算效率高:PSO 计算过程中不需要复杂的数学运算,计算效率高,适合解决大规模问题。

4.5.2 缺点

  • 易陷入局部最优:在多峰值或复杂的搜索空间中,PSO 可能会陷入局部最优。
  • 收敛速度慢:对于某些复杂问题,收敛速度可能较慢。
  • 参数敏感:PSO 算法对参数(如惯性权重、个体学习因子、群体学习因子等)较为敏感,需要合理调节以取得较好的效果。

4.6 PSO算法的应用场景

  • 函数优化:求解复杂数学函数的最优解。
  • 机器学习:如用于神经网络的权重优化、支持向量机的参数选择等。
  • 路径规划:机器人和无人机的路径优化。
  • 工程优化:结构设计优化、能源分配优化等。
  • 图像处理:图像分割、边缘检测等。

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

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

相关文章

Porcupine - 语音关键词唤醒引擎

文章目录 一、关于 Porcupine特点用例尝试一下 语言支持性能 二、Demo1、Python Demo2、iOS DemoBackgroundService DemoForegroundApp Demo 3、网页 Demo3.1 Vanilla JavaScript 和 HTML3.2 Vue Demos 三、SDK - Python 一、关于 Porcupine Porcupine 是一个高度准确和轻量级…

【软件测试】--xswitch将请求代理到测试桩

背景 在做软件测试的过程中&#xff0c;经常会遇见需要后端返回特定的响应数据&#xff0c;这个时候就需要用到测试桩&#xff0c;进行mock测试。 测试工程师在本地模拟后端返回数据时&#xff0c;需要将前端请求数据代理到本地&#xff0c;本文介绍xswitch插件代理请求到flas…

基于环境音频和振动数据的人类活动识别

这篇论文的标题是《Recognition of human activities based on ambient audio and vibration data》&#xff0c;作者是 Marcel Koch 等人&#xff0c;发表在 IEEE Access 期刊上。论文提出了一种基于环境音频和振动数据的分布式多传感器系统&#xff0c;用于识别人类活动。以下…

Anaconda安装并配置Python环境

背景概述 Anaconda&#xff0c;中文大蟒蛇&#xff0c;是一个开源的Anaconda是专注于数据分析的Python发行版本&#xff0c;包含了conda、Python等190多个科学包及其依赖项。 Anaconda就是可以便捷获取包且对包能够进行管理&#xff0c;包括了python和很多常见的软件库和一个…

web基础之RCE

简介&#xff1a;RCE称为远程代码执行漏洞&#xff1b;是互联网的一种安全漏洞&#xff1b;攻击者可以直接向后台服务器远程注入操作系统命令&#xff1b;从而操控后台系统&#xff1b;也是CTF比较常考的一个方面 1、eval执行 &#xff08;1&#xff09;分析后端代码&#xf…

什么是API网关(API Gateway)?

1. 什么是API网关&#xff08;API Gateway&#xff09;&#xff1f; 在微服务体系结构中&#xff0c;客户端可能与多个前端服务进行交互。 API 网关位于客户端与服务之间。 它充当反向代理&#xff0c;将来自客户端的请求路由到服务。 它还可以执行各种横切任务&#xff0c;例…

机器学习 vs 深度学习:深入浅出解析两者的区别

在当今科技飞速发展的时代&#xff0c;**机器学习&#xff08;Machine Learning&#xff09;和深度学习&#xff08;Deep Learning&#xff09;**成为了人工智能&#xff08;AI&#xff09;领域的热门话题。无论你是技术专家、学生&#xff0c;还是对AI感兴趣的普通读者&#x…

Linux-mysql5.7-mysql8.0安装包下载及安装教程,二合一

一、安装包下载 1、手动下载 MySQL :: Download MySQL Community Server 2、wegt下载 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 登录自己的liunx &#xff0c;复制上面的命令下载。 二、手动安装 1、上传压缩包到…

关于less的基本使用

1、介绍及概述 1.1、解释 less 是方便开发人员书写CSS的一门预处理语言。浏览器只认识html /css /js格式的文件&#xff0c;所以直接引入.less文件&#xff0c;没有任何的效果&#xff0c;需要把less文件转换成css文件 1.2、概述 CSS弊端&#xff1a; 没有逻辑性、变量、函…

php语言基本语法

HP&#xff08;Hypertext Preprocessor&#xff09;是一种广泛使用的开源服务器端脚本语言&#xff0c;特别适合于Web开发。 它能够嵌入到HTML中&#xff0c;执行动态网页内容。 PHP的一些基本语法元素&#xff1a; 1. 基本结构 PHP代码通常嵌入到HTML中&#xff0c;以<…

【三大运营商】大数据平台体系架构【顶层规划设计】

在国内运营商&#xff08;如中国移动、中国联通、中国电信&#xff09;的大数据平台建设中&#xff0c;顶层规划设计至关重要。以下是针对三大运营商为例【如电信】的大数据平台体系架构的顶层规划设计方案&#xff0c;涵盖整体架构、关键组件、数据管理、应用场景等方面。 1. …

Python 解析 JSON 数据

1、有如下 JSON 数据&#xff0c;存放在 data.json 文件&#xff1a; [{"id":1, "name": "小王", "gender": "male", "score": 96.8}, {"id":2, "name": "小婷", "gender&qu…

[网络]https的概念及加密过程

文章目录 一. HTTPS二. https加密过程 一. HTTPS https本质上就是http的基础上增加了一个加密层, 抛开加密之后, 剩下的就是个http是一样的 s > SSL HTTPS HTTP SSL 这个过程, 涉及到密码学的几个核心概念 明文 要传输的真正意思是啥 2)密文 加密之后得到的数据 这个密文…

使用knn算法对iris数据集进行分类

程序功能 使用 scikit-learn 库中的鸢尾花数据集&#xff08;Iris dataset&#xff09;&#xff0c;并基于 KNN&#xff08;K-Nearest Neighbors&#xff0c;K近邻&#xff09;算法进行分类&#xff0c;最后评估模型的准确率。 代码 from sklearn import datasets# 加载鸢尾…

SpringBoot+vue集成sm国密加密解密

文章目录 前言认识SM2后端工具类实现引入依赖代码实现工具类&#xff1a;SM2Util 单元测试案例1&#xff1a;生成服务端公钥、私钥&#xff0c;前端js公钥、私钥案例2&#xff1a;客户端加密&#xff0c;服务端完成解密案例3&#xff1a;服务端进行加密&#xff08;可用于后面前…

Modelsim SE-64 2020.4关闭优化

一、问题起源 本人由于之前一直使用AMD的板子&#xff0c;使用vivado自带仿真器进行功能仿真&#xff0c;由于自带的页面简洁和仿真时间自己还都可以接受就没有什么modelsim联合仿真&#xff0c;又因准备FPGA大赛的国产FPGA易灵思的题目&#xff0c;使用Efinity&#xff0b;Mod…

AI助力遥感影像智能分析计算,基于高精度YOLOv5全系列参数【n/s/m/l/x】模型开发构建卫星遥感拍摄场景下地面建筑物智能化分割检测识别系统

随着科技的飞速发展&#xff0c;卫星遥感技术已成为获取地球表面信息的重要手段之一。卫星遥感图像以其覆盖范围广、数据量大、信息丰富等特点&#xff0c;在环境监测、城市规划、灾害评估等多个领域发挥着不可替代的作用。然而&#xff0c;面对海量的卫星图像数据&#xff0c;…

磁盘写入缓存区太大,如何清理C盘缓存

针对“磁盘写入缓存区太大&#xff0c;如何清理C盘缓存”的问题&#xff0c;我们可以从多个角度进行专业解答。首先&#xff0c;需要明确的是&#xff0c;“磁盘写入缓存区太大”这一表述可能涉及硬盘缓存的设置或系统缓存管理&#xff0c;但通常用户面对的问题更多是关于C盘空…

Json和Http专栏

json 理论 什么是JSON? 规则 被大括号包括的是JSON对象,被中括号包括的是JSON数组. JSON数组JSON对象 实验 构建JSON 用代码实现如下json内容: //构建JSON void WirteJson() {QJsonObject rootObject;//1.插入name字段rootObject.insert("name","china&quo…

KV260 进阶开发(PYNQ驱动开发+Pixel Pack)

目录 1. 简介 2. PixelPacker HLS 实现 2.1 PixelPacker HLS 源码 2.2 PixelPacker 功能简介 2.3 头文件介绍 2.4 启动间隔 II 2.5 Case V24 片段解释 3. PixelPacker Py 驱动 3.1 PixelPacker Py 源码 3.2 PixelPacker 类详解 3.3 property 装饰器 3.4 操作寄存器…