【问题标题】:Traveling salesman TSP: Brute algorithm improvement旅行推销员 TSP:蛮力算法改进
【发布时间】:2013-10-09 14:10:33
【问题描述】:

根据wiki 需要(N-1)!计算 N 个城市的旅行。我找到了一种更好的方法,但我无法通过数学计算我改进了多少。我可以告诉你,在我的家用电脑上,我能够在不到 1 小时的时间内解决 20 个城市的地图。 20! = 2.43290200e+18。这是我所做的:

当使用 brout 算法搜索 N 个城市的路线(让它们命名:City(1)、City(2)、City(3)... City(N))时,您将首先执行此测试: City(1), City(2), City(3), City(4)... City(N) 一段时间后,这个:City(1), City(3), City(2),城市(4)...城市(北)。我声称第二次计算是不必要的。如果我只计算一次 City(4) ... City(N) 的最短路线,我可以将其用于第二次计算并确定哪条路线更好。

使用这个技巧,我可以通过以下方式减少我为 K 城市所做的计算数量:(N - k) 这是我可以选择的第一个城市的选项数量,乘以 (N - K - 1)!这是我必须选择其余城市的选项数量,减去第一次,我需要执行完整计算。所以它将是(N - K)!。您需要对从 k = 3 到 k = N - 2 的所有 K 求和。

这是我去的最远,(也不是很远)...希望你能帮我计算一下。

【问题讨论】:

  • 我认为这是改进 tsp 的已知技巧,以便与 O(n^2*2^n) 算法相比,它可以处理 1 或 2 个以上的城市。介意在此处发布您的代码吗?
  • @noooooooob 也发布了here

标签: traveling-salesman np-complete np np-hard


【解决方案1】:

存储和重用您已经计算的结果是动态编程背后的基本思想,对于 TSP,有一些动态编程算法可以在 O[(N^2)*(2^N)] 时间运行,这将比您的算法产生更快的结果(您将能够在几分钟内解决 25 个顶点的问题...)

见:Dynamic Programming for the TSP

【讨论】:

  • 我认为用 O[(N^2)*(2^N)] 解决 20 个顶点是不可能的。 2^20 * 20 * 20 =~400M。当我使用我的算法时,所以 20 个顶点少于 100K,并且需要将近一个小时。我知道它不到 100K,因为我计算了我在城市之间比较的次数。
  • 在一台普通电脑上执行 400M 基本操作应该不到一秒,你不可能只执行 100K 操作而且需要将近一个小时,你应该检查你的运行时计算。
  • 是的,但是比较城市没有什么基本的。当然,不同算法之间的原子动作可能会有所不同,但我认为你提供的算法不可能达到 20。
  • @Babidu 我知道这是可能的,因为我已经多次实现了这个算法。
  • @Babidu:你能发布你的解决方案是如何只有 20 个城市的 100k 组合吗?
猜你喜欢
  • 1970-01-01
  • 2019-09-04
  • 2015-06-22
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2017-10-02
  • 1970-01-01
相关资源
最近更新 更多