双调欧几里得旅行商问题
欧几里得旅行商问题是对平面上给定的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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具