跳转到内容

P/NP问题:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
Tang891228留言 | 贡献
修飾語句
Tang891228留言 | 贡献
調整格式 排版
第1行: 第1行:
{{多個問題|
{{expert|subject=计算机科学|time=2012-07-28}}
{{Inappropriate tone|time=2015-09-07T01:28:05+00:00}}
}}
{{noteTA
{{noteTA
|G1 = IT
|G1 = IT
|1 = zh-cn:計算機; zh-tw:電腦;
|1 = zh-cn:計算機; zh-tw:電腦;
}}
{{多個問題|
{{expert|subject=计算机科学|time=2012-07-28}}
{{Inappropriate tone|time=2015-09-07T01:28:05+00:00}}
}}
}}
{{千禧年难题}}
{{千禧年难题}}
第19行: 第19行:
[[File:Complexity classes.svg|thumb|250px|假设'''P''' ≠ '''NP'''的复杂度类的图解。如'''P''' = '''NP'''则三个类相同。]]
[[File:Complexity classes.svg|thumb|250px|假设'''P''' ≠ '''NP'''的复杂度类的图解。如'''P''' = '''NP'''则三个类相同。]]


簡單來說,'''P''' = '''NP'''问题问道:如果實然问题的正面答案可以很快''验证'',其答案是否也可以很快''计算''?
簡單來說,'''P''' = '''NP'''问题问道:如果實然问题的正面答案可以很快'''验证''',其答案是否也可以很快'''计算'''?


这裡有一个给你找点这个问题的感觉的例子:
这裡有一个给你找点这个问题的感觉的例子:
第25行: 第25行:
给定一个大数''Y'',我们可以问''Y''是否是[[合数]]。例如,我们可能问53308290611是否有非平凡的[[因數]]。
给定一个大数''Y'',我们可以问''Y''是否是[[合数]]。例如,我们可能问53308290611是否有非平凡的[[因數]]。
答案是肯定的,虽然手工找出一个因數很麻烦。从另一个方面讲,如果有人声称答案是"对,因为224737可以整除53308290611",则我们可以很快用一个除法来验证。
答案是肯定的,虽然手工找出一个因數很麻烦。从另一个方面讲,如果有人声称答案是"对,因为224737可以整除53308290611",则我们可以很快用一个除法来验证。
验证一个数是除数比找出一個明顯除数来简单得多。用於验证一个正面答案所需的信息也称为''证明''。
验证一个数是除数比找出一個明顯除数来简单得多。用於验证一个正面答案所需的信息也称为'''证明'''。
所以我们的结论是,给定正确的证明,问题的正面答案可以很快地(也就是,在多项式时间内)验证,而这就是这个问题属于'''NP'''的原因。
所以我们的结论是,给定正确的证明,问题的正面答案可以很快地(也就是,在多项式时间内)验证,而这就是这个问题属于'''NP'''的原因。


第41行: 第41行:
== NP完全 ==
== NP完全 ==


要解决'''P''' = '''NP'''问题,[[NP完全|'''NP'''完全]]的概念非常有用。不严格的讲,'''NP'''完全问题是'''NP'''类中“最难”的问题,也就是说它们是最可能不属于'''P'''类的。这是因为''任何'''''NP'''中的问题可以在多项式时间内变换成为任何特定'''NP'''完全问题的一个特例。例如,[[旅行推销员问题]]的判定问题版本是'''NP'''完全的。所以'''NP'''中的''任何''问题的''任何''特例可以在多项式时间内机械地转换成旅行商问题的一个特例。
要解决'''P''' = '''NP'''问题,[[NP完全|'''NP'''完全]]的概念非常有用。不严格的讲,'''NP'''完全问题是'''NP'''类中“最难”的问题,也就是说它们是最可能不属于'''P'''类的。这是因为'''任何''''''NP'''中的问题可以在多项式时间内变换成为任何特定'''NP'''完全问题的一个特例。例如,[[旅行推销员问题]]的判定问题版本是'''NP'''完全的。所以'''NP'''中的'''任何'''问题的'''任何'''特例可以在多项式时间内机械地转换成旅行商问题的一个特例。
所以若旅行商问题被证明为在'''P'''内,则'''P ''' = '''NP'''。旅行商问题是很多这样的'''NP'''完全的问题之一。若任何一个'''NP'''完全的问题在'''P'''内,则可以推出'''P''' = '''NP'''。不幸的是,很多重要的问题被证明为'''NP'''完全,但没有一个有已知快速的算法。
所以若旅行商问题被证明为在'''P'''内,则'''P ''' = '''NP'''。旅行商问题是很多这样的'''NP'''完全的问题之一。若任何一个'''NP'''完全的问题在'''P'''内,则可以推出'''P''' = '''NP'''。不幸的是,很多重要的问题被证明为'''NP'''完全,但没有一个有已知快速的算法。


