当前位置: 首页 > news >正文

STSP中用于记录节点和旅行回路的四种数据结构

STSP中用于记录节点和旅行回路的四种数据结构

  • 双链表结构
  • 2-level tree
  • 卫星结构
  • k-level卫星结构树
  • 参考文献

对于TSP是是历史悠久的研究问题,直至现在已经有了很多成熟高效的算法来求解问题。在拥有好的求解算法的同时,优秀的数据结构可以同时大幅提升问题的求解速率,简化问题的求解步骤,下面要介绍的就是关于对称TSP问题(STSP)的四种数据结构,四种结构层层递进,且看慢慢道来。(部分图片来自百度百科,部分图片来自参看文献)

双链表结构

双链表结构可能是简单应用比较多的数据结构
在这里插入图片描述
双链表的结构核心就在于每个节点有记录它的前驱结点和后继节点,我们分别用pre和suc表示,然后依次来链接起所有节点并组成完成的哈密顿回路。

在具有领先性的弹射算法如LKH中,嘴贱但2-opt move需要对链表进行反转,对于双链表结构,反转操作需要平均的O(n)复杂度进行pre和suc的互换,并且每次进行k-opt move的时候都需要进行O(n)的更新。由此,卫星结构就应运而生,在介绍卫星结构之前,再讲一下2-level tree。

2-level tree

2-leve tree在某种程度上解决了双链表结构反转部分旅行的操作的复杂性。下面我们先来看一下它的结构示意图。
在这里插入图片描述
两层树结构是讲部分结点视为一个segment,然后由一个上层结点记录对应的信息,比如上层结点记录自己麾下有几个结点,并记录段的开始和结尾等等。这就像公司里的分层次管理,员工有对应的leader带领。
在上面所述的翻转操作中,上层结点有一个reberse位,当发生翻转时就将那一位置1,这样遍历这一段的结点的时候就可以方向性地选择从那一边开始遍历。
上层结点同时也维护着上层结点之间的联系,有pre和suc等元素,反转操作只需要根据reverse位和O(n)级别地修改上层结点的指针指向即可。

但是问题在于,反转操作可能是跨越段之间的,所以这也是需要解决的一个难点所在。

卫星结构

在这里插入图片描述
上面是卫星结构和双链表的差别示意图

顾名思义,卫星结构是伴随的,也就是卫星结构是两个结点关联起来,同时又和其他结点进行连接,以组成类似双链表的循环结构,但一共有两个独立但又有连接的双层轨道。具体来说就是下面的这张图:
tour的序列是 2941638507
而每个结点在卫星结构中隔一个与下一个结点之间也建立联系
也即是,2连4,9连1,4连6,1连3,6连8,3连5,8连0,5连7,0连2,7连9
这样做的好处是,可以在常数O(1)内完成翻转操作,这也是卫星结构的精妙之处,也是它为什么可以作为论文发表的原因
在这里插入图片描述
下面是论文中给出的参考示意图
但是最关键的地方,确写的是obviously,在没有看源码的情况下,笔者花了一些时间去补上论文中跳过确实最关键的地方,这也是本篇blog的写作的主要目的和原因
在这里插入图片描述
笔者在这里用手推到一下
首先双轨循环结构是1234567的顺序的tour,根据卫星结构隔一个两两连接,以形成原始的黑色笔画出的结构。
当我们要进行2-5的翻转的时候,卫星结构按照蓝色笔所画的进行移动,注意这种移动看着是一个圈,但是在code中是常数级别且关键结点的修改即可。具体来说就是,上面的2-5和下面的4-7进行逆时针翻转。然后其他部分(上下部分)进行直接的替换(上换到下面,下面换到上面)之后的,按照原tour的方向的平移(musk掉逆转的那一部分),就可以得到双轨道都是进行部分翻转之后的结果。
在这里插入图片描述

k-level卫星结构树

而k-level tree的卫星结构树就是结合了卫星结构和2-level tree的优点
当然这也会使得数据结构变得更加复杂,毕竟简单和复杂,效率之间都是有一个权衡的。
下面是结构的示意图,因为是结合前面的各种优点的集合,这里就不再继续赘述了

在参考文献里有理论上的k的选择分析,还有之前数据结构的效率等等更加详细的分析
读者有兴趣可以去下载查看。需要指出的是,目前最常用的可能是2-level tree,至少在现有的弹射算法中,使用的通用结构是2-level tree。当然新的好的数据结构也值得我们去推广和使用。
在这里插入图片描述

参考文献

The Satellite List and New Data Structures for Symmetric Traveling Salesman Problems

相关文章:

STSP中用于记录节点和旅行回路的四种数据结构

