解决红宝石中的旅行商问题(50多个地点)

时间:2010-11-23 22:01:42

标签: ruby-on-rails ruby algorithm google-maps traveling-salesman

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

我一直在考虑使用Google Maps API来解决这个问题,但我已经知道有24点的限制。

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

您将使用什么算法来解决此问题?

Ruby是一种很好的编程语言来解决这类问题吗?

您知道任何现有的ruby脚本吗?

6 个答案:

答案 0 :(得分:6)

这可能就是你要找的东西:

警告:

这个网站被firefox标记为攻击网站 - 但我似乎不是。事实上我之前没有遇到过问题

[查看网址的修订历史记录]

ruby​​quiz似乎失败了(已经有所下降)但是你仍然可以查看WayBack机器和archive.org来查看该页面: http://web.archive.org/web/20100105132957/http://rubyquiz.com/quiz142.html

答案 1 :(得分:4)

即使使用另一个答案中提到的DP解决方案,这也需要O(10 ^ 15)次操作。因此,您将不得不查看近似解决方案,这些解决方案可能是可接受的,因为您目前正在手动执行这些解决方案。看http://en.wikipedia.org/wiki/Travelling_salesman_problem#Heuristic_and_approximation_algorithms

答案 2 :(得分:2)

以下是一些技巧:
1:相对靠近一个图形的块位置,并将这些位置转换为主图形中的单个节点。这可以让你在没有太多工作的情况下贪婪 2:使用近似算法 2a:我最喜欢的是比特游。他们很容易被黑客攻击。
请参阅更新

Here's a py lib with a bitonic tourhere's another
让我去寻找一个红宝石。我找不到只有RGL的问题,因为它有效率问题......

<强>更新
在您的情况下,最小生成树攻击应该是有效的。我想不出你的城市不会遇到三角不等式的情况。这意味着应该有一种相对类似的几乎快速相当不错的近似值。特别是如果距离是欧几里德,我认为,这一定是必须的。

答案 3 :(得分:1)

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

我建议你提出一个贪婪的标准,而不是使用更容易实现的DP或蛮力。

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

就代码而言,您需要实现具有权重的顶点,边。

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

答案 4 :(得分:1)

我致力于使用诸如Ant Colony Optimazation之类的元遗传算法来解决Bays29(29-city)问题的TSP问题,并且它在很短的时间内让我接近最优解。您可以使用相同的。

我用Java编写它,我会在这里链接它,因为我目前正在使用一个端口来ruby: Java:https://github.com/mohammedri/ant_colony_java_TSP Ruby:https://github.com/mohammedri/aco-ruby(不完整) 这是它解决的数据集:https://github.com/jorik041/osmsharp/blob/master/Core/OsmSharp.Tools/Benchmark/TSPLIB/Problems/TSP/bays29.tsp

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

答案 5 :(得分:0)

如果您希望算法产生的解决方案的成本在最佳值的3/2之内,那么您需要Christofides算法。 ACO和GA没有保证成本。