处理难治性:NP完全问题


43

假设我是一名程序员,并且有一个NP完全问题需要解决。有哪些方法可以解决NPC问题?是否有关于此主题的调查或类似内容?


4
陈述您遇到的问题将很有用。
戴夫·克拉克

2
这个问题与特定问题无关。我想知道这些技术,以便将来在需要时可以应用它们。
2012年

1
这就像在问:一般如何解决多项式时间中的问题?问题不胜枚举,每个问题都有其自己的专业解决方案。
戴夫·克拉克

3
@DaveClarke:有成熟的技术,所以我认为这个问题是有效的;不过,更集中的问题可能会更好。
拉斐尔

Answers:


54

有许多经过深入研究的策略;哪种情况最适合您,取决于具体情况。

  • 改善最坏情况的运行时间
    使用特定于问题的见解,您通常可以改善朴素的算法。例如,对于 c < 1.3 [1],有用于Vertex Cover的算法。与天真的 Ω 2 n相比,这是一个巨大的改进,并且可能使与您相关的实例大小易于处理。ØCñC<1.3Ω2ñ

  • 改善预期的运行时间
    使用启发式方法,您通常可以设计在许多实例上快速运行的算法。如果这些内容包括您在实践中遇到的大多数内容,那么您就是黄金。例如SAT(存在相当多的求解器)和Simplex算法(它可以解决多项式问题)。一种经常有用的基本技术是分支和绑定

  • 限制问题
    如果您可以对输入进行更多假设,则问题可能会变得容易。

    • 结构属性
      输入的属性可能具有简化解决问题的属性,例如,平面性,二部性或缺少图的次要特征。有关易于使用CLIQUE的图类的示例,请参见此处
    • 输入的边界函数
      要看的另一件事是参数化的复杂度;有些问题在时间内可解 ķ一些实例参数(最大节点度,最大边权重,...)和恒定。如果您可以通过设置中的 n中的对数函数将 k绑定,则可以得到多项式算法。赛义德·阿米里(Saeed Amiri)在回答中提供了详细信息Ø2ķñķķñ
    • 边界输入量
      。此外,一些问题承认算法在运行伪多项式时间,也就是它们的运行时,通过在一个多项式函数限定数目是输入的一部分; 天真的素数检查就是一个例子。这意味着,如果实例中编码的数量具有合理的大小,则可能有一些简单的算法可以很好地满足您的需求。
  • 削弱结果
    这意味着您可以容忍错误或不完整的结果。主要有两种口味:

    • 概率算法
      您只有以一定的概率获得正确的结果。有一些变体,最著名的是蒙特卡洛算法和拉斯维加斯算法。一个著名的例子是Miller-Rabin素数检验
    • 近似算法
      你不再找最佳解决方案,但几乎最优的。一些算法允许误差的相对(“不小于最优值的两倍”),而其他算法则允许误差的绝对(“不小于加上最优值”)界限。对于许多问题,可以近似地估计它们的程度是开放的。有些可以在多项式时间内任意近似,而有些则不允许这样做。检查多项式时间近似方案的理论。5

请参阅Hromkovič的《关于难题的算法》,以进行全面处理。


  1. 简单就是美: Chen Jianer,Iyad A. Kanj,Ge Xia(2005)改进了顶点覆盖上限

4
当然,蒙特卡洛算法或拉斯维加斯算法不太可能在NP难题上在多重时间运行
Sasho Nikolov

12

其他答案从更理论的角度解决了这个问题。这是一种更实用的方法。


对于“典型的” NP完全决策问题(“是否有满足所有这些约束的问题?”),这是我始终会首先尝试的方法:

  1. 编写一个简单的程序,将您的问题实例编码为SAT实例

  2. 然后使用一个好的SAT求解器,运行它(使用您碰巧拥有的最快的多核计算机),然后看看会发生什么。

首先尝试使用较小的实例,以了解可能需要花费多长时间。


