一旦知道最短路线的距离,就解决旅行推销员的问题

时间:2016-09-27 19:34:10

标签: algorithm traveling-salesman np

我正在尝试解决TSP (Travelling Salesman Problem),但不是传统方式。我正在遵循这些步骤。

  

1)首先,我将TSP更改为 true / false 问题。

此问题的定义现在是:“所有城市的路线是否总距离小于或等于k?”我们假设我有一个算法TSP_tf(k)来解决它。

  

2)然后我搜索最小 k

这是,我搜索“这是最短路线的距离”。

解决它的有效算法将是二分法搜索。我从k=1开始,然后拨打TSP_tf(k)。如果它返回false,我将k乘以2,并继续调用TSP_tf,直到返回true。发生这种情况时,请搜索在k区间内返回true的最小(k/2 - k],同时使用二分搜索。

然后我会得到最小距离min_k

  

3)返回TSP的最短路线,知道距离 min_k

这就是我的问题所在。如何解决这个问题的有效算法呢?通过有效我的意思是一个好的方法:)很明显,TSP仍然是NP。

2 个答案:

答案 0 :(得分:1)

您的TSP_tf通常称为决策问题版本。该问题是NP完整的,请参阅https://en.wikipedia.org/wiki/Travelling_salesman_problem#Computational_complexity进行验证。因此,你不应该希望它会非常容易处理。

也就是说,同样的维基百科文章提供了大量关于在实践中解决TSP问题的有效方法的信息。

答案 1 :(得分:0)

我终于设法解决了。

假设我们有一个图表g,它代表TSP的城市及其标题。节点表示一个城市,加权边表示两个城市之间存在连接,并且其权重距离相应。

为了获得距离最短的路线,让我们一对一地删除边缘,看看它们是否是最短路线的一部分。我们怎么知道呢?如果我们从图表中删除边e,并使用已知的最短距离TSP_tf调用min_k,则可能会发生以下两种情况:

  • TSP_tf(min_k) == false。也就是说,删除e无法获得min_k距离的路线。 e是最短路线的一部分。

  • TSP_tf(min_k) == true。如果没有连接e,仍然可以获得具有相同最小min_k距离的路线。 e没有参加最短的路线。

如果我们逐步将其应用到图的所有边缘,我们可以获得确切的最短路径(或更好地说,最短路线之一,因为可能有多个解决方案)。

// min_k is the distance of the shortest path of the TSP represented by the graph g.
Graph TSP(Graph g, int min_k)
    Graph shortestPath = g;
    For (Edge e in g)
        // Delete the edge e.
        shortestPath -= e;
        // e is part of the shortest path.
        If (TSP_tf(shortestPath, min_k) == false)
            shortestPath += e;
        EndIf
    EndFor
    Return shortestPath;
EndTSP

众所周知,图表的最大节点数为1/2 * |V| * |V-1|,节点数为|V|。每个节点都会进行TSP_tf次呼叫,因此对TSP_tf的呼叫数量为O(|V|^2),这是一种有效的算法。