STSP中用于记录节点和旅行回路的四种数据结构 双链表结构2-level tree卫星结构k-level卫星结构树参考文献 对于TSP是是历史悠久的研究问题,直至现在已经有了很多成熟高效的算法来求解问题。在拥有好的求解算法的同时,优秀的数据结构可以同时大幅提升问题…...

【Spring】AOP切点表达式

文章目录 1、语法2、通配符3、execution4、within5、annotation6、args7、args8、bean9、this10、target11、target12、within13、表达式组合14、补充 1、语法 动作关键词(访问修饰符 返回值 包名.类/接口名 .方法名(参数)异常名) 举例: execution(public User c…...

设计模式再探——代理模式

目录 一、背景介绍二、思路&方案三、过程1.代理模式简介2.代理模式的类图3.代理模式代码4.代理模式还可以优化的地方5.代理模式的项目实战,优化后(只加了泛型方式,使用CGLIB的代理) 四、总结五、升华 一、背景介绍 最近在做产品过程中对于日志的统一…...

MySQL日志——查询日志

1.查询日志 show variables like %general%;修改mysql的配置文件 /etc/my.cnf文件,添加如下内容: #该选项用来开启查询日志,可选值:0或者1;0代表关闭,1代表开启 general_log1 #设置日志的文件名&#xff0…...

Java版本工程行业管理系统源码-专业的工程管理软件-提供一站式服务 em

​ 工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…...

pytorch的CrossEntropyLoss交叉熵损失函数默认是平均值

pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的,即多个样本输入后获取的是一个均值标量,而不是样本大小的向量。 net nn.Linear(4, 2) loss nn.CrossEntropyLoss() X torch.rand(10, 4) y torch.ones(10, dt…...

【力扣】206. 反转链表 <链表指针>

【力扣】206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2 输入:head [1,2] 输出:[2,1] 示例 3 输入&#xff1a…...

Java包装类(自动拆装箱)

包装类 为什么要有包装类? 在面向对象中,“一切皆为对象”,但是基本数据类型不符合这一理念,为了让基本类型也称为对象 便于类型之间的转化,数据类型之间的基本操作 转换方式: int ——> Integer ne…...

使用Golang反射技术实现一套有默认值的配置解析库

在实际开发中,我们往往会给一个逻辑设计一套配置文件,用于根据不同环境加载不同配置。 比如生产环境和测试环境数据库的地址不一样,我们就需要在配置文件中设置不同的值。但是配置文件中又有一些相同值的配置项,比如数据库的名称等…...

数据安全能力框架模型-详细解读(二)

数据安全能力框架构成 1) 数据安全治理 管理视角:从组织制度流程上提出要求,由于数据在各业务系统之间流转,需要设立高级管理层参与决策的数据安全管理部门,统筹和规划多部门之间的工作;需要设立跨组织的…...

【BASH】回顾与知识点梳理(八)

【BASH】回顾与知识点梳理 八 八. 正则表达式(正规表示法)8.1 什么是正规表示法8.2 基础正规表示法语系对正规表示法的影响grep 的一些进阶选项基础正规表示法练习例题一、搜寻特定字符串例题二、利用中括号 [] 来搜寻集合字符例题三、行首与行尾字符 ^ …...

rust报错“Utf8Error { valid_up_to: 1, error_len: Some(1) } }”

这个错误通常表示在尝试将字节序列解码为UTF-8字符时出现问题。它指出在索引1处发现了无效的字节序列,并且错误的长度为1个字节。 要解决这个问题,你可以尝试以下几种方法: 检查你的输入数据是否包含无效的字节序列。你可以使用一些调试工具…...

【Linux】节点之间配置免密登录

文章目录 1、实现2、原理3、SSH的理解 1、实现 先写实现,解决问题后有兴趣的自己看后面的原理。 以实现节点A(主)免密登录到节点B(从)为例:(注意例子里节点B被登录) 步骤一&#xf…...

【13】STM32·HAL库-正点原子SYSTEM文件夹 | SysTick工作原理、寄存器介绍 | printf函数使用、重定向

目录 1.sys文件夹介绍(掌握)2.deley文件夹介绍(掌握)2.1deley文件夹函数简介2.2SysTick工作原理2.3SysTick寄存器介绍2.4delay_init()函数(F1)2.5delay_us()函数(F1)2.6delay_ms()函…...

ansible配置文件案例

案例一 控制主机上的普通用户控制受控主机 控制端1台,受控端两台 1.将两台受控主机添加到/etc/hosts文件中 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhos…...

【大数据】Flink 从入门到实践(一):初步介绍

Flink 从入门到实践(一):初步介绍 Apache Flink 是一个框架和分布式处理引擎,用于在 无边界 和 有边界 数据流上进行 有状态 的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。 1.架构 1…...

大数据课程F4——HIve的其他操作