第54行: 第54行:
* 它只考虑了最坏情况的复杂度。可能现实世界中的有些问题在多数时候可以在时间''n''中解决,但是很偶尔你会看到需要时间2<sup>''n''</sup>的特例。这个问题可能有一个多项式的平均时间,但最坏情况是指数式的,所以该问题不属于'''P'''。
* 它只考虑了最坏情况的复杂度。可能现实世界中的有些问题在多数时候可以在时间''n''中解决,但是很偶尔你会看到需要时间2<sup>''n''</sup>的特例。这个问题可能有一个多项式的平均时间,但最坏情况是指数式的,所以该问题不属于'''P'''。
* 它只考虑确定性解。可能有一个问题你可以很快解决如果你可以接受出现一点误差的可能,但是确保正确的答案会难得多。这个问题不会属于'''P''',虽然事实上它可以很快求解。这实际上是解决属于'''NP'''而还不知道是否属于'''P'''的问题的一个办法(参看'''[[RP (复杂度)|RP]]''','''[[BPP_(複雜度)|BPP]]''')。
* 它只考虑确定性解。可能有一个问题你可以很快解决如果你可以接受出现一点误差的可能,但是确保正确的答案会难得多。这个问题不会属于'''P''',虽然事实上它可以很快求解。这实际上是解决属于'''NP'''而还不知道是否属于'''P'''的问题的一个办法(参看'''[[RP (复杂度)|RP]]''','''[[BPP_(複雜度)|BPP]]''')。
* 新的诸如[[量子计算机]]这样的计算模型,可能可以快速的解决一些尚未知道是否属于'''P'''的问题;但是,没有一个它们已知能够解决的问题是'''NP'''完全的。不过,必须注意到'''P'''和'''NP'''问题的''定义''是采用像图灵机这样的经典计算模型的术语表述的。所以,即使一个量子计算机算法被发现能够有效的解决一个'''NP'''完全问题,我们只是有了一个快速解决困难问题的实际方法,而不是数学类'''P'''和'''NP'''相等的证明。
* 新的诸如[[量子计算机]]这样的计算模型,可能可以快速的解决一些尚未知道是否属于'''P'''的问题;但是,没有一个它们已知能够解决的问题是'''NP'''完全的。不过,必须注意到'''P'''和'''NP'''问题的'''定义'''是采用像图灵机这样的经典计算模型的术语表述的。所以,即使一个量子计算机算法被发现能够有效的解决一个'''NP'''完全问题,我们只是有了一个快速解决困难问题的实际方法,而不是数学类'''P'''和'''NP'''相等的证明。


== 计算机科学家为什么认为P ≠ NP? ==
== 计算机科学家为什么认为P ≠ NP? ==

2018年9月29日 (六) 16:04的版本

P/NP问题是在理论信息学计算复杂度理论领域里至今未被解决的问题,也是克雷数学研究所七个千禧年大奖难题之一。P/NP问题中包含了复杂度类PNP的关系。1971年史提芬·古克(Stephen A. Cook)和Leonid Levin英语Leonid Levin相对独立地提出了下面的问题,即复杂度类P和NP是否是恒等的(P=NP?)。

P=NP

复杂度类P即為所有可以由一个确定型图灵机在多项式表达的时间内解决的问题;类NP由所有可以在多项式时间内验证它的解是否正確的决定问题组成,或者等效的说,那些可以在非確定型圖靈機上在多项式时间内找出解的问题的集合。很可能,计算理论最大的未解决问题就是关于这两类的关系的:

PNP相等

