我有一个具有1000个节点的完整加权图,并且需要在图中找到尽可能长的汉密尔顿路径(更精确地说,是节点的顺序)。我应该适合5秒(对于Java),内存限制足够大。 找到最长的汉密尔顿路径与为TSP(旅行推销员)找到解决方案没有什么不同。当然,最佳解决方案是毫无疑问的,因此我正在寻找一种良好的启发式方法。 到目前为止,我最好的解决方案是使用Nearest Neighbor算法,该算法易于实现并且可以在多项式时间内运行(1000个节点的图形需要约0.7秒)。但是,离最佳解决方案还有点距离。 因此,我正在寻找一种运行速度相对较快的更好的启发式方法。 我看到提到的禁忌搜索,模拟退火,蚁群,遗传学,分支定界,基于MST的算法等。 问题是,由于它们的实现并不简单,因此很难找到它们的时间复杂度来确定哪一个可以适合5秒。时限;例如在多项式时间内运行。 对于某些像Christofides的算法,我看到复杂度为O(V ^ 4),其中V是顶点的数量,显然使它无法拟合。
我遇到了Bitonic Tour解决方案,该解决方案通常用于在欧几里得图中找到最短的汉密尔顿路径,但是似乎也可以在非欧几里得图中找到最长的路径:
public static void minCostTour(int[][] graph) {
int n = graph.length;
int[][] dp = new int[n][n];
dp[0][1] = graph[0][1];
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++)
if (i == (j - 1) && i != 0) {
dp[i][j] = dp[0][j-1] + graph[0][j];
for (int k = 1; k <= j - 2; k++)
if ((dp[k][j-1] + graph[k][j] < dp[i][j])) {
dp[i][j] = dp[k][j-1] + graph[k][j];
}
} else if (i != 0 || j != 1) {
dp[i][j] = dp[i][j-1] + graph[j-1][j];
}
}
System.out.println("Optimal Tour Cost: " + (dp[n-2][n-1] + graph[n-2][n-1]));
}
标准算法包括对坐标的初始排序,我跳过了该排序,因为显然没有要排序的坐标(图形是非欧几里得)。 这种动态编程解决方案在O(V ^ 2)中运行,因此可能不错。 问题在于它输出哈密顿路径长度,并且我需要节点序列。我真的不明白如何从上述算法还原路径(如果可能的话)。
TL DR版本: 上面的Bitonic Tour算法能否用于在完整加权图中的最长汉密尔顿路径上找到节点的序列? 如果没有,您可以为该任务推荐具有类似(多项式)时间复杂度的算法吗?