【问题标题】:Traveling Salesman Variation: Building a tour of baseball stadiums旅行推销员变体:建立棒球场之旅
【发布时间】:2015-08-14 19:59:33
【问题描述】:

我正在尝试编写一个 Java 程序,以找到最好的路线,以便在美国职业棒球大联盟的 30 个体育场中的每一个体育场进行驾车游览。我使用公制 Miles Driven + (200 * Number of Days on the Road) 来定义“最佳”行程;这消除了 30 天内 20,000 英里或 90 天内 11,000 英里的旅行,这两种旅行都不是我想参加的旅行。每支球队在 183 天的赛季中打了 81 场主场比赛,因此需要考虑球队何时在家。

另外,我不只是在寻找整个棒球赛季的最佳巡回赛。我正在寻找在任何特定日期(6 月 15 日底特律,8 月 3 日亚特兰大等)在任何特定 MLB 城市开始/结束的最佳巡回赛。

我的程序产生了令我非常满意的结果,但是在我的笔记本电脑上运行需要几个月才能完成,我想知道是否有人对如何使它更高效。

程序迭代运行。它从一个游戏开始;比如说,4 月 5 日的芝加哥。它会计算出你可以在芝加哥比赛后的一两天内参加下一场比赛;假设在辛辛那提和底特律有两场这样的比赛。它创建了一个数据结构,其中包含每次预期旅行的所有站点(一个用于芝加哥-辛辛那提,一个用于芝加哥-底特律)。然后,它会为两个 2 站游览找到预期的第 3 站,依此类推,直到到达第 30 站和最后一站,此时它确定最佳游览。

它使用几种方法来修剪低效的旅行。主要的是使用 HashMap。关键是一个字符序列,它表示(1)哪些球场已经被访问过,(2)这是最后一个访问过的球场。所以它会在 A-B-C-D-E 和 A-D-B-C-E 上遇到重复。然后它将保留较短的路线并消除较长的路线。对于大多数起点,这使列表中的最大旅行数量在任何给定时间保持在 2000 万左右,但对于某些起点,它会达到 9000 万左右。

那么……有什么想法吗?

【问题讨论】:

  • 另外,如果你想知道我到底需要这样的东西来做什么,它是我作为爱好做的可搜索数据库网站(bestballparktour.com,如果你'感兴趣)。我现在加载的数据集,我不满意;我走的捷径太多,如果您查阅 MLB 赛程表,在很多情况下您可以找到更好的旅行。另外,我知道该网站看起来不是很吸引人;我不是一个真正的网络程序员。修复数据库后,我可能会尝试让它看起来更时髦。
  • 你熟悉A*(A星)算法吗?老实说,我不是 100% 熟悉你的问题的领域,但在我看来,你应该能够为 A* 定义一个估计指标,这将大大提高你的效率,而不是像你这样的天真的广度优先搜索正在做。
  • 如果下一跳在几天或英里或每天英里内太长,我会说不要处理给定的旅行。你说过 20k 英里超过 30 天,这是平均每天 600 英里,如果开车 8 小时是 80 英里/小时 - 是不是太快了?因此,设置一个阈值“太远”、“太晚”、“太快”,如果一跳超过其中之一,则放弃游览。 (我想说这些门槛是可选的,因为有些人更喜欢从东海岸到西海岸的单程旅行,如果所有其他旅行都相当短的话。)
  • @DiegoMartinoia 这里 A* 实现的问题是 A* 通常受搜索空间的限制,而这里假设所有体育场之间的完整图,并且节点之间的距离也随时间变化。假设两个相邻的体育场A和B在今天和明天举办比赛,那么A在一周后举办比赛,B在两周后举办比赛,AB距离提前1天和2周后,而BA距离提前一周,迟到未知。所以我认为这里根本无法实现A*。
  • @Vesper ,我认为我们可以将图中的节点表示为位置+时间对(即一个节点 == 一场比赛),这样您的所有距离都是明确定义的(回去在时间 == 无限距离)。但是,再一次,我可能没有完全理解这个问题。

标签: java traveling-salesman


【解决方案1】:

您的算法实际上并不贪心——它列举了所有可能的旅行(在您进行时修剪明显不好的旅行)。贪心算法只向前看一步,为该步骤做出最佳决策,然后向前移动下一步,等等。它们并不精确,但它们非常快。我建议为您的问题采用标准的贪婪型 TSP 启发式。常见的有很多——最近的邻居、最便宜的插入等等。如果您还不熟悉它们,可以找到各种描述它们的在线资源。

您还可以创建重复的体育场节点,每个主场比赛一个,然后将其建模为广义 TSP (GTSP),其中每个“集群”都包含给定体育场的节点。从节点 (i_1,j_1) 到 (i_2,j_2) 的距离(其中 i = 体育场,j = 日期)由您的指标定义。

从技术上讲,这是一个带有时间窗的 TSP,但它比 TSPTW 的通常定义更复杂,因为通常每个节点都有一个连续的时间窗(例如,在上午 8 点到下午 2 点之间到达),而这里你有一个不相交的时间窗一组窗口,您必须从中选择一个。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2015-04-28
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多