网格中旅行商的多项式时间算法

时间:2014-03-18 07:22:25

标签: algorithm np

我读过经典的travelling salesman problem (TSP)是NP-Hard。并且存在一些近似算法以及在O(N ^ 2 * 2 ^ N)时间内运行的特定算法。但是AFAIK,这些是针对TSP的一般图表。

所以我的问题是,是否有更好的(优选的多项式时间)算法来解决M×N网格中的TSP?

例如,假设有一个3x4的网格,从一个单元格到两个相邻(底部和右侧)单元格中的每一个都有不同的成本。所以我想找到访问所有单元格的最低成本,从单元格(0,0)开始并返回单元格(0,0)。

编辑:只是为了澄清事情,我很确定这不是欧几里德TSP。为简单起见,请考虑以下示例。矩形分为M行和N列。销售人员在单元格0,0(左上角的单元格)。他必须访问所有细胞并仍然回到他的起始细胞(0,0)。但他只能从一个牢房到四个相邻的牢房(顶部,左侧,底部,右侧)。从一个电池到任何一个相邻电池的成本可能不一样。

感谢。

3 个答案:

答案 0 :(得分:1)

TSP的复杂性是由于两个节点之间可能的路由数量是指数级的。

网格具有固定的节点度(每个节点具有例如4个邻居),但是对于具有4-的M * N网格,两个行进节点之间的可能路由的数量仍为O(4 ^(M * N))邻居关系。

算法可能在网格上运行得更快,但问题仍然是NP难的。

编辑:您可以省略访问顶点的路径,然后路径返回到最后一个顶点,因为这些路径不必要很长。这意味着总有3个可能的邻居可供选择(而不是4个)。因此,复杂性可以表示为O(3^(M*N))。这也与Vikrams答案中描述的蛮力方法相对应。

答案 1 :(得分:1)

由于网格权重是任意的,因此这个问题与一般平面图中的TSP一样难,这是NP-hard(平面图可以嵌入网格中,大小多项式增加)。由于我的顾问Philip Klein,有一个线性时间近似方案,但它相当复杂。其中一个部分是O(poly(m,n)exp(min(m,n)) - 时间动态程序,用于在分支宽度min(m,n)(即mxn网格)的图形中精确求解TSP

度量与非度量不相关,除非每个顶点最多可访问一次。

答案 2 :(得分:0)

你正在解决的问题仍然很难,因为如果你将网格转换为图形并且忘记你曾经为网格解决它而将它简化为TSP但你可以使用简单的蛮力在O的指数时间内解决这个问题(3 ^(m * n)*(m * n))优选为复合DP溶液

O(3^(m*n)*(m*n))中对您的问题进行强力解决方案:

int mindist = infinity;

void GridTSP(int x,int y,int visited[][],int dist,int total,int n,int m) {

    if(total==n*m) {

          if(dist<mindist)
              mindist = dist;
    }

    else if(visited[x][y]) {

         return;
   }

   visited[x][y] = true;

   for each neighbour (a,b) of (x,y)  :
          GridTSP(a,b,visited,dist+cost(x,y,a,b),total+1,n,m);


   visited[x][y] = false;
}


GridTSP(0,0,new int[3][4],0,0,3,4);