Ruby on rails 用ruby解决旅行推销员问题(50个地点)

Ruby on rails 用ruby解决旅行推销员问题(50个地点),ruby-on-rails,ruby,algorithm,google-maps,traveling-salesman,Ruby On Rails,Ruby,Algorithm,Google Maps,Traveling Salesman,我在一家快递公司工作。我们目前通过“手工”解决了50多个地点的路线问题 我一直在考虑使用谷歌地图API来解决这个问题,但我读到有24分的限制 目前,我们在服务器中使用rails,因此我考虑使用ruby脚本来获取50多个位置的坐标并输出合理的解决方案 你会用什么算法来解决这个问题 Ruby是解决这类问题的好编程语言吗 您知道现有的ruby脚本吗?其中一个优化的解决方案是使用动态编程,但仍然非常昂贵的O(2**n),这是不太可行的,除非您使用一些集群和分布式计算,否则ruby或单服务器对您将不会非常

我在一家快递公司工作。我们目前通过“手工”解决了50多个地点的路线问题

我一直在考虑使用谷歌地图API来解决这个问题,但我读到有24分的限制

目前,我们在服务器中使用rails,因此我考虑使用ruby脚本来获取50多个位置的坐标并输出合理的解决方案

你会用什么算法来解决这个问题

Ruby是解决这类问题的好编程语言吗


您知道现有的ruby脚本吗?

其中一个优化的解决方案是使用动态编程,但仍然非常昂贵的O(2**n),这是不太可行的,除非您使用一些集群和分布式计算,否则ruby或单服务器对您将不会非常有用

我建议您提出一个贪婪的标准,而不是使用DP或暴力,这将更容易实现

一旦你的程序结束,你可以做一些记忆,并将结果存储在某个地方供以后查找,这也可以为你节省一些周期

在代码方面,您需要实现具有权重的顶点和边


ie:具有带权重的边的顶点类,递归。而不是将填充数据的图形类

这可能就是您正在寻找的:

警告:

这个网站被firefox标记为攻击网站,但我似乎不是。事实上,我以前用过它,没有问题

[检查URL的修订历史记录]

RubyQuike似乎已关闭(已关闭一段时间),但您仍可以查看WayBack machine和archive.org以查看该页面:
这里有两个技巧:
1:将相对靠近的位置聚集到一个图中,并将这些位置转换为主图中的单个节点。这让你不用做太多的工作就可以变得贪婪。
2:使用近似算法。
我最喜欢的是双音旅行。它们很容易被破解。
请参阅更新


让我去找一个红宝石的。我找不到的不仅仅是有效率问题的

更新

在您的情况下,最小生成树攻击应该是有效的。我想不出你们的城市会不会遇到三角不平等。这意味着应该有一种相对快速而体面的近似。特别是如果距离是欧几里德的,我想它一定是。

即使是另一个答案中提到的DP解,也需要O(10^15)运算。所以你必须考虑近似解,这可能是可以接受的,因为你现在是用手做的。查看

如果您希望算法产生的解决方案的成本在最佳值的3/2以内,那么您需要使用Christofides算法。蚁群算法和遗传算法没有保证的成本。

我研究了使用元启发式算法(如蚁群优化)来解决Bays29(29城市)问题的TSP问题,它在很短的时间内为我提供了接近最优的解。您可以潜在地使用相同的

不过,我是用Java编写的,我将把它链接到这里,因为我目前正在开发ruby的一个端口: 爪哇: 鲁比:(不完整) 这是它解决的数据集:


请记住,我使用的是每个城市之间的欧几里德距离,即直线距离,考虑到道路和城市地图等,我认为这在现实生活中并不理想。但这可能是一个很好的起点:)

…你当然意识到这是最难解决的问题之一,对吗?没有很好的答案?仍然有合理的解决方案,但只是确保你知道它们不会很好。是的。。。我不是在寻找“最佳”解决方案。。。一个合理的做法是:)我加上了“旅行推销员”的标签。你有没有试着看一下标签中的其他问题?澄清一下:50个位置有多少用户/司机/销售人员?它是否需要实时运行,或者是否可以安排在夜间运行-以便在上午获得解决方案公平地说,我只是从服务器负载的角度问这个问题。这是关于旅行推销员和农民的50个女儿的老问题吗?暴力手段被认为是不切实际的,超过20分。对于50个,他必须尝试阶乘(50!)排列——每个销售员大约=30414093201713378043612608166064768844377641568960512000000000!特别是从欧几里德TSP小节中链接到的PTA,或在中描述的PTA(更容易理解的描述可在中找到)。它为您提供了一个多时间O(1+1/ε)近似算法,用于您喜欢的任何ε(当然,要小心指数随1/ε增长)!您建议的URL指向可以下载的多个解决方案。。。我能够调整其中一个解决方案的代码(来自Joseph Seaton)以满足我的需要。再次感谢您指向该网站:)我设法在不到10秒内找到了一个合理的解决方案……非常欢迎您。顺便说一句——我强烈建议您探索并尝试解决其中的一些问题——这将帮助您成为一名更好的ruby程序员。当我有时间的时候,我试着每周做一道题。