Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >六种TSP算法的对比试验

六种TSP算法的对比试验

作者头像
用户1621951
发布于 2021-08-06 05:18:31
发布于 2021-08-06 05:18:31
8.9K0
举报
文章被收录于专栏:数据魔术师数据魔术师

TSP问题相信大家已经不陌生了,它是指假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。

解决TSP问题的算法有很多,在本期推文中,小编将会比较贪心算法动态规划模拟退火禁忌搜索LKH算法以及Concorde求解器的求解效率。

前四种算法都是求解TSP问题中较常见的算法,在往期推文中都已做过介绍,小编就不再赘述啦,想要了解这些算法的小伙伴们可以参考以下推文:

什么是算法?从枚举到贪心再到启发式(上)

干货|十分钟教你用动态规划算法解Travelling Salesman Problem(TSP)问题,附代码……

干货 | 用模拟退火(SA, Simulated Annealing)算法解决旅行商问题

干货|十分钟快速复习禁忌搜索(c++版)

而LKH算法和Concorde求解器对于一些小伙伴来说可能就比较陌生了,小编简单介绍一下:

LKH算法是目前求解 TSP 问题的最有效的启发式算法。其创造者K. Helsgaun 在网站上发布了其算法的完整代码和他自己的研究论文。链接如下:

http://webhotel4.ruc.dk/~keld/research/LKH-3/

Concorde求解器使用的是concorde精确算法,可以求出TSP问题的最优解。它还可以用于求解生物信息中的基因映射,蛋白质功能预测,调度船只等多种问题。世界上能够求解出最优解的最大规模的TSP算例就是由它求解完成的。链接如下:

http://www.math.uwaterloo.ca/tsp/concorde/downloads/downloads.htm

01

LKH与concorde的调用

虽然LKH算法与Concorde求解器是免费开放的,想轻松调用它们也不一件容易的事哦。

Concorde求解器只能读取后缀为.tsp的文件。不过这可难不倒我们。只要新建一个文本文档,将tsp文件所需的相关数据输入,再改变文件后缀就可以生成tsp文件了。格式如下图:

用求解器打开新生成的tsp文件后,点击左上方的“Solve”,这就是concorde求解器求精确解的地方。

除此之外点击“Solve”旁边的“Heuristics”可以调用其他启发式算法求解问题,如LK算法、贪心算法等。

需要注意的是,concorde求解器只接受11个节点及以上的TSP问题的求解,在遇到小于等于10个节点的问题时则无法求解的。

结果如下:

LKH算法的调用可能更复杂一些:除了下载LKH算法以外,小编还找到了一位大神写的LKH的MATLAB接口才成功地调用该算法,接口下载地址(ntnu-arl/LKH_TSP: A set of tools to solve TSP problems using the LKH solver (github.com))

根据指导,下载LKH.exe地址如下:LKH (Keld Helsgaun) (ruc.dk),记住它的存储位置。

新建一个txt文档,填入相关内容后用改变文件后缀的方式转化为par文件(划线处填入读取的文件地址),格式如下:

MATLAB调用该接口的代码如下(将LKH.exe位置在MATLAB代码中赋值给变量LKHdir):

需要注意的是,此接口读取地tsp文件与上文concorde求解器读取地文件格式有所不同,其读取的是节点之间地距离矩阵,详细格式如下图:

运行成功时结果如下图:

02

算法比较

好啦,准备工作基本完成,让我们进入正题。

由于concorde求解器对算例的节点数有一定要求,小编分别取含11、13、15、17、19、21、23、50、100个节点的算例进行试验。

随机生成各个节点的坐标,输出各节点坐标及贪心算法、动态规划、模拟退火和禁忌搜索对同一算例求解所用的时间,将各节点坐标整合并生成相应tsp文件,调用LKH算法和concorde求解器,输出它们解决相应问题所用的时间。(欲下载相关代码,请移步留言区)

对各个数据规模,各算法的求解消耗时间对比如下(纵轴单位:ms ):

动态规划由于数据过大,所以小编单独列了一张图(纵轴单位:ms):

可以发现,当数据规模较小时,六种算法的求解速度几乎没有差别,当数据规模增大时,算法之间的求解速度差别就显而易见了。

其中较为特殊的是贪心算法,它不从整体最优上加以考虑,其所做出的仅是在某种意义上的局部最优解,因此其速度虽然快,但求解正确率却实在不高。

撇开贪心算法不谈,其他算法中速度较优的也许就要数LKH算法了,真不愧是求解tsp问题最牛叉的算法。

Concorde求解器虽然看似花费时间较长,但它求出的是精确解,也就是说,它的正确率可以达到100%。

说到正确率,这里还有一张关于各算法求出最好解的表格:

其中较为特殊的是动态规划算法,由于Java平台限制了数组的最大长度,所以较大的数据动态规划算法就无法计算了。

