【发布时间】:2016-11-20 20:18:19
【问题描述】:
我很难掌握 Held-Karp 算法的关键思想,它是如何降低时间复杂度的? 是因为它使用了动态编程,因此可以通过从缓存中获取中间结果来节省时间,还是因为它在计算的早期删除了一些路径?
另外,是否可以使用二维表来显示计算 一个简单的 TSP 问题(3 或 4 个城市)?
【问题讨论】:
标签: algorithm traveling-salesman
我很难掌握 Held-Karp 算法的关键思想,它是如何降低时间复杂度的? 是因为它使用了动态编程,因此可以通过从缓存中获取中间结果来节省时间,还是因为它在计算的早期删除了一些路径?
另外,是否可以使用二维表来显示计算 一个简单的 TSP 问题(3 或 4 个城市)?
【问题讨论】:
标签: algorithm traveling-salesman
Held–Karp 算法的动态规划过程利用了 TSP 问题的以下性质:最小距离路径的每个子路径本身就是最小距离。
因此,本质上,我们不是以简单的“自上而下”、蛮力方法(所有可能的排列)检查所有解决方案,而是使用“自下而上”的方法,其中解决问题所需的所有中间信息开发一次而且只有一次。初始步骤是最小的子路径。每次我们向上解决较大的子路径时,我们都能够查找所有已计算的较小子路径问题的解决方案。节省时间是因为所有较小的子问题都已解决,并且这些节省成倍增加(在每个更大的子路径级别)。但是计算中没有“路径被删除”——在程序结束时,所有子问题都将得到解决。明显的缺点是可能需要非常大的内存来存储所有中间结果。
总之,Held–Karp 算法的时间节省源于它从不重复求解城市的任何子集(组合)的解决方案。但是蛮力方法将多次重新计算任何给定子集组合的解(尽管不一定在给定的整体集合排列中按连续顺序)。
维基百科包含一个二维距离矩阵示例和伪代码here。
【讨论】: