一个特定的旅行推销员变体的实现

Implementation of a particular Travelling-Salesman variation

本文关键字:旅行推销员 实现 一个      更新时间:2023-10-16

我正在寻找一种算法(C/c++/Java -没关系),这将解决一个问题,其中包括找到图的2个节点(a和B)之间的最短路径。问题是该路径必须访问特定的其他给定节点(城市)。一个城市可以被访问多次。路径示例(A- h - d - c - e -F-G-F B)(其中A为源,B为目的,F和G为必须访问的城市)

我认为这是旅行推销员问题的一个变体,但我无法找到或编写一个基于我的搜索的工作算法。

我试图找到一个解决方案,从这些主题开始,但没有任何运气:https://stackoverflow.com/questions/24856875/tsp-branch-and-bound-implementation-in-c和跨城市TSP变化

将问题简化为TSP:

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

我认为除了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)(如果它们存在的话)。