NP难问题

Posted 你好vinn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NP难问题相关的知识,希望对你有一定的参考价值。

摘自网址https://blog.csdn.net/u014295667/article/details/47090639

              https://blog.csdn.net/bitcarmanlee/article/details/51935400 

P类问题:在多项式时间内可解的问题。

NP类问题(Nondeterminism Polynomial):在多项式时间内“可验证”的问题。也就是说,不能判定这个问题到底有没有解,而是猜出一个解来在多项式时间内证明这个解是否正确。

NPC类问题(Nondeterminism Polynomial complete):存在这样一个NP问题,所有的NP问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的NP问题都解决了。其定义要满足2个条件: 

  • 首先,它得是一个NP问题;
  • 然后,所有的NP问题都可以约化到它。

要证明npc问题的思路就是: 

  • 先证明它至少是一个NP问题,
  • 再证明其中一个已知的NPC问题能约化到它。

NP难(NP-Hard)问题  即多项式复杂程度的非确定性问题。                                                                                                                                                                                         它满足NPC问题定义的第二条但不一定要满足第一条(就是说,NP-Hard问题要比NPC问题的范围广,NP-Hard问题没有限定属于NP),即所有的NP问题都能约化到它,但是他不一定是一个NP问题。

 

                                                                                                                                                                                                                                                NP-Hard问题同样难以找到多项式的算法,但它不列入我们的研究范围,因为它不一定是NP问题。即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍然无法得到多项式级的算法。事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。

最具代表性的NP-Hard问题:TSP

旅行推销员问题是数图论中最著名的问题之一,即"已给一个n个点的完全图,每条边都有一个长度,求总长度最短的经过每个顶点正好一次的封闭回路"。

售货员旅行问题 (traveling salesman problem),是最具有代表性的NP问题之一。假设一个推销员需要从香港出发,经过广州,北京,上海,…,等 n 个城市, 最后返回香港。 任意两个城市之间都有飞机直达,但票价不等。现在假设公司只给报销 C 块钱,问是否存在一个行程安排,使得他能遍历所有城市,而且总的路费小于 C?
推销员旅行问题显然是 NP 的。因为如果你任意给出一个行程安排,可以很容易算出旅行总开销。但是,要想知道一条总路费小于 C 的行程是否存在,在最坏情况下,必须检查所有可能的旅行安排! 这将是个天文数字。
这个天文数字到底有多大?目前的方法接近一个一个的排着试,还没有找到更好可以寻得最短路径的方法。对七个城而言,共有 6!=720 个排法,还比较简单;,但若有 20 个城,则排法就有 19! 种。因故在排列组合里 n! 写起来轻松。但 1.21∗10171.21∗1017 是一个大得不得了的数字。若每秒钟排一次,要排 3.84∗1093.84∗109 年(一年约为 3.15∗1073.15∗107 秒),即使使用计算器,每秒排一百万次(不容易做到)也得重做三千年才能找到答案。「生也有涯,知也无涯」,想不到区区二十个城,要三十个世纪才能找到答案。

 

以上是关于NP难问题的主要内容,如果未能解决你的问题,请参考以下文章

NP问题真的很难理解

overfitting问题,P类问题,NP类问题,NPC类问题,NP难问题

什么是 NP 和 NP 完全问题? [关闭]

组合优化的一般模型

P问题NP问题NPC问题

numpy 数组到一个文件,np.savetxt