最邻近方法和最邻近插入法求TSP问题近似解(可视化+代码)

news2024/11/16 17:42:47

摘要:本文总体内容为介绍用最邻近方法(Nearest Neighbor Algorithm) 和最邻近插入法求解旅行商问题(Traveling Saleman Problem,TSP)。同时使用python实现算法,并调用networkx库实现可视化。此文为本人图论课下作业的成品,含金量:无。

关键词: TSP近似解; 最近邻方法;图论水作业

1. 前言

1.1 旅行商问题

旅行商问题,即TSP问题,又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。

用图论的话来说,旅行商问题是在加权完全无向图中,求经过每个结点恰好一次的(边)权和最小的哈密顿回路,又称之为最优哈密顿回路。[1]

若选定出发点,对n个城市进行排列,总共有(n-1)!条哈密顿回路,而一条哈密顿回路可以用相反两个方向来遍历,所以只需检查(n-1)!/2个哈密顿回路,从中找出权和最小的一个。而(n-1)!/2随n的增长而增长得极快,目前又没有一个有效算法来解决旅行商问题,所以解决旅行商问题的实际方法是使用其他方法来获取其近似解。

下用“最邻近方法”与“最邻近插入法”来获得旅行商问题的近似解。

1.2 最邻近方法

该算法的具体流程如下:给定源点作为线路的起点,寻找并加入距离上一次加入线路中顶点(城市)最近的顶点(城市),依次重复直到所有顶点(城市)已经加入线路,最后将源点加入到线路末尾即可。

该法本质是贪心策略(以距离上一次加入的顶点最近的点为策略)在线路中的具体实现,由于贪心算法在复杂问题中未必能得到最优解,因而该方法通常不能得到问题真正的最优路径,但胜在直观和速度较快。

1.3 最邻近插入法

最邻近方法由于所选取的哈密顿回路不同,所产生的近似解也不同,而“最邻近插入法”是对上述方法的改进。该方法的算法流程如下:

(1)假设图中有n个结点,任取图中一点Vi,作回路ViVi,置k=1;

(2)若k=n,则输出回路,否则,转为(3);

(3)在已有回路Ck=V1V2…VkV1之外的结点V-{V1V2…Vk}中,选取与回路Ck最近邻的点u;

(4)将u插入回路Ck的不同位置,可得k条不同回路,从中选取长度最小回路作为新回路。k=k+1, 转(2)。

2. 实验

下面,我们使用python实现1.2,1.3中的算法,并举一例来计算求得旅行商问题的近似解。代码见附录。示例由代码随机产生,如图2.1所示。
在这里插入图片描述

图2.1 带权无向完全图示例

然后我们使用1.2中介绍的最邻近算法来生成TSP问题的近似解。如下图2.2所示,可以看到,所选取的初始出发点不同,所产生的哈密顿回路可能不同。而“最邻近插入法”是对最邻近算法的改进,从而产生一个比较好的结果,如下图2.3所示。可见,不管是任取哪个起点,最邻近插入法的寻找最短哈密顿回路的近似解效果比最邻近算法法好。


图2.2 最邻近算法求TSP问题近似解

在这里插入图片描述
图2.3 最邻近插入算法求TSP问题近似解

参考文献

[1] 张清华.图论及其应用[M].北京:清华大学出版社.2013.

附录:

1.源码链接
2. 挺有意思的一段话
那些知名度很高的好框架估计很多人都会提,答主再提也是重复劳动。而且题主试用之后,估计也确实会觉得它们中的部分或全部“嗯,不错,是挺好。”
然后选择其中一个一直用下去,从此过上了幸福的生活……
可喜可贺…
………
……
呃,不觉得少了点什么?
少吗?哪里少?
好吧,没什么…
……

平淡的生活何尝不是一种至高的幸福,
但是……如果有另一种机会,另一种选择,另一种人生可以经历……当我们老去,我们会不会为当初的选择而后悔?
或许另一种选择没有这么平静,没有这么顺利,可能充满挑战……
但,会不会,那才是生命中独特的一抹色彩?不可取代的重要体验?
因为那不是会让我说出“嗯,不错,是挺好”的东西,
而是……
“我X!!!这也行!!!!原来还可以这么搞啊!!!!!!!”

作者:Makoto Ruu 来源:知乎
链接
个人想法:有些别人提供给你的东西若达不到你想要的要求,那何不尝试着亲自动手打造并雕琢到心满意足。

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

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

相关文章

【若依】前后端分离版本

一、何为框架?若依框架又是什么?具备什么功能? 框架的英文为Framework,带有骨骼,支架的含义。在软件工程中,框架往往被定义为整个或部分系统的可重用设计,是一个可重复使用的设计构件。类似于一…

leetcode1801:积压订单中的订单总数(1.2日每日一题)

迟来的元旦快乐!!! 题目表述: 给你一个二维整数数组 orders ,其中每个 orders[i] [pricei, amounti, orderTypei] 表示有 amounti 笔类型为 orderTypei 、价格为 pricei 的订单。 订单类型 orderTypei 可以分为两种…

电子档案利用安全控制的办法与实现

这篇文章是笔者2015年发表在《保密科学技术》第2期的一篇文章,时隔7年半温习了一遍之后感觉还有一定的可取之处,所以在结合当前档案法律法规相关要求并修改完善其中部分内容之后分享给大家。 引言 INTRODUCTION 21世纪是一个信息化高度发展的时代&#…

