实施特定的旅行推销员变体

时间:2014-07-25 13:32:48

标签: java c++ algorithm traveling-salesman

我正在寻找一种算法(C / C ++ / Java - 无所谓),它将解决一个问题,即找到图形的2个节点(A和B)之间的最短路径。问题是路径必须访问某些其他给定节点(城市)。 可以多次访问某个城市。路径示例( A -HDCE- F - G - < strong> F - B )(其中A是来源,B是目的地,F和G是必须访问的城市)。

我认为这是旅行商问题的变体,但我无法根据我的搜索找到或编写有效的算法。

我试图从这些主题开始找到一个解决方案,但没有任何运气: https://stackoverflow.com/questions/24856875/tsp-branch-and-bound-implementation-in-cVariation of TSP which visits multiple cities

2 个答案:

答案 0 :(得分:1)

将问题轻松减少到TSP将是:

  1. 对于“必须访问”的每个(u,v),找到它们之间的距离d(u,v)。这可以使用Floyd-Warshall Algorithm有效地找到所有最短路径。
  2. 创建一个新图形G',仅包含那些节点,所有边都存在,距离计算在(1)上。
  3. 运行标准TSP算法来解决简化图上的问题。

答案 1 :(得分:0)

我认为除了amit的答案之外,你还需要增加A或B作为端点的边缘成本足够的数量(图表的总成本+ 1可能就足够了)来确保你最终没有通过A或B的路径(而不是以A和B结尾)。

A--10--X--0--B
|      |     |
|      10    |
|      |     |
+---0--Y--0--+

上述情况会导致从A到Y到B到X的路径,除非增加A和B边的成本(减去21)。

A--31--X--21--B
|      |      |
|      10     |
|      |      |
+---21--Y--21-+

现在它从A到X到Y到B. 还要确保删除任何边(A,B)(如果存在)。