我正在尝试解决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。
答案 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)
,这是一种有效的算法。