双调欧几里得旅行商问题是一个经典动态规划问题。《算法导论(第二版)》思考题15-1和北京大学OJ2677都出现了这个题目。

旅行商问题描写叙述:平面上n个点,确定一条连接各点的最短闭合旅程。

这个解的一般形式为NP的(在多项式时间内能够求出)

J.L. Bentley 建议通过仅仅考虑双调旅程(bitonictour)来简化问题,这样的旅程即为从最左点開始。严格地从左到右直至最右点,然后严格地从右到左直至出发点。

下图(b)显示了相同的7个点的最短双调路线。在这样的情况下。多项式的算法是可能的。其实,存在确定的最优双调路线的O(n*n)时间的算法。

上图中,a是最短闭合路线。这个路线不是双调的。

b是最短双调闭合路线。



求解过程:

(1)首先将各点依照x坐标从小到大排列,时间复杂度为O(nlgn)。

(2)寻找子结构:定义从Pi到Pj的路径为:从Pi開始,从右到左一直到P1,然后从左到右一直到Pj。在这个路径上,会经过P1到Pmax(i,j)之间的全部点且仅仅经过一次。

在定义d(i,j)为满足这一条件的最短路径。

我们仅仅考虑i>=j的情况。

同一时候,定义dist(i,j)为点Pi到Pj之间的直线距离。

(3)最优解:我们须要求的是d(n,n)。

关于子问题d(i,j)的求解。分三种情况:

A、当j < i - 1时,d(i,j) = d(i-1,j) + dist(i - 1,i)。

由定义可知,点Pi-1一定在路径Pi-Pj上,并且又因为j<i-1,因此Pi的左边的相邻点一定是Pi-1.因此能够得出上述等式。

B、当j = i - 1时,与Pi左相邻的那个点可能是P1到Pi-1总的不论什么一个。因此须要递归求出最小的那个路径:

d(i,j) = d(i,i-1) = min{d(k,j) + dist(i,k)},当中1 <= k <= j。

C、当j=i时,路径上最后相连的两个点可能是P1-Pi、P2-Pi...Pi-1-Pi。

因此有:

d(i,i) = min{d(i,1)+dist(1,i),...,d(i,i-1),dist(i-1,i)}.。

參考

小记:这题之前分析是哈密顿回路。旅行商问题即是。

可是没去百度了,如今百度出来了。參考

最新文章

  1. 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例
  2. Swift - 计算文本高度
  3. Object学习笔记
  4. Cocos2dx中的opengl使用(一)简单介绍
  5. Mysql参数详解
  6. PHP学习笔记,自己动手写个MVC的框架
  7. 11.java.lang.ArrayStoreException
  8. 反转字符串的几种实现(Java)
  9. Java注解学习
  10. 使用SDL2显示一张图片,SDL2上手贴
  11. spawn-fcgi启动的一些报错问题
  12. KTV项目之3个ListView的跳转和加载歌手图片
  13. Orleans学习总结(四)--集群配置篇
  14. Linux中使用GoAccess进行日志实时监控
  15. Python处理大数据
  16. 吴裕雄 数据挖掘与分析案例实战(4)——python数据处理工具:Pandas
  17. nodejs+express安装配置(Linux版本)
  18. Node.js 连接 MongoDB-7
  19. 零值比较--BOOL,int,float,指针变量与零值比较的if语句
  20. 关于mysql的 sql_mode=only_full_group_by 报错

热门文章

  1. Java设计模式菜鸟系列(七)命令模式建模与实现
  2. jQuery 删除HTML元�
  3. .cmd文件与.bat文件
  4. 为什么函数式编程在Java中很危险?
  5. 基于visual Studio2013解决C语言竞赛题之1046矩阵计算
  6. 微软Ajax--UpdatePanel控件
  7. 关于python抓取google搜索结果的若干问题
  8. May Day Holiday
  9. Thinkphp入门 五 —模型 (49)
  10. java输出空心菱形