细心的小伙伴可能已经发现了,此处禁忌搜索表现不佳,其实禁忌搜索是一种思想,算法的效率取决于代码编写者,此处禁忌搜索表现不佳并不意味着,禁忌搜索不如模拟退火等算法。

可以看到,在数据较小的时候动态规划和模拟退火的正确率还算可以接受,而当数据足够大时,LKH算法与concorde精确求解器的威力就显现出来了。

给小伙伴们展示一下500节点时,concorde求解器的求解情况,真的让小编有一种震撼的感觉:

需要说明的是,算法的运行效果与很多因素有关,如设计思路、实现过程、编写语言、计算机的性能等,小编这次只是大致比较了其中一种情况,并不是很严谨。感兴趣的小伙伴也可以自己尝试一下。

REFERENCE

动态规划代码来源:动态规划求解旅行商问题(java实现)_天阑Sir的博客-CSDN博客_java旅行商问题动态规划

禁忌搜索代码来源:禁忌搜索算法的实现_Python_ttphoon的博客-CSDN博客

MATLAB代码来源:用matlab调用迄今为止最强悍的求解旅行商(TSP)的算法-LKH算法 - 知乎 (zhihu.com)

matlab接口下载地址::ntnu-arl/LKH_TSP: A set of tools to solve TSP problems using the LKH solver (github.com)

LKH.exe下载地址:LKH (Keld Helsgaun) (ruc.dk)

欲下载相关代码,请移步留言区

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据魔术师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
我的世界Java版开服教程(Ubuntu)
Linux开服也很简单,内存占用小,推荐使用,下面使用Ubuntu18.04.1演示
Magneto
2022/09/14
6K0
我的世界Java版开服教程(Ubuntu)
在Ubuntu 14.04/14.10上搭建Minecraft Spigot服务器
本文介绍了如何在Ubuntu 14.04 / 14.10上搭建自己的Minecraft服务器,搭建一个让我们可以与朋友远程开黑的私服,甚至是搭建一个几百人的公共服务器。
东心木水
2018/09/05
3.3K0
记ipv6 MineCraft 开服
针对2021年网络特色 MineCraft 开服教程 针对版本 (1.13.2 - 1.16.5) 注意:1.17需要最新的java版本,本教程的java下载地址都是java8,并非最新版本,请移步官网下载。
赤月未咲
2023/03/17
2.9K0
Minecraft反代(跨服)服务端搭建从入门到精通(For BungeeCord & Velocity)
本文旨在通过一站式的教程,教会读者如何对目前市面上流行的反向代理服务端(跨服服务端)进行安装和配置。
HikariLan贺兰星辰
2022/10/27
5.1K0
BukkitNMS开发中蕴含的混淆技术 发布于
Spigot的NMS是对net-minecraft-server包(也是nms缩写的由来)的一个综合性反射工具,即便读者可能不知道Minecraft是什么或者从未参与过Minecraft伺服器的插件开发工作,但我仍会为每一位读者详细介绍这其中所蕴含的一些技术和实现原理。读者需要知道的是:Spigot 更专注于 Minecraft 的插件开发和服务器功能扩展,而不是提供一个完整的企业级应用开发框架,因此虽然它不像Spring那样专业但是两者仍然存在着许多相似性很高的技术原理。
DioxideCN
2023/10/21
5290
Bukkit NMS 开发实践 —— 创建你自己的自定义实体(适用于 1.16.3 – 1.16.5 版本)
NMS 是 net.minecraft.server 包的简写,是 CraftBukkit 服务端及其下游服务端的底层实现,其代码包含 Mojang 发布的 Vanilla 服务端代码和 SpigotMC 添加的、用于与 BukkitAPI 进行交互的代码。在开发者无法借助 BukkitAPI 完成所需要的功能时,开发者我常常使用 NMS 进行开发。NMS 开发是底层行为,同时跨版本兼容性较差,除非必须使用,否则还请尽量使用 BukkitAPI。NMS 仅存在于编译后的服务端内部,不属于 BukkitAPI 内容。各版本的 NMS 包名一般均为 net.minecraft.server.v版_本_R号,如 net.minecraft.server.v1_16_R3。NMS 包内为扁平结构,没有二级包。NMS 包内类名为 Spigot 定义的反混淆名;方法、字段名一部分为 Spigot 定义的反混淆名,一部分为原混淆名;方法参数名一般为原混淆名。本教程旨在教授 Bukkit 开发者以 NMS 使用方法,拓展 Bukkit 开发者的开发视野。
HikariLan贺兰星辰
2022/10/27
1.4K0
如何开一个属于自己的服务器
1.检查电脑 首先,你需要一个64位的电脑获得更好的体验,32位我还没有测试过,但是只支持4GB内存 2.了解运作 客户端(Client)或称为用户端,是指与服务器相对应,为客户提供本地服务的程序 服务器端,从广义上讲,服务器是指网络中能对其它机器提供某些服务的计算机系统(如果一个PC对服务器端外提供ftp服务,也可以叫服务器) 咱们今天讲的是PC端上的我的世界开服,但是你也可以在服务器应用 3.下载所需文件 创建服务器,你需要一个配置良好的服务端,和一个畅通的网络,还有一个高带宽好用且便宜良心的一个端口映
axiomxs
2021/11/26
2K0
【腾讯云的1001种玩法】搭建属于自己的Minecraft服务器
该文章介绍了如何在Minecraft中制作一个简单的腐竹服务器,包括安装Java、配置SSH免密登录、使用Nginx反向代理、配置Docker以及如何使用Kubernetes部署和管理Minecraft服务器。同时,文章还介绍了如何利用流量监控工具来实时查看服务器的网络流量情况,并通过Shell脚本定时清理系统日志文件,以确保服务器安全稳定地运行。
陈润泽
2017/03/03
13.7K3
【腾讯云的1001种玩法】搭建属于自己的Minecraft服务器
我的世界全服点歌插件 | AllMusic Server服务端 / Client客户端
插件地址:[娱乐][BGM]AllMusic——全服点歌插件(2023.6.10更新)[1.12-1.20] – 服务端插件 – Minecraft(我的世界)中文论坛 – (mcbbs.net)由于MCBBS没了,建议上GitHub下载插件:
夜梦星尘
2024/08/20
1.1K0
我的世界全服点歌插件 | AllMusic Server服务端 / Client客户端
我的世界(Minecraft)服务器添加MOD和插件的教程
常见插件服务端有:paper、purpur、spigot、SpongeVanilla、等等
zeruns
2023/03/03
5.8K0
我的世界(Minecraft)服务器添加MOD和插件的教程
搭建属于自己minecraft服务器
  我的世界可以说是一款比较有名的游戏了,在游戏中大家可以自由创造出属于自己的世界。   这里我就来教大家如何搭建属于自己的Minecraft服务器。