文章作者邮箱:yugongshiyesina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握HIve的join; ⚪ 掌握HIve的查询和排序 ⚪ 掌握HIve的beeline ⚪ 掌握HIve的文件格式 ⚪ 掌握HIve的基本架构 ⚪ 掌握HIve的优化; 一、jo…...

React Native详解和代码实例

目录 一、React Native 的主要特点二、React Native 的工作原理三、React Native 的优缺点四、React Native 代码示例 React Native 是一个用于构建原生移动应用程序的 JavaScript 框架。它使用 React 库,允许开发者使用 JavaScript 编写应用程序的 UI 和逻辑&#…...

CAD随机球体颗粒过渡区3D插件

插件介绍 CAD随机球体颗粒&过渡区3D插件可用于在AutoCAD软件内生成随机分布的球体及球体外侧过渡区部件,适用于科研绘图、有限元建模如混凝土细观、颗粒增强复合材料、随机三维骨料及过渡区等方面的应用。 插件可指定的参数有模型的长、宽、高;球…...

【项目 进程12】2.25 sigprocmask函数使用 2.26sigaction信号捕捉函数 2.27SIGCHILD信号

文章目录 2.25 sigprocmask函数使用2.26 sigaction信号捕捉函数内核实现信号捕捉的过程信号捕捉特性 2.27SIGCHILD信号 2.25 sigprocmask函数使用 阻塞信号集有时称作信号掩码。 联想:fcntl函数可以修改fd属性。 ./sigprocmask & //将程序设置为后台运行&…...

Stable Yogi Leather-Dress-Collection惊艳案例:皮衣与配饰(腰带/手套/靴子)协调生成

Stable Yogi Leather-Dress-Collection惊艳案例:皮衣与配饰(腰带/手套/靴子)协调生成 想象一下,你是一位动漫角色设计师,需要为角色设计一套完整的皮衣穿搭。你脑海中已经有了皮衣的款式,但如何让它与腰带…...

Arduino Mega2560 Bootloader烧录失败?排查这5个常见问题(附解决方案)

Arduino Mega2560 Bootloader烧录失败?5个关键故障点与深度修复指南 当黄灯不再闪烁、IDE报错信息铺满屏幕、端口列表空空如也——这些红色警报意味着你的Bootloader烧录流程可能正在某个隐蔽环节崩溃。作为经历过137次烧录失败的老兵,我总结出这套实战派…...

【实战】从零推导引导滤波:数学建模与Python高效实现

1. 为什么需要引导滤波? 在图像处理领域,滤波是最基础也最常用的操作之一。传统的高斯滤波就像用喷雾器给照片喷水雾,虽然能模糊噪点,但也会让清晰的边缘变得模糊。这就像用橡皮擦擦掉铅笔线条时,不小心把重要的轮廓线…...

Cellpose-SAM:重新定义生物医学图像分割的技术范式与零参数革命

Cellpose-SAM:重新定义生物医学图像分割的技术范式与零参数革命 【免费下载链接】cellpose a generalist algorithm for cellular segmentation with human-in-the-loop capabilities 项目地址: https://gitcode.com/gh_mirrors/ce/cellpose 在生物医学研究领…...

Windows Defender移除工具终极指南:3分钟彻底解决系统性能瓶颈

Windows Defender移除工具终极指南:3分钟彻底解决系统性能瓶颈 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mir…...

3个关键步骤+5分钟上手:PPTist在线演示文稿工具完全指南

3个关键步骤5分钟上手:PPTist在线演示文稿工具完全指南 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing f…...

AsrTools终极指南:5分钟快速上手免费语音转文字工具

AsrTools终极指南:5分钟快速上手免费语音转文字工具 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate te…...

macOS窗口管理终极指南:用Topit一键置顶解决多窗口混乱难题

macOS窗口管理终极指南:用Topit一键置顶解决多窗口混乱难题 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 你是否曾在工作中被多个重叠的窗口搞得焦…...

保姆级教程:在MMSegmentation框架下复现HRNetV2+OCR语义分割(附完整代码与调试技巧)

从零实现HRNetV2OCR语义分割:MMSegmentation实战指南与深度调优 当你在GitHub上搜索"HRNetV2 OCR implementation"时,会发现大多数仓库要么只有论文复现的片段代码,要么存在各种环境兼容性问题。作为计算机视觉领域经典的语义分割方…...

蒸馏后的AIAgent响应延迟仍超800ms?这5个被92%团队忽略的推理缓存协同优化点必须立即修复

第一章:蒸馏后的AIAgent响应延迟仍超800ms?这5个被92%团队忽略的推理缓存协同优化点必须立即修复 2026奇点智能技术大会(https://ml-summit.org) 当模型蒸馏已将参数量压缩47%,但端到端P99延迟仍卡在823ms,问题往往不在模型本身—…...