【问题标题】:Solving the Travelling Salesman Problem in ruby (50+ locations)解决 ruby​​ 中的旅行推销员问题(50 多个地点)
【发布时间】:2010-11-23 22:01:42
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • ……你当然知道这是最难的问题之一,对吧?没有真正好的答案?仍然有合理的解决方案,但只要确保您知道它们真的不会伟大
  • 是的......我不是在寻找“最佳”解决方案......一个合理的解决方案会这样做:)
  • 我添加了标签“旅行推销员”。您是否尝试过查看该标签中的其他问题?
  • 澄清一下:50 个地点可供多少用户/司机/销售人员使用?它是否需要实时运行,或者可以安排在晚上运行 - 以便在早上获得解决方案? - 公平地说 - 我只是从服务器负载的角度来问这个问题。
  • 这是关于旅行推销员和农夫50个女儿的旧事吗?

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


【解决方案1】:

这可能是您正在寻找的:

警告:

这个站点被 Firefox 标记为攻击站点 - 但我似乎没有。其实我之前用过没问题

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

rubyquiz 似乎已经关闭(已经关闭了一段时间)但是您仍然可以查看 WayBack 机器和 archive.org 来查看该页面: http://web.archive.org/web/20100105132957/http://rubyquiz.com/quiz142.html

【讨论】:

  • 您建议的 URL 指向可以下载的多个解决方案...我能够调整其中一个解决方案的代码(来自 Joseph Seaton)以满足我的需求。再次感谢您指向该站点 :) 我设法在不到 10 秒的时间内获得了合理的解决方案...
  • 不客气。顺便说一句 - 我强烈建议探索并尝试解决其中的一些问题 - 将帮助您成为更好的 ruby​​ 程序员。当我有时间的时候,我试着每周做一个问题。
【解决方案2】:

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

【讨论】:

【解决方案3】:

这里有几个技巧:
1:将相对接近的位置集中到一个图中,并将这些位置变成主图中的单个节点。这让您无需太多工作就可以变得贪婪。
2:使用近似算法。
2a:我最喜欢的是双音游览。它们很容易破解。
查看更新

Here's a py lib with a bitonic tourhere's another
让我去找一颗红宝石。我很难找到不仅仅是RGL,它有效率问题....

更新
在您的情况下,最小生成树攻击应该是有效的。我想不出你的城市不会满足三角不等式的情况。这意味着应该有一种相对较快的近似值。特别是如果距离是欧几里得,我再次认为它一定是。

【讨论】:

    【解决方案4】:

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

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

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

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

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

    【讨论】:

    • 蛮力方法被认为是不切实际的超过 20 点。对于 50,他将不得不尝试阶乘(50!)排列 - 大约 = 30414093201713378043612608166064768844377641568960512000000000000 每个推销员。
    【解决方案5】:

    我致力于使用元启发式算法(例如 Ant Colony Optimazation)来解决 Bays29(29 城市)问题的 TSP 问题,它让我在很短的时间内接近了最优解。您可能会使用相同的。

    虽然我是用 Java 编写的,但无论如何我都会在这里链接它,因为我目前正在开发 ruby​​ 的端口: 爪哇:https://github.com/mohammedri/ant_colony_java_TSP 红宝石:https://github.com/mohammedri/aco-ruby(不完整) 这是它解决的数据集:https://github.com/jorik041/osmsharp/blob/master/Core/OsmSharp.Tools/Benchmark/TSPLIB/Problems/TSP/bays29.tsp

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2019-09-04
        • 1970-01-01
        • 2013-08-23
        • 2011-09-08
        • 2011-05-26
        • 2020-04-18
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        相关资源
        最近更新 更多