【QuikGraph】TSP旅行商问题变体之不返回起点

1、问题分析

目的:在旅行商问题的基础上,无需返回起点。相当于找到一条最短路径,能够遍历所有的顶点。起点和终点都是动态计算出来的,不是提前固定的。

这个问题也称为为计算“最短的哈密尔顿路径”。

2、解决方案

出处:What is the problem name for Traveling salesman problem(TSP) without considering going back to starting point?

解决方案1(起点终点都不提前固定)

我在这本书中找到了我问题的答案。在计算机和其他数字系统的设计中反复出现的计算机布线问题也是如此。目的是尽量减少电线的总长度。因此,它确实是一条最小长度的哈密顿路径。

这本书建议创建一个虚拟点,其与其他点的距离为0。因此,该问题变成了(n+1)个城市对称TSP。求解后,只需删除虚拟点,然后求解最小长度哈密顿路径,我们就可以在不返回起点的情况下得到TSP路径。

解决方案2(需要固定起点和终点):

关于起点和终点的问题描述:
当我们通过TSP得到解并删除虚拟节点时,哈密顿路径的起点变为虚拟节点之后的节点,终点变为虚拟点之前的节点?这是正确的吗?此外,如果我们想确定起点,我们如何使用这种技术或其他技术来实现?

回答:
可以通过创建一个虚拟点来固定起点和终点,该虚拟点与起点和终点的距离均为0,与所有其他点的距离为无限。这将需要n次迭代来解决整个问题。请参考:How to fix the start and end points in Travelling Salesmen Problem?。

解决方案3(关于TSP问题的近似值)

如果我理解正确,你想找到最短路径(从一些顶点开始),穿过图中的所有节点,而不访问同一个节点两次。一个更简单的问题是哈密顿路径问题。正如你所说,它问是否存在这样的路径。既然这个问题是NP难的,而且它比你的问题更容易,那么解决你的问题至少是NP难。好吧,这不是真的,因为你的问题不是决策问题。但它所说的是,我们几乎可以肯定,你的问题没有多项式算法。
你可以求助于近似值。这里有一个非常酷的TSP度量近似值:
http://en.wikipedia.org/wiki/Travelling_salesman_problem#Metric_TSP

其他参考

https://or.stackexchange.com/questions/6174/travelling-salesman-problem-variant-without-returning-to-the-starting-point
https://math.stackexchange.com/questions/603540/traveling-salesman-with-pairs-of-cities-without-return-and-with-given-start-and
https://or.stackexchange.com/questions/6174/travelling-salesman-problem-variant-without-returning-to-the-starting-point
https://cs.stackexchange.com/questions/43549/what-tsp-variant-doesnt-return-to-start-point

3、示例代码及示意图

共同的工具方法参考:关于使用QuikGraph库进行TSP求解

