【问题标题】:How to implement TSP with dynamic in C++如何在 C++ 中动态实现 TSP
【发布时间】:2014-08-06 19:48:44
【问题描述】:

最近我向question on Stack Overflow 寻求帮助以解决问题。这是一个旅行推销员问题,我有多达 40,000 个城市,但我只需要访问其中的 15 个。

有人指示我使用 Dijkstra 和优先队列来为我需要访问的 15 个城市制作连接矩阵,然后使用 DP 在该矩阵上执行 TSP。我以前只使用过带有 O(n^2) 的 Dijkstra。在试图弄清楚如何实现 Dijkstra 之后,我终于做到了(足以从 240 秒优化到 40,000 个城市的 0.6 秒)。但现在我被困在 TSP 部分。

以下是我学习 TSP 所用的资料:

我有点理解算法(但不完全),但我在实现它时遇到了麻烦。在此之前,我使用 dp[int] 或 dp[int][int] 的数组进行了动态编程。但是现在当我的 dp 矩阵必须是 dp[subset][int] 我不知道该怎么做。

我的问题是:

  • 如何使用动态规划处理子集? (C++ 中的示例将不胜感激)
  • 我链接的算法是否允许多次访问城市,如果不允许,我应该更改什么?
  • 我是否应该改用另一种 TSP 算法? (我注意到有几种方法可以做到这一点)。请记住,我必须得到准确的值,而不是近似值。

编辑:

经过更多研究,我偶然发现了斯坦福大学的一些竞争性编程竞赛讲座,并设法找到了 TSP here(幻灯片 26-30)。关键是将子集表示为位掩码。不过,这仍然让我的其他问题没有答案。

是否可以对该算法进行任何更改以允许多次访问一个城市。如果可以做到,这些变化是什么?不然怎么办?

【问题讨论】:

  • 我不是很肯定,但我很确定你不能使用 Dijkstra 的算法来获得旅行商问题的精确解(除非你想要一个贪婪的近似值)。请记住,Dijkstra 是多项式的,您的答案需要是指数的。
  • @PatrickCollins 我没有使用 Dijkstra 来获得 TSP 的精确解决方案。我刚刚提到我使用 Dijkstra 来生成我将用于 TSP 的连接矩阵。我打算用动态编程来做TSP。请仔细阅读
  • 啊,好吧,我误解了——我以为您希望使用 Dijkstra 算法作为 TSP 实现的一个步骤。 (如果您正在寻找贪婪的近似值,这将是要走的路)
  • 听起来您需要访问 15 个 given 城市,但请说清楚。您当前所拥有的内容可以很容易地解释为“找出 15 个城市中 TSP 最短的子集”。

标签: c++ algorithm dynamic-programming traveling-salesman


【解决方案1】:

我认为您可以使用动态解决方案并为每对节点添加一条具有最短路径的第二条边。另请参阅此问题:Variation of TSP which visits multiple cities

【讨论】:

  • 这实际上对我有用,无需调整。我算法的第一部分(我运行的 Dijkstra)实际上对我来说是一个 Floyd-Warshall。一个简单的 TSP 运行解决了它。
  • 如果我的回答有帮助,请考虑接受。谢谢!
【解决方案2】:

这是一个TSPimplementation,你会在帖子中找到实现问题的链接。

您链接的算法不允许多次访问城市。

对于你的第三个问题,我认为 Phpdna 的回答很好。

【讨论】:

    【解决方案3】:

    可以多次访问城市吗?是和不是。在您的第一步中,您将问题减少到 15 个相关城市。这会产生一个完整的图形,即每个节点都连接到每个其他节点的图形。两个这样的节点之间的连接可能涉及原始地图上的多个城市,包括一些相关的城市,但这应该与您在第二步中的算法无关。

    是否使用不同的算法,我可能会在图形中进行深度优先搜索。使用最小生成树,您可以为剩余城市提供上限和下限,并使用它来选择有希望的解决方案并丢弃无望的解决方案(也称为修剪)。关于这个主题也有很多研究,只需搜索网络即可。例如,在地图实际上是 carthesian 的情况下(即旅行成本是飞机上两点之间的距离),您可以利用此信息来稍微改进算法。

    最后,如果你真的打算增加访问城市的数量,你会发现计算它的时间大大增加,所以你将不得不放弃对精确解的要求。

    【讨论】:

      猜你喜欢
      • 2015-07-18
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多