在2002年对于100研究者的调查,61人相信答案是否定的,9个相信答案是肯定的,22个不确定,而8个相信该问题可能和现在所接受的公理独立,所以不可能证明或证否。[1] 对于正确的解答,有一个1,000,000美元的奖励

NP-完全问题(或者叫NPC)的集合在这个讨论中有重大作用,它们可以大致的被描述为那些在NP中最不像在P中的(确切定义细节请参看NP-完全理论)。计算机科学家现在相信P, NP,和NPC类之间的关系如图中所示,其中PNPC类不交。

假设PNP的复杂度类的图解。如P = NP则三个类相同。

簡單來說,P = NP问题问道:如果實然问题的正面答案可以很快验证,其答案是否也可以很快计算

这裡有一个给你找点这个问题的感觉的例子:

给定一个大数Y,我们可以问Y是否是合数。例如,我们可能问53308290611是否有非平凡的因數。 答案是肯定的,虽然手工找出一个因數很麻烦。从另一个方面讲,如果有人声称答案是"对,因为224737可以整除53308290611",则我们可以很快用一个除法来验证。 验证一个数是除数比找出一個明顯除数来简单得多。用於验证一个正面答案所需的信息也称为证明。 所以我们的结论是,给定正确的证明,问题的正面答案可以很快地(也就是,在多项式时间内)验证,而这就是这个问题属于NP的原因。

虽然这个特定的问题,最近也被证明为在P类中(参看下面的关于"质数在P中"的参考),这一点也不明显,而且有很多类似的问题相信不属于类P

像上面这样,把问题限制到“是/不是”问题并没有改变原问题(即没有降低难度);即使我们允许更复杂的答案,最后的问题(是否FP = FNP)是等价的。

学术定义

更正式一些,一个决定问题是一个取一些字符串为输入并要求输出为是或否的问题。若有一个算法(譬如图灵机,或一个LISPPascal的程序并有无限的内存)能够在最多nk步内对一个串长度为n的输入给出正确答案,其中k是某个不依赖于输入串的常数,则我们称该问题可以在多项式时间内解决,并且将它置入类P。直观的讲,我们将P中的问题视为可以较快解决的问题。

现在假设有一个算法A(w,C)取两个参数,一个串w,也就是我们的决定问题的输入串,而另一个串C是“建议证明”,并且使得A在最多nk步之内产生“是/否”答案(其中nw的长度而k不依赖于w)。进一步假设:w是一个答案为“是”的例子,当且仅当,存在C使得A(w,C)返回“是”。 则我们称这个问题可以在非决定性多项式时间内解决,且将它放入NP类。我们把算法A作为一个所建议的证明的检验器,它运行足够快。(注意缩写NP代表“Non-deterministic(非确定性)Polynomial(多项式)”而不是代表“Non-Polynomial(非多项式)。)

NP完全

要解决'P = NP问题,NP完全的概念非常有用。不严格的讲,NP完全问题是NP类中“最难”的问题,也就是说它们是最可能不属于P类的。这是因为任何'NP中的问题可以在多项式时间内变换成为任何特定NP完全问题的一个特例。例如,旅行推销员问题的判定问题版本是NP完全的。所以NP中的任何问题的任何特例可以在多项式时间内机械地转换成旅行商问题的一个特例。 所以若旅行商问题被证明为在P内,则P = NP。旅行商问题是很多这样的NP完全的问题之一。若任何一个NP完全的问题在P内,则可以推出P = NP。不幸的是,很多重要的问题被证明为NP完全,但没有一个有已知快速的算法。

更难的问题

虽然是否P=NP还是未知的,在P之外的问题是已经知道存在的。寻找国际象棋围棋最佳走法(在nn棋盘上)是指数时间完全的。因为可以证明P ≠ EXPTIME(指数时间),这些问题位于P之外,所以需要比多项式时间更多的时间。判定Presburger算术中的命题是否为真的问题更加困难。Fischer和Rabin于1974年证明每个决定Presburger命题的真伪性的算法有最少22cn的运行时间,c为某个常数。这裡,n是Presburger命题的长度。因此,该命题已知需要比指数时间更多的运行时间。不可判定问题是更加困难的,例如停机问题。它们无法在任何给定时间内解决。

