我正在寻找一个问题,我有一个加权有向图,我必须从原点开始,至少访问所有顶点一次,然后以尽可能短的路径返回原点。基本上这将是TSP的经典示例,除了我 DO NOT 具有每个顶点只能访问一次的约束。在我的情况下,除了原点之外的任何顶点都可以沿着路径被访问任意次数,如果这使得路径更短。因此,例如在包含顶点V1, V2, V3
的图形中,这样的路径是有效的,因为它是最短的路径:
ORIGIN -> V1 -> V2 -> V1 -> V3 -> V1 -> ORIGIN
因此,我有点坚持采用什么方法来解决这个问题,因为通常用于解决指数时间TSP问题的经典动态编程算法方法并不合适。
答案 0 :(得分:2)
典型的方法是创建一个距离矩阵,给出任意两个节点之间的最短路径距离。因此d(i,j)
=从i
到j
的最短路径(在网络边缘之后)。这可以使用Dijkstra算法完成。
现在只需解决距离为d(i,j)
的经典TSP。你的TSP没有"知道"所遵循的实际路线可能涉及多次访问节点。同时,它将确保车辆在每个节点停止。
现在,至于效率:正如@Codor指出的那样,TSP是NP难的,你的变体也是如此,所以你不会找到一个可证明最优的多项式时间算法。但是,对于TSP,仍有许多很好的算法(包括启发式算法和精确算法),并且大多数算法都适合您的问题。 (一般来说,DP对于TSP来说是不。)
答案 1 :(得分:1)
为了部分回答这个问题,问题中描述的问题不允许多项式时间算法,除非P=NP
通过以下参数。显然,提出的问题包括欧几里得的实例。然而,对欧几里得实例的最优解没有重复节点,因为可以通过使用三角不等式删除附加节点来改进这种解决方案。但是,根据TSP上的Wikipedia article,欧几里德TSP仍然是NP
- 很难。这意味着问题中任何问题的多项式时间算法都能够将欧几里德TSP解决为多项式时间的最优性,除非P=NP
,否则这是不可能的。