旅行推销员变化:建立棒球场之旅

时间:2015-06-01 11:18:44

标签: java traveling-salesman

我正在尝试编写一个Java程序来寻找最佳行程,以便在30个美国职业棒球大联盟体育场的每个体育场观看比赛。我定义了最好的"行程使用公制Miles Driven +(200 *路上天数);这消除了30天内20,000英里的旅行,或90天内11,000英里的旅行,这两次旅行都不是我想要的旅行。每个团队在183天的赛季中打81场主场比赛,所以当一支球队在家时需要考虑。

另外,我不只是为整个棒球赛季寻找最好的巡回赛。我希望在任何特定日期(六月十五日在底特律,八月三日在亚特兰大等地)找到任何特定MLB城市开始/结束的最佳旅游。

我已经让这个程序产生了我非常满意的结果,但是我的笔记本电脑需要几个月的时间才能完成,而且我想知道是否有人有任何想法如何提高效率。

程序迭代运行。它从一场比赛开始;比如芝加哥4月5日。它确定了在芝加哥比赛后的第二天或第二天你可以接下来的比赛。让我们说在辛辛那提和底特律有两个这样的游戏。它创建了一个数据结构,其中包含每个预期巡回赛的所有站点(一个用于芝加哥 - 辛辛那提,一个用于芝加哥 - 底特律)。然后,为两个两站游览找到预期的第三站,同样如此,直到它到达第30站和最后一站,此时它确定最佳游览。

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

所以...任何想法?

1 个答案:

答案 0 :(得分:0)

你的算法实际上并不贪婪 - 它列举了所有可能的游览(随着时间的推移修剪明显不好的游览)。一个贪婪的算法只向前迈出一步,为该步骤做出最佳决策,然后提前一步,等等。它们并不精确,但它们非常快。我建议为您的问题调整标准的贪婪型TSP启发式。有许多常见的 - 最近邻,最便宜的插入等。如果您还不熟悉它们,您会找到描述它们的各种在线资源。

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

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

希望这有帮助。