P真的容易处理吗?

上面所有的讨论,假设了P表示“容易”而“不在P中”表示“困难”。这是一个在复杂度理论中常见而且有一定准确性的假设,它在实践中却不总是真的,原因包括如下几点:

  • 它忽略了常数因子。一个需要101000n时间的问题是属于P的(它是线性时间的),但是事实上完全无法处理。一个需要10-100002n时间的问题不是在P中的(它是指数时间的),但是对于n取值直到几千时还是很容易处理的。
  • 它忽略了指数的大小。一个时间复杂度n1000属于P,但是很难对付。已经证明在P中存在需要任意大的指数的问题(参看时间层次定理)。一个时间复杂度2n/1000的问题不属于P,但对于n直到几千还是容易应对的。
  • 它只考虑了最坏情况的复杂度。可能现实世界中的有些问题在多数时候可以在时间n中解决,但是很偶尔你会看到需要时间2n的特例。这个问题可能有一个多项式的平均时间,但最坏情况是指数式的,所以该问题不属于P
  • 它只考虑确定性解。可能有一个问题你可以很快解决如果你可以接受出现一点误差的可能,但是确保正确的答案会难得多。这个问题不会属于P,虽然事实上它可以很快求解。这实际上是解决属于NP而还不知道是否属于P的问题的一个办法(参看RPBPP)。
  • 新的诸如量子计算机这样的计算模型,可能可以快速的解决一些尚未知道是否属于P的问题;但是,没有一个它们已知能够解决的问题是NP完全的。不过,必须注意到PNP问题的定义是采用像图灵机这样的经典计算模型的术语表述的。所以,即使一个量子计算机算法被发现能够有效的解决一个NP完全问题,我们只是有了一个快速解决困难问题的实际方法,而不是数学类PNP相等的证明。

计算机科学家为什么认为P ≠ NP?

多数计算机科学家相信PNP。该信念的一个关键原因是经过数十年对这些问题的研究,没有人能够发现一个NP完全问题的多项式时间算法。而且,人们早在NP完全的概念出现前就开始寻求这些算法了(Karp的21个NP完全问题,在最早发现的一批中,有所有著名的已经存在的问题)。进一步地,P = NP这样的结果会导致很多惊人的结果,那些结果现在被相信是不成立的,例如NP = 反NP和P = PH

也有这样论证的:问题较难求解(P)但容易验证(NP),这和我们日常经验是相符的。

从另一方面讲,某些研究者认为我们过于相信PNP,而应该也去寻找P = NP的证明。例如,2002年中有这样的声明:[1]

关于证明的难度的结果

虽然百万美元的奖金和投入巨大却没有实质性结果的大量研究足以显示该问题是困难的,但是还有一些形式化的结果证明为什么该问题可能很难解决。

最常被引用的结果之一是设计神諭。假想你有一个魔法机器可以解决单个问题,例如判定一个给定的数是否为质数,可以瞬间解决这个问题。我们的新问题是,若我们被允许任意利用这个机器,是否存在我们可以在多项式时间内验证但无法在多项式时间内解决的问题?结果是,依赖于机器能解决的问题,P = NPPNP二者都可以证明。这个结论带来的后果是,任何可以通过修改神諭来证明该机器的存在性的结果不能解决问题。不幸的是,几乎所有经典的方法和大部分已知的方法可以这样修改(我们称它们在相对化)。

如果这还不算太糟的话,1993年Razborov和Rudich证明的一个结果表明,给定一个特定的可信的假设,在某种意义下“自然”的证明不能解决P = NP问题。[2] 这表明一些现在似乎最有希望的方法不太可能成功。随着更多这类定理得到证明,该定理的可能证明方法有越来越多的陷阱要规避。

这实际上也是为什么NP完全问题有用的原因-若对于NP完全问题存在有一个多项式时间算法,或者没有一个这样的算法,这将能用一种相信不被上述结果排除在外的方法来解决P = NP问题。

多項式時間演算法

