网格中旅行商的多项式时间算法
Posted
技术标签:
【中文标题】网格中旅行商的多项式时间算法【英文标题】:Polynomial-time algorithm for travelling salesman in a grid 【发布时间】:2014-04-23 17:49:01 【问题描述】:我读到经典的travelling salesman problem (TSP) 是 NP-Hard。并且有一些近似算法以及在 O(N^2 * 2^N) 时间内运行的特定算法。但是 AFAIK,这些都是针对 TSP 的一般图表。
所以我的问题是,有没有更好的(优选多项式时间)算法来解决 M x N 网格中的 TSP?
例如,假设有一个 3x4 的网格,并且从一个单元格到 2 个相邻(底部和右侧)单元格中的每一个的行驶成本不同。所以我想找到访问所有单元格的最低成本,从单元格 (0, 0) 开始,返回到单元格 (0, 0)。
编辑:只是为了澄清问题,我很确定这不是欧几里得 TSP。为简单起见,请考虑以下示例。一个矩形被分成 M 行 N 列。推销员位于单元格 0, 0(左上角的单元格)。他必须访问所有单元格并仍然回到他的起始单元格 (0, 0)。但他只能从一个单元格前往其 4 个相邻单元格(上、左、下、右)中的每一个。而且从一个小区到其相邻小区的成本可能不一样。
谢谢。
【问题讨论】:
对于度量 TSP 问题有一个公平的算法,称为 Christofades 算法,如果适用于您的情况,它可能有用 和普通的TSP有区别吗?我怀疑 见The Open Problems Project #54 @BenjaminGruenbaum 关闭,但不完全正确。在这种情况下,我很确定有一个特定的算法(不是近似值)。而且 AFAIK,这并不总是满足三角不等式(例如 3x3 网格) @Heuster 看到了链接,但不确定。这有点令人困惑:/ 【参考方案1】:您要解决的问题仍然很困难,因为如果您将网格转换为图形并忘记您曾经为网格解决它,它会减少到 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);
【讨论】:
您可以将此问题简化为标准 TSP 并不意味着它是 np-hard...您需要从 TSP 减少到此问题。 你说它是 O(3^n*n)。什么是n?顶点数? @helb 抱歉,这里是网格的大小 @EyalSchneider 我的意思是问题已经是一个 TSP 网格结构没有任何意义,如果你忘记它是一个网格,你会得到一个你解决 TSP 的图表。 @EyalSchneider 您拥有的唯一优势是您知道每个顶点的度数最大为 4,可用于获得 O(3^(mn) 的简单蛮力解决方案*(mn)) 是对一般图上 O(n!) 的改进。【参考方案2】:由于网格权重是任意的,所以这个问题与一般平面图中的 TSP 一样难,这是 NP 难的(平面图可以嵌入到大小呈多项式增加的网格中)。由于我的顾问 Philip Klein,有一个线性时间近似方案,但它相当复杂。其中之一是 O(poly(m, n) exp(min(m, n))) 时间动态程序,用于在分支宽度 min(m, n) 的图中精确求解 TSP(即 mxn 网格) .
度量与非度量无关,除非每个顶点最多可访问一次。
【讨论】:
你能把平面图TSP简化为这个问题吗?我看到很多 cmets 声称这个问题是 np-hard,但没有证据。 @EyalSchneider 那是因为形式证明是一团糟:(一般的想法是嵌入平面图,取其对偶(用面交换顶点),然后将每个面“光栅化”成一个区域这样区域划分网格并且两个面是相邻的当且仅当它们的区域是相邻的。将所有区域内成本设置为零,将所有区域间成本设置为相应的边缘成本。【参考方案3】:TSP 的复杂性在于两个节点之间可能的路由数量呈指数增长。
一个网格有一个固定的节点度数(每个节点有例如 4 个邻居),但是对于一个 M*N 的 4-邻居。
算法可能在网格上运行得更快,但问题仍然是 NP-hard。
编辑:您可以省略访问顶点的路径,然后路径会直接返回到最后一个顶点,因为这些路径不必要地长。这意味着总是有 3 个可能的邻居可供选择(而不是 4 个)。因此复杂度可以表示为O(3^(M*N))
。这也对应于 Vikrams 回答中描述的蛮力方法。
【讨论】:
是的,但是你怎么能准确地说它的 O(4^(MN)) 呢?我以为N被当作顶点数,就是MN本身。 那将是网格中的 M 和 N,因此有 M*N 个顶点。你所说的“确切地”是什么意思?复杂性在那个数量级上。 让我们的网格是 MxN。然后让 V = M*N(顶点数)。那么运行时间将是O(4 ^ V)?但不应该是 O(V^2 * 2^V) 吗?抱歉,如果我遗漏了什么…… @IceArdor 这不是 big-oh 符号的工作原理。 big-oh 等效性的测试将是 lim sup V->∞ (V^2 * 2^V)/(2^V)以上是关于网格中旅行商的多项式时间算法的主要内容,如果未能解决你的问题,请参考以下文章