欧几里得旅行商问题是对平面上给定的n个点确定一条连接各点的最短闭合旅程的问题,下图a给出了7个点问题的解。这个问题的一般形式是NP完全的,故其解需要多于多项式的时间。
J.L.Bentley建议通过只考虑双调旅程来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。b显示了同样7个点问题的最短双调路线。在这种情况下,多项式时间的算法是可能的。
描述一个确定最优双调路线的O(n^2)时间的算法,可以假设任何两点的x坐标都不相同。
将各个节点从左至右进行排序,编号为1,2,....n。对于任意的i和k(其中1<=i<=n, 1<=k<=n),假设这样一种情况,有两条路径,路径A从1出发到i, 路径B从1出发到k, A和B有公共的起点1,但是中途没有交叉点,终点有可能重合也可能不重合,令s=max(i,k),则从1到s所有的点一定在路径A或者路径B上,不会有遗漏的点。对于特定的i和k,路径A和B存在多种可能的走法,其中必有一种2条路径的和最小的走法,采用这种走法得到的路径A和路径B的和记为B[i,k]。当i=k时B[i,k]表示了从1到i的双调欧几里得旅行商的解,当i=k=n时B[i,k]就表示了整个问题的最终解法。
采用动态规划的算法求解,上图表示对B[i,k]的递进情况,已经确定了值时用绿色填充相应的部分。开始时显然B[0,0]=0。而i=0或者k=0的情况下也可以直接确定B[i,k]的值。
显然,基于对称的考虑,表的左下半部和右上半部的数值将完全相同,所以在生成表的时候可以不用考虑下半部分,既红色填充的部分,当对应的上半部分生成后可以直接填充到红色部分去。
图中三种箭头代表了三种情况。上面右图则是总的推导循序,先向右推导,然后将结果向下拷贝到红色区域,继续下一行向右推导,这样不断地向右下推进。即按照箭头的循序推导,而总的顺序从浅绿到深绿。
黑色箭头:(i > k)
A: 1 --------------->i
B: 1 --------k
已知B[i,k] 要求B[i+1,k] 只用将A路径直接延长到i+1即可
因此 B[i+1,k] = B[i,k] + w(i,i+1)
紫色箭头:(i = k)
A: 1 ------------->i
B: 1 ------------->i
已知B[i,i] 要求B[i+1,i] 此时,AB两条路径在终点i相交,所以这个交叉点需要解开,同时路径A的终点为i+1,路径B的终点为i。此时有i+1种可能的处理方案,对于任意的u (0<=u<=i),从路线图上可以看出B[u,i]是已经推导出来的已知量(红色边框的区域),对于这i+1种B[u,i],只要将A路线的终点向前进一步道i+1即可达到要求,既:
A: 1 ---------->u----->i+1
B: 1 ------------->i
所以,最优的结果是在这i+1种方案中产生
B[i+1,i] = min{ B[u,i] + w(u,i+1) } (其中 0<=u<=i)
蓝色箭头:(i = k)
A: 1 ------------->i
B: 1 ------------->i
已知B[i,i],要求B[i+1,i+1],此时要将AB路径推向共同的节点i+1。此时对于i+1种B[u,i](0<=u<=i),既红色框的部分,都可以将他们的A,B两条路线同时向前推进一步到共同的交点i+1来达到目的,既如下所示:
A: 1 -------->u--------->i+1
B: 1 ------------->i---->i+1
所以,最优的结果是在这i+1种方案中产生
B[i+1,i+1] = min{ B[u,i] + w(u,i+1) + w(i,i+1) } (其中 0<=u<=i)