主要测试代码:

        public void Test2(){var vertexs = new string[]{"A", "B", "C", "D", "E", "F", "G", "H"};AddVertex("Start");//增加虚拟点foreach (var v in vertexs){AddVertex(v);AddEdge("Start", v, 0);//虚拟点到其他顶点的距离设置为0}AddEdge("A", "B");AddEdge("B", "C");AddEdge("C", "D");AddEdge("C", "E");AddEdge("C", "F", 2);AddEdge("D", "E");AddEdge("F", "E");AddEdge("G", "E", 2);AddEdge("F", "G");AddEdge("H", "G");     var tsp = new TSP<string, EquatableEdge<string>, BidirectionalGraph<string, EquatableEdge<string>>>(_graph, GetWeightsFunc());           tsp.Compute();var r = tsp.ResultPath;if (r == null){Console.WriteLine("无解");return;}//连成一条路径var dict = r.Edges.ToDictionary(x => x.Source, x => x.Target);var start = dict.Keys.First();var cur = start;var pathVertexs = new List<string>();while (dict.TryGetValue(cur, out string next) && next != start){cur = next;pathVertexs.Add(next);}Console.WriteLine($"Path={string.Join("->", pathVertexs)}");Console.WriteLine($"Cost={tsp.BestCost}");}

控制台输出结果:

Path=H->G->F->E->D->C->B->A
Cost=7

输入数据示意图:
在这里插入图片描述
计算结果:
在这里插入图片描述

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

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

相关文章

【无标题】mysql读写分离架构+MyCAT实现读写分离

1、读写分离的目的 数据库负载均衡&#xff1a; 当数据库请求增多时&#xff0c;单例数据库不能够满足业务 需求。需要进行数据库实例的扩容。多台数据库同时相 应请求。也就是说需要对数据库的请求&#xff0c;进行负载均衡 但是由于数据库服务特殊原因&#xff0c;数据库…

【算法速刷(7/100)】LeetCode —— 200.岛屿数量

这题是典型的深搜题&#xff0c;只需要额外记录每个格子是否被搜索过&#xff0c;然后挨个进行陆地的深度搜索即可。&#xff08;如果要使用lambda进行递归&#xff0c;需要显式指出变量的模板类型&#xff0c;不能使用auto推导&#xff09; int numIslands(vector<vector&…

MATLAB基于深度学习的车辆检测系统

如今机器视觉领域深度学习算法已经大行其道&#xff0c;也让人工智能的实现不再那么遥不可及&#xff0c;但是在目标检测领域&#xff0c;让计算机超越人类还需让更多的人参与进来继续努力。如今众多的高校&#xff0c;甚至中小学已经将人工智能纳入了学习科目&#xff0c;这确…

【YOLOv5/v7改进系列】替换Neck为Gold-Yolo特征融合网络

一、导言 Gold-YOLO是一种高效的物体检测模型&#xff0c;它通过一种新的机制——Gather-and-Distribute&#xff08;GD&#xff09;机制来增强多尺度特征融合的能力&#xff0c;从而在保证实时性能的同时提高了检测精度。下面是对Gold-YOLO的主要特点和创新点的概述&#xff…

【C++ 面试 - 基础题】每日 3 题(十八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

Web开发-CSS篇-上

CSS的发展历史 CSS&#xff08;层叠样式表&#xff09;最初由万维网联盟&#xff08;W3C&#xff09;于1996年发布。CSS1是最早的版本&#xff0c;它为网页设计提供了基本的样式功能&#xff0c;如字体、颜色和间距。随着互联网的发展&#xff0c;CSS也不断演进&#xff1a; C…

【低代码开发】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

谷粒商城实战笔记-175~177-商城业务-检索服务-检索查询接口开发

文章目录 一&#xff0c;175-商城业务-检索服务-检索查询参数模型分析抽取二&#xff0c;176-商城业务-检索服务-检索返回结果模型分析抽取三&#xff0c;177-商城业务-检索服务-检索DSL测试-查询部分四&#xff0c;178-商城业务-检索服务-检索DSL测试-聚合部分问题记录解决方案…

RCE之无参数读取文件总结

RCE漏洞(Remote Code|Command Execute)&#xff1a; 是指由于程序中预留了执行代码或者命令的接口&#xff0c;并且提供了给用户使用的界面&#xff0c;导致被黑客利用&#xff0c; 控制服务器。 代码执行漏洞原理&#xff1a; 传入php代码到执行函数的变量&#xff0c;客户端…

IIC 通信协议详解

目录 一、概述二、I2C 详解1、I2C 总线简介2、I2C 协议相关知识2.1 起始位2.2 停止位2.3 数据传输2.4 应答信号2.5 I2C 设备地址格式2.5 I2C 时序图2.5.1 I2C 写时序2.5.2 I2C 读时序2.5.3 单个/多个字节的写入/读取 3、时钟同步和仲裁3.1 时钟同步3.2 时钟仲裁 一、概述 IIC …

Fal.ai Flux 1-Pro/Viva.ai/哩布哩布AI:AI绘图部分免费工具+原图提示词Prompt

目录 #1 找软件 #2 懂提示词 #3 更难的一步&#xff0c;会英文 我个人认为&#xff0c;想要玩文生图&#xff0c;你要会3个步骤&#xff1a; #1 找软件 主流文生图软件&#xff1a;Midjourney、Stable Diffusion、Dall-E 3 巧了&#xff0c;我用的都是小众、免费的画笔工…

【Linux】守护进程:containerd的使用教程

这里写目录标题 前言一. ctr1.1 ctr CLI1.2 ctr 调试 二、 创建 container2.1 进入 NewContainer2.2 ContainerService().Create 前言 介绍了 kubelet 通过 cri 接口和 containerd 交互的过程&#xff0c;containerd 源码分析&#xff1a;启动注册流程 介绍了 containerd 作为…

赶快收藏!全网最佳Set集合详解:HashSet、TreeSet!

先赞后看&#xff0c;Java进阶马上一大半 海外geeksforgeeks网站画了这么一张Set集合的层次结构图&#xff0c;基本把Set集合涉及的常用类关系给标明了。 大家好&#xff0c;我是南哥。 一个Java学习与进阶的领路人&#xff0c;相信对你通关面试、拿下Offer进入心心念念的公司…

arthas使用

1.安装arthas 我的是windows #打开cmd&#xff0c;执行以下命令 &#xff0c;下载jar curl -O https://arthas.aliyun.com/arthas-boot.jar2.启动本地的idea项目 3.进入到jdk的bin文件夹 jdk的配置在“高级系统设置” 进入jdk的bin目录 4.启动arthas 5.arthas使用 trace 类…

Elasticsearch自动补全功能实践与Java API应用

Elasticsearch是一个强大的搜索引擎&#xff0c;它不仅支持全文搜索&#xff0c;还提供了自动补全功能&#xff0c;可以显著提升用户体验。自动补全功能允许用户在输入查询时实时显示建议项&#xff0c;帮助用户快速找到所需信息。本文将介绍如何使用Elasticsearch的RestHighLe…

探索Java Stream API:高效处理集合的利器

文章目录 一、Stream API简介1.1 什么是Stream&#xff1f;1.2 Stream的特点 二、Stream API的基本操作2.1 创建Stream2.2 中间操作2.3 终端操作 三、Stream API的高级应用3.1 并行Stream3.2 复杂数据处理3.3 Stream与Optional 四、最佳实践例子 1: 筛选和映射例子 2: 排序和收…

什么是流批一体?怎样理解流批一体?

目录 一、流式处理与批量处理概述 1.流式处理 2.批量处理 3.流批一体的定义 二、流批一体的关键特点 三、流批一体的技术实现 四、应用场景 五、实施流批一体的考虑因素 流批一体听起来很简单&#xff0c;但内涵却十分复杂。它包含了计算语义、编程模型、API、调度、执行、shuf…

html+css+js网页制作 京东首页官网 ui还原度100%

htmlcssjs网页制作 京东首页官网 ui还原度100% 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 …

微服务系列:Spring Cloud 之 Feign、Ribbon、Hystrix 三者超时时间配置

Feign 自身有超时时间配置 Feign 默认集成的 Ribbon 中也有超时时间配置 假如我们又使用了 Hystrix 来实现熔断降级&#xff0c;Hystrix 自身也有一个超时时间配置 注: spring-cloud-starter-openfeign 低一点的版本中默认集成的有 Hystrix&#xff0c;高版本中又移除了。 …

x264 编码器 SSIM 算法源码分析

SSIM SSIM(Structural Similarity Index)是一种用于衡量两幅图像之间视觉相似度的指标。它不仅考虑了图像的亮度、对比度和饱和度,还考虑了图像的结构信息。SSIM的值介于-1到1之间,值越接近1表示两幅图像越相似。 SSIM是基于以下三个方面来计算的: 亮度(Luminance):比…