【问题标题】:For TSP, how does Held–Karp algorithm reduce the time complexity from Brute-force's O(n!) to O(2^n*n^2)? [closed]对于 TSP,Held–Karp 算法如何将时间复杂度从 Brute-force 的 O(n!) 降低到 O(2^n*n^2)? [关闭]
【发布时间】:2016-11-20 20:18:19
【问题描述】:

我很难掌握 Held-Karp 算法的关键思想,它是如何降低时间复杂度的? 是因为它使用了动态编程,因此可以通过从缓存中获取中间结果来节省时间,还是因为它在计算的早期删除了一些路径?

另外,是否可以使用二维表来显示计算 一个简单的 TSP 问题(3 或 4 个城市)?

【问题讨论】:

    标签: algorithm traveling-salesman


    【解决方案1】:

    Held–Karp 算法的动态规划过程利用了 TSP 问题的以下性质:最小距离路径的每个子路径本身就是最小距离。

    因此,本质上,我们不是以简单的“自上而下”、蛮力方法(所有可能的排列)检查所有解决方案,而是使用“自下而上”的方法,其中解决问题所需的所有中间信息开发一次而且只有一次。初始步骤是最小的子路径。每次我们向上解决较大的子路径时,我们都能够查找所有已计算的较小子路径问题的解决方案。节省时间是因为所有较小的子问题都已解决,并且这些节省成倍增加(在每个更大的子路径级别)。但是计算中没有“路径被删除”——在程序结束时,所有子问题都将得到解决。明显的缺点是可能需要非常大的内存来存储所有中间结果。

    总之,Held–Karp 算法的时间节省源于它从不重复求解城市的任何子集(组合)的解决方案。但是蛮力方法将多次重新计算任何给定子集组合的解(尽管不一定在给定的整体集合排列中按连续顺序)。

    维基百科包含一个二维距离矩阵示例和伪代码here

    【讨论】:

    • 但是有没有动态规划算法可以在早期消除一些子问题?有什么例子吗?
    • 动态编程一般不会省略子问题,而是主要依赖于记忆。相比之下,贪心算法将解决方案视为一些步骤序列,并在每个步骤中选择局部最优选择(“跳过子问题”)——但这并不能保证最优解决方案。然而,一些贪心算法(例如用于最小生成树的 Kruskal 或 Prim 算法)被证明会导致最优解。动态规划算法并不排除它可能跳过一些子问题。
    • 结合记忆和子问题遗漏的算法示例可能是国际象棋搜索。搜索可能会经常遇到已知残局或开局的换位(记忆),并且仍然经常使用启发式方法来跳过对不太有希望的候选动作的评估(跳过子问题),以便在合理的时间内产生下一步动作。
    猜你喜欢
    • 2022-10-08
    • 2021-03-29
    • 1970-01-01
    • 2019-04-08
    • 2019-12-13
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多