xcsoft
2021/07/14
3.2K0
搭建自己的 Minecraft 服务器
服务器默认会对版权进行校验,如果不是使用正版 MC 登陆,会出现 登入失败:无效会话。 需要将服务器中 server.properties 文件中, online-mode 对应值修改为 false。
云游君
2021/05/21
4.6K0
适当愉悦,自建 Minecraft 服务器
本文主要介绍自建 Minecraft 服务器的方法,可以使用提供的公有云服务,Minecraft 对虚拟机配置需求如下:
宋天伦
2020/07/16
7.2K1
适当愉悦,自建 Minecraft 服务器
如何在 Ubuntu 20.04 上搭建 Minecraft (我的世界) 服务器
Minecraft 一直是最流行的游戏之一。它是一个沙盒视频游戏,用户可以体验无限的世界,并且可以构建不同的结构,从简单的房子到高耸的摩天大楼。
雪梦科技
2020/06/28
17.3K1
Minecraft 从安装到入门
MultMc 运行须依赖 Java 运行环境,仅是运行安装 java-jre即可,您可以在 Java官网下载 Java jre,或是在本站资源站下载。
宋天伦
2023/10/18
7540
Minecraft 从安装到入门
如何在Ubuntu上搭建Minecraft服务器
PS:本文撰写前已查询相关法律,本文内容不违反《互联网文化管理暂行规定》,遵守EULA协议,请勿举报。
你在哪里
2018/08/14
11.8K2
如何在Ubuntu上搭建Minecraft服务器
如何在Ubuntu上安装MutliCraft
PS:本文撰写前已查询相关法律,本文内容不违反《互联网文化管理暂行规定》,遵守EULA协议,请勿举报。
宇cccc
2018/08/14
3K0
如何在Ubuntu上安装MutliCraft
Minecraft服务器技术讲解||教你如何从小白到达骨灰--服务器技术讲解
JAR(JavaArchive,Java归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。为J2EE应用程序创建的JAR文件是EAR文件(企业JAR文件)。
用户1300309
2022/01/20
1K0
使用LightHouse Docker基础镜像部署Minecraft服务器
使用TYPE=forge游戏模式时,将mod放置到Docker挂载出的minecraft-data/mods文件夹,重启minecraft容器即可
Sincerely
2022/08/25
1.9K0
如何在Debian上安装MutliCraft
PS:本文撰写前已查询相关法律,本文内容不违反《互联网文化管理暂行规定》,遵守EULA协议,请勿举报。
朝朝
2018/08/14
2.5K0
如何在Debian上安装MutliCraft
推荐阅读
相关推荐
我的世界Java版开服教程(Ubuntu)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档