经常听到老师讲,某一个问题(比如说,车辆路径规划问题Vehicle Routing Problem)是一个NP-Hard问题,此外,我们在阅读文章的时候,也经常会读到某一个问题是NP-Hard问题的陈述,与此同时,我们会看到NPC问题、P问题与NP问题。那么这些问题之间究竟是如何定义的呢?这些“问题们”究竟是什么关系呢?
一、前期知识
(1)关于时间复杂度
时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。
比如说,不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度。
再比如,数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),比如找n个数中的最大值;而像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O(n^2)的复杂度。
(2)关于约化
即如果能找到这样一个变化法则,对任意一个程序A的输入,都能按这个法则变换成程序B的输入,使两程序的输出相同,那么我们说,问题A可约化为问题B。就是说,问题A可以“变成”问题B,我们可以用问题B的解法解决问题A。也就是说,问题B是要更难的,B的时间复杂度高于或者等于A的时间复杂度。
二、问题概念
(1)P问题: Polynomial Time Problem, 是指的能在多项式时间内解决的问题;
(2)NP问题: Non-deterministic Polynomial Time Problem, 不能在多项式时间内解决或者说是无法确定能不能在多项式时间内解决,但是能在多项式时间内验证一个解的问题;
(3)NPC问题: NP Complete Problem, 也称NP完全问题,指的是所有NP问题在多项式时间内都能约化(Reducibility)成它,并且它本身就是一个NP问题的问题。换句话说,如果解决了此NPC问题,那么所有的NP问题也都能得到解决;
(4)NPH问题: NP Hard Problem, 也称NP难问题,所有NP问题在多项式时间内都能约化(Reducibility)到它的问题,但它本身不一定是NP问题。
从上面的图形中,我们也做出如下的解释和说明:(图片来源于https://mp.weixin.qq.com/s/81vVCe8ZEVHSkT-AmA__ng)
NPC问题是指要满足如下两个条件的问题:
该问题是一个NP问题;
所有的NP问题都可以在多项式时间内约化到该问题。
关于NP-Hard问题
如果一个问题被归属到NP-Hard问题,那么直到P=NP问题被验证之前,NP-Hard问题都不能在多项式时间内被解决。换句话说,如果我们发现一个问题是NP-Hard问题,那么我们(一般情况下)就没有必要花精力去试图找到一个高效算法(如多项式时间)求解,相反,可以关注近似算法等来解决该类问题。这些近似算法有很多,而群智能算法就属于这些近似算法。