写在前面
笔者是某
985高校电子信息工程专业的大二学生,上学期通过智库项目参与了老师的课题,但因笔者繁重的课业压力,迟迟未能动工,主要方向是城市环境下车机协同路径规划,即综合卡车运力强、无人机灵活便捷的优点解决物流配送最后一公里难题。在本专栏,笔者会陆续更新自己在寒假期间的学习心得与体会,希望大家多多关注,如有疏漏或错误也希望各位及时与笔者联系。如果觉得笔者的文章尚有几分启迪意义,欢迎点赞关注评论。大家的支持就是笔者最大的动力!
最优化问题和NP问题
本文参考资料 :
最优化问题
在生活和学习中我们经常会碰到一些最优化问题,比如最简单的统筹规划问题:烧水沏茶时,洗水壶需要1分钟,烧开水要用10分钟,洗茶壶要用2分钟,洗茶杯要用2分钟,拿茶叶要用1分钟,如何安排才能尽早喝上茶?再比如最经典的背包问题:如何用固定容量的背包装载最大价值的货物?这些情境无不透露着效率优先的思想。最优化问题也即针对某一问题,采取某种策略,使我们的所需效益最大化。
我们最早系统接触的最优化问题应该是高中时的线性规划。举一个简单的例子,已知变量 x 和 y 满足 x >= 0,y >= 0,x + y <= 2,求 z = 2*y + x 的最大值。这类问题最常见的解法便是做出可行域,变换线性目标函数为截距型,根据图像的变化规律求出最终结果。这道题目虽然简单,却包含了最优化问题的所有特征,那接下来我们便给出最优化问题的定义:
已知 X 为设计变量,代表设计空间的一个列向量,即 X = (x1,x2 … xn)T,并且 X 满足 g i(X) <= 0 (i = 1,2 … n),(此处指代所有的约束条件,实际问题中不一定均要求满足 <= 0),求设计空间中的 X0,s.t. f(X0) = max f(X) 或者 f(X0) = min f(X)。
通常情况下 f(X) 为设计变量的连续实函数,并且假定其有二阶连续偏导数。
在以上定义的基础上,我们定义了等值面 {X | f(X) = c},其中 c 为任意常数。不难得到当设计空间为二维空间时,得到的是一条等值线。 等值面也具备一下基本性质:
- 不同值的等值面之间不相交。因为目标函数是单值函数;
- 除了极值点所在的等值面之外,不会在区域的内部中断。因为目标函数是连续函数;
- 等值面稠密的地方,目标函数值变化得比较快;稀疏的地方变化得比较慢(可以参考地理等高线的理解方式);
NP问题
一、定义
在开始介绍NP问题之前,我们先来回顾一下时间复杂度的相关概念。要全面地分析一个算法的效率,需要综合考虑算法在最坏、最好和平均情况下的时间代价。对于最坏情况,主要采取大O表示方法来描述。一般的提法是:当且仅当存在正整数 c 和 n0,使得 f(n) <= c*g(n) 对所有的 n >= n0 成立,则称该算法的渐进时间复杂度为 f(n) = O(g(n))。常见的时间复杂度有O(log2 n) < O(n) < O(nlog2 n) < O(n2) < O(n3) < O(2n) < O(n!)。
NP问题针对的就是一个问题的时间复杂度。具体定义如下:
P类问题(Polynomial Problem): 存在多项式时间算法的问题。
NP类问题(Non-deterministic Polynomial Problem): 不存在多项式时间算法,但可以在多项式时间内验证出一个正确解的问题。
NPC问题(Non-deterministic Polynomial Complete Problem): 存在这样一个NP问题,所有的NP问题都可以约化成它。
NP-Hard问题(Non-deterministic Polynomial Hard Problem): 存在这样一个问题,所有的NP问题都可以约化成它。
可以看到后两类问题的关键不同在于其本身是否为一个NP问题,而由于P类问题是可以在多项式时间复杂度内求解的,自然也可以在多项式时间内验证解的正确性,所以是特殊的NP问题。总的来说,上述问题的关系用一个Venn图可表示如下:
接下来我们再解释一下约化,假设有两个问题 A 和 B,B 本身是一个复杂度比 A 更高的问题,若对 B 的某些条件进行特殊规定后,可以退化成问题 A,则称 A 问题可以约化到 B 。(是不是有些奇怪?明明是对 B 问题进行了简化,为什么不称 B 约化为 A ?这同样是笔者在学习过程中产生的一个小疑问,欢迎大家在评论区交流讨论 但定义就是这样的)。
二、判定
介绍完几类问题的定义,那如何判定它们呢?
对于P类问题来说,往往是我们比较熟悉的算法,比如冒泡排序、矩阵乘法、快速排序等;
对于NP类问题来说,举一个解方程的例子,对于方程 x5 + 2x + 7 = 1035 来说,求解它很难,但是验证 x = 2 是它的解却很容易;
对于 NPC 和 NP-Hard 问题来说,我们首先要做的是判断其是否为 NP 问题,接着根据定义,我们需要判断是否所有的 NP 问题都能约化成它,显然这种方法的工作量过大且不现实,但如果我们借助传递性,证明一个已知的 NPC 问题可以约化成要判断的问题,那是不是也迎刃而解了呢?因为 NPC 问题本就可以由所有的 NP 问题约化而来,我们借助这一特性即可完成判定。传递过程如下:
NP 问题 --> 已知的 NPC 问题 --> 欲判定的问题
三、NPC问题举例
既然在判定的过程中需要借助 NPC 问题,那下面我们就举出21个常见的 NPC 问题,供大家学习使用:
-
布尔可满足性问题(Satisfiability):对于布尔逻辑内合取范式方程式的满足性问题(一般直接叫做SAT)
-
0-1整数规划(0-1 integer programming)
-
分团问题(Clique,参考独立集)
-
Set packing
-
最小顶点覆盖问题(Vertex cover)
-
集合覆盖问题(Set cover)
-
Feedback node set
-
Feedback arc set
-
有向哈密顿循环(Directed Hamiltonian cycle)
- 无向哈密顿循环(Undirected Hamiltonian cycle)
-
-
-
-
每句话至多3个变量的布尔可满足性问题(Satisfiability with at most 3 literals per clause,3-SAT)
- 图着色问题(Chromatic number)
- 分团覆盖问题(Clique cover)
- 精确覆盖问题(Exact cover)
- Hitting set
- Steiner tree
- 三维匹配问题(3-dimensional matching)
- 背包问题(Knapsack)
- Job sequencing
- 划分问题(Partition)
- 最大割(Max cut)
- 图着色问题(Chromatic number)
上面的层次递进关系也代表了各问题间的约化关系。故所有的 NPC 问题其实都是从 SAT 问题约化而来的,而 SAT 问题本身则是通过定义证明的。
小结
在这篇文章中,笔者主要介绍了最优化问题和 NP 问题。其中最优化问题应用比较广泛,想必大家也都有自己的切身体会;而 NP 问题实际也牵涉一个至今仍未解决的难题:P ?= NP,笔者的文字只是个人浅薄的学习体会,难免存在不严谨的地方,感兴趣的同好也可以进一步学习。在下期博客中笔者将带来一些 population-based algorithm 的介绍,特别是遗传算法。欢迎大家继续关注!