网站漏洞与漏洞靶场(DVWA)

数据来源 本文仅用于信息安全学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。 为什么要攻击网站?常见的网站漏洞有哪些? 在互联网中,…

Java安装详细步骤(win10)

一、下载JDK JDK下载地址:Java Archive | Oracle,下图为win10版本 二、安装过程 2.1 以管理员方式运行exe 2.2 更改JDK安装目录和目标文件夹的位置 2.3 安装完成 三、配置环境变量 3.1 快速打开环境变量设置 WinR打开运行对话框,输入…

【计组】CPU并行方案--《深入浅出计算机组成原理》(四)

课程链接:深入浅出计算机组成原理_组成原理_计算机基础-极客时间 一、Superscalar和VLIW 程序的 CPU 执行时间 指令数 CPI Clock Cycle Time CPI 的倒数,又叫作 IPC(Instruction Per Clock),也就是一个时钟周期…

软件测试新手入门必看

随着软件开发行业的日益成熟,软件测试岗位的需求也越来越大。众所周知,IT技术行业一直以来都是高薪岗位的代名词,零基础想要转业的朋友想要进入这个行业,入门软件测试是最佳的途径之一。考虑到大多数软件测试小白对这个行业的一片…

动态规划——树形dp

树形dp 文章目录树形dp概述树形dp 路径问题树的最长路径思路代码树的中心换根DP思路代码数字转换思路代码树形dp 有依赖的背包二叉苹果树思路代码树形dp 状态机没有上司的舞会思路代码战略游戏思路代码皇宫看守思路代码总结概述 树形 DP,即在树上进行的 DP。由于…

springboot常用启动初始化方法

在日常开发时,我们常常需要 在SpringBoot 应用启动时执行某一些逻辑,如下面的场景: 1、获取一些当前环境的配置或变量; 2、连接某些外部系统,读取相关配置和交互; 3、启动初始化多线程(线程池…

Linux 网络编程套接字

目录 一.网络知识 1.网络通信 2.端口号 (1)介绍 (2)端口号和进程ID 3.TCP协议 4.UDP协议 5.网络字节序 二. socket编程接口 1.socket常见API 2.sockaddr结构 (1)sockaddr结构 (2&a…

JavaScript 语句

文章目录JavaScript 语句JavaScript 语句分号 ;JavaScript 代码JavaScript 代码块JavaScript 语句标识符JavaScript 语句 JavaScript 语句向浏览器发出的命令。语句的作用是告诉浏览器该做什么。 JavaScript 语句 JavaScript 语句是发给浏览器的命令。 这些命令的作用是告诉浏…

顶象入选信通院“数字政府建设赋能计划”成员单位

为进一步推动数字政府建设提质增效,由中国信息通信研究院(以下简称“中国信通院”)联合数字政府相关企业、科研机构共同成立“数字政府建设赋能计划”,旨在凝聚各方力量,整合优质资源,开展技术攻关&#xf…

FlinkSQL基本语法和概念

Flink Sql1、简介2、网址3、SQL客户端4、Queries5、Create6、Drop7、Alter8、Insert9、ANALYZE10、Describe11、Explain12、Use13、Show14、Load15、Unload16、Set17、Reset18、Jar19、Windowing TVF19.1、TUMBLE(滚动窗口)19.2、HOP(滑动窗口…

rabbitmq+netcore6 【2】Work Queues:一个生产者两个消费者

文章目录1)准备工作2)新建消费者13)新建消费者24)生产者5)知识点解读1、autoAck: true2、重复声明/前后不一致3、Message durability 消息持久化4、Fair Dispatch 公平调度5、综合以上知识点的代码:官网参考…

Linux的运行级别

Linux的运行级别: Linux系统有7种运行级别(runlevel): 运行级别 0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行运行级别 1:单用户工作状态,root权限,用于系统维护,找回丢失…

少儿Python每日一题(9):约瑟夫环

原题解答 本次的题目如下所示(原题出处:蓝桥杯) 【编程实现】 有n个人围成一个圈,按顺序排好号。然后从第一个人开始报数(从1到3 报数),报到3的人退出圈子,然后继续从1到3报数,直到最后留下一个 人游戏结束,问最后留下的是原来第几号。 输入描述:输入一个正整数n 输…

国际手机号码检查纠正 API 接口

国际手机号码检查纠正 API 接口 有效性检查及智能纠正,遵循 E.164 标准,智能统一格式。 1. 产品功能 智能检测国际手机号码有效性;可根据提供的国家编码参数,判断提供的手机号码是否为该国家有效手机号码;智能纠正提…

场景题:假设10W人突访,你的系统如何做到不 雪崩?

文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

头歌:Ping服务端创建UDP套接字(底部附全关完整答案)

头歌实践教学平台 (educoder.net)在 Ping 的 服务程序中 创建一个使用 UDP 协议的 套接字数据包套接字类型套接字三种类型:流式套接字(SOCK_STREAM),数据包套接字(SOCK_DGRAM)及原始套接字(SOCK_RAW)数据包格式套接字(Datagram So…

JavaSE---多用户网络通信系统

目录 项目开发流程 多用户网络通信系统的架构设计 客户端 界面层 服务层 管理层 服务端 服务层 功能层 管理层 总结 项目开发流程 多用户网络通信系统的架构设计 整体 作为一个可供多个用户使用的通信系统,那么每个用户和其他用户之间的连接必定不是直接…