经常令人惊讶的是,这种方法比尝试专门针对当前问题实现自己的求解器好得多:

  • SAT求解器非常聪明且经过优化。它们很容易胜过您自己的回溯搜索实现(无论您浪费了多少时间来优化代码)。它们还很容易胜过许多现有的替代方案,例如整数线性规划求解器。

  • 这需要很少的编程。步骤1相对简单,对性能也不重要。您可以使用脚本语言,例如Python。其他人已经负责实现步骤2所需的一切。


对于典型的NP-hard 优化问题(“找到满足所有这些约束的最小问题),此方法可能有效或无效。

如果您可以轻松地将其变成决策问题 “是否存在满足所有这些约束的4号大小的东西?”“ 3号大小呢?”),那么,对上述决策问题采取与上述相同的方法即可。

否则,您可能希望借助启发式求解器尝试找到一个小的解决方案(不一定是最小的解决方案)。例如:

  1. 将您的问题编码为(加权) MAX-SAT实例

  2. 使用UBCSAT软件包中的启发式求解器。启发式求解器微不足道地并行化;尝试查找包含数百台计算机的计算机集群。您可以根据需要运行求解器,然后采用迄今为止找到的最佳解决方案。


8

参数化的复杂度

攻击难处理性的一种方法是在参数化的复杂性上下文中考虑问题。

ķFķpñķFķ只是一些可计算函数。FPT有许多NP难题,但是,NP中有许多问题被认为不是固定参数可处理的。

ØñFķ

这些是W层次结构不同类别中的一些示例:

  1. 顶点覆盖为FPT(无向图上的顶点不相交路径也是如此)
  2. 独立集和集团都是W [1]-完全的
  3. 支配集是W [2]-完成。

这些是复杂度的另一个级别,可以更精确地对NP问题进行分类,如果需要更多,可以查看Downey等人(1998年)的“ 参数化电路复杂度”和“ W层次结构”

如果您想了解更多信息,那么可以阅读Flum和Grohe的参数化复杂性理论

最后:

参数化复杂度与近似算法:

众所周知,如果问题具有FPTAS(完全多项式时间逼近方案),那么它也是FPT(这很明显),但是没有反向的众所周知的东西,也有一些关于PTAS和XP的关系的著作,但是PTAS和W层次结构之间的关系不是很紧密(至少目前我还不知道)。

同样在某些情况下,我们可能会修复一些不同的参数,例如:图中最长路径的长度是有界的,而解决方案的大小是有界的(例如,在反馈顶点集中),...

示例实际用法:

可能有些人认为参数化的复杂性在实践中是没有用的。但这是错误的。当您可以修复一些参数时,在实际应用中会发现许多参数化算法,下面是一个示例:

  1. 22Øñ2Øķķ=10

  2. 用于TSP的最快,最准确的启发式算法之一是:巡回合并和分支分解,它使用问题的参数化(不是直接进行,而是基于一些良好的假设而使用的分支分解和动态规划方法)。


5

NP完整性是最坏情况下的难处理性。根据您要解决的问题,在实践中可能会在合理的时间内解决许多类的实例(尽管您可能需要更专门的算法才能获得良好的运行时)。

考虑查看是否可以将您的问题有效地减少为具有良好求解器的问题,例如布尔可满足性或整数线性编程。


4

v一世vĴvķGG使用可容忍的算法在指数时间内解决问题。在指数算法中,当问题的输入大小小于特定值时,其中某些算法的运行时间可以忍受。


2

尽管在某些答案中进行了简要介绍,但让我强调,在实践中,NP完全问题一直都得到解决(或近似)。在实践中可以解决NP完全问题的主要原因是:

在实践中遇到的实例不是“最坏情况”。

出现差异的另一个原因是:

正式地分析启发式算法是困难的。

在实践中,您使用启发式算法来解决NP完全问题,并希望达到最佳效果。结果通常是惊人的。

其他答案中涉及的另一个问题是:

有时指数算法足够快。

那当然取决于问题。当涉及大数据时,我们有相反的准则:

有时,唯一可行的算法是拟线性的。


恐怕这里的人群理论上比较偏心。您可能会在主要的stackexchange网站上获得更好的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.