沒人知道多項式時間演算法對於NP完全問題是否存在。但是如果這樣的演算法存在,我們已經知道其中的一些了!例如下面的算法正確地接受了一個NP完全語言,但是沒人知道通常它需要多久執行。它是一個多項式時間演算法當且僅當P = NP

  // 接受NP完全語言的一個算法子集和。
  //
  // 這是一個多項式時間算法當且僅當P=NP。
  //
  // “多項式時間”表示它在多項式時間內返回“是”,若
  // 結果是“是”,否則永遠運行。
  //
  // 輸入:S = 一個自然數的有限集
  // 輸出:"是"如果某個S的子集加起來等於0。
  //         否則,它永遠運行沒有輸出。
  // 注意:  "程序數P"是你將一個整數P寫為二進制,然後
  //         將位串考慮為一個程序。
  //         每個可能的程序都可以這樣產生,
  //         雖然多數什麼也不做因為有語法錯誤。
  //         
  FOR N = 1...infinity
      FOR P = 1...N
          以S為輸入運行程序數P N步
          IF程序輸出一個不同的整數的列表
              AND所有整數都在S中
              AND整數的和為0
          THEN
              OUTPUT "是"並 停機

P = NP,则这是一个接受一个NP完全语言的多项式时间算法。“接受”表示它在多项式时间内给出“是”的答案,但允许在答案是“否”的时候永远运行。

可能我们想要“解决”子集和问题,而不是仅仅“接受”子集和语言。这表示我们想要它总是停机并返回一个“是”或“否”的答案。是否存在任何可能在多项式时间内解决这个问题的算法?没有人知道。但是如果这样的算法存在,那么我们已经知道其中的一些了!只要将上面的算法中的IF语句替换成下面的语句:

          IF程序輸出一個完整的數學證明
              AND證明的每一步合法
              AND結論是S確實有(或者沒有)一個和為0的子集
          THEN
              OUTPUT "是"(或者"不是"如果那被證明了)並停機

逻辑表述

P=NP问题可以用逻辑命题的特定类的可表达性的术语来重新表述。所有P中的语言可以用一阶逻辑加上最小不动点操作(实际上,这允许了递归函数的定义)来表达。类似地,NP是可以用存在性二阶逻辑来表达—也就是,在关系、函数、和子集上排除了全称量词的二阶逻辑。多项式等级PH中的语言对应与所有的二阶逻辑。这样,“P是NP的真子集吗”这样的问题可以表述为“是否存在性二阶逻辑能够表达带最小不动点操作的一阶逻辑的所不能表达的语言?”

花絮

普林斯顿大学计算机系楼将二进制代码表述的“P=NP?”问题刻进顶楼西面的砖头上。如果证明了P=NP,砖头可以很方便的换成表示“P=NP!”。[2]

康奈尔大学的Hubert Chen博士提供了这个玩笑式的P不等于NP的证明:[3]

反证法。设P = NP。令y为一个P = NP的证明。证明y可以用一个合格的计算机科学家在多项式时间内验证,我们认定这样的科学家的存在性为真。但是,因为P = NP,该证明y可以在多项式时间内由这样的科学家发现。但是这样的发现还没有发生(虽然这样的科学家试图发现这样的一个证明),我们得到了矛盾。

註釋

  1. ^ William I. Gasarch. The P=?NP poll. (PDF). SIGACT News. June 2002, 33 (2): 34–47 [29 December 2008]. doi:10.1145/1052796.1052804. 
  2. ^ http://www.princeton.edu/~taubetap/tours/handbook.pdf
  3. ^ http://www.cs.cornell.edu/hubes/pnp.htm

参考文献

  • Gerhard J. Woeginger. The P-versus-NP page。Lists a number of incorrect solutions to the problem.
  • A. S. Fraenkel and D. Lichtenstein, Computing a perfect strategy for n*n chess requires time exponential in n, Proc. 8th Int. Coll. Automata, Languages, and Programming, Springer LNCS 115 (1981) 278-293 and J. Comb. Th. A 31 (1981) 199-214.
  • E. Berlekamp and D. Wolfe, Mathematical Go: Chilling Gets the Last Point, A. K. Peters, 1994. D. Wolfe, Go endgames are hard, MSRI Combinatorial Game Theory Research Worksh., 2000.
  • Neil Immerman。Languages Which Capture Complexity Classes. 15th ACM STOC Symposium, pp.347-354. 1983.

延伸閱讀

外部链接

参见