从P和NP到k-center inapproximability
填上期中的坑
P和NP
判定性问题
P问题和NP问题都是专指一类判定性问题。一般我们说一个问题是P问题或NP问题,都是说这个问题的判定性版本是P问题或NP问题。
例如:
- 最大点独立集问题:给出一张无向图 \(G\),求它的最大点独立集;
- 最大点独立集问题的判定性版本:给出一张无向图 \(G\) 和常数 \(k\),判断这张图是否有大小不超过 \(k\) 的点独立集。
或者:
- 旅行商问题:给出一张有向带边权图 \(G\),找一条环路,使得经过每个点恰好一次,且边权和最小;
- 旅行商问题的判定性版本:给出一张有向带边权图 \(G\) 和权值 \(v\),判断是否有一条环路,使得经过每个点恰好一次,且边权和不超过 \(v\)。
形式化地,一个判定性问题 \(X\) 是一个关于实例的集合(在例子中表现为答案为yes的输入),你需要判断给定的实例 \(s\) 是否满足 \(s\in X\).
容易发现,判定性问题是原问题的基础,且形式统一(都是对给定的输入判断yes或no),因此P和NP问题的研究将在判定性问题的范畴。
P问题
P(Polynomial)问题即多项式问题,指存在一种算法,使得对于任意输入,都能在输入长度的多项式级别的时间内给出正确的yes和no。
形式化地,判定性问题 \(X\) 是P问题当且仅当存在算法 \(A(\cdot)\),使得对于任意的 \(s\),\(A(s)=\begin{cases}\text{yes, if }s\in X \\\text{no, if }s\notin X\end{cases}\),且 \(\text{time}(A,s)\in\text{poly}(|s|)\),其中 \(|s|\) 表示 \(s\) 的长度。
需要注意的是,对于一个数 \(x\) ,输入长度是 \(\log x\) 级别的,因此素数判断(\(\sqrt{x}=2^{\frac12\log x}\))和01背包(\(nm=n2^{\log m}\))等算法不是多项式算法。
NP问题
NP(Non-deterministic Polynomial)问题即非确定性多项式问题,指存在一种算法,使得对于任意的输入,答案为yes当且仅当存在一个多项式级别的凭据,使得这个算法接收输入和凭据后会在输入长度的多项式级别的时间内给出yes。
形式化地,判定性问题 \(X\) 是NP问题当且仅当存在算法 \(B(\cdot,\cdot)\),使得对于任意的 \(s\),\(s\in X\) 当且仅当存在凭据 \(t\),满足 \(B(s,t_s)=\text{yes}\),且 \(|t|,\text{time}(B,s,t)\in\text{poly}(|s|)\)。
这个定义比较抽象,可以简单理解为可以在多项式时间内验证一个解(凭据)是否满足条件,这个解(凭据)用来帮助这个算法去解决原问题。例如,在最大点独立集问题的判定性版本中,我们很难在多项式时间内解出这张图是否有满足条件的点独立集,但如果给出一个点集,我们能够轻易地判断这个点集是否是一个点独立集以及集合大小是否满足条件。
另一方面,需要注意到,判断这样一个问题的答案为no是很难的,因为“存在”的否命题是“任意”,因此需要枚举所有的凭据 \(t\) 并判断是否均不满足条件,在例子中表现为枚举所有可能的点集。
显而易见,P \(\subseteq\) NP,因为在多项式可解的问题中,我们不需要辅助凭据就可以直接解决原问题,即直接令 \(B(s,t)=A(s)\)。
注意:NP并不是non-polynomial的缩写,P和NP是包含而不是互斥的关系。
P=NP吗?
NP问题是P问题吗?这是一个世纪难题。遗憾的是,现有的很多NP问题都没有找到多项式级别的算法,因此目前普遍认为P \(\neq\) NP,虽然仍未得到证实。
NPC和NPH
归约
注意到多项式的加法、乘法和嵌套所得的依然是多项式,因此在研究多项式与非多项式的范畴时,我们可以任意地进行多项式级别的转化:如果一个问题是P问题或NP问题,则转化后的问题仍然是P问题或NP问题。这个转化过程被称为归约。容易发现归约具有传递性。
例如:对于最大点独立集问题的判定性版本,如果我们将每个点看作包含这个点及其相邻点的集合,则原问题就转化为互斥集合问题的一个特殊情况。我们称最大点独立集问题的判定性版本可以归约到互斥集合问题。
如果 \(X\) 问题可以归约为 \(Y\),则可以理解为解决 \(Y\) 的难度不小于解决 \(X\),因为此时归约后的 \(X\) 是 \(Y\) 的一种特殊情况。
NP-Hard
NP-Hard是指一类问题(不一定是判定性问题),使得所有的NP问题都可以归约到这个问题。
这样的问题真的存在吗?答案是肯定的,因为所有NP问题的算法 \(B\) 都要依赖于图灵机的特性。由此可以证明,SAT问题是NP-Hard的,也因此所有SAT可以归约到问题都是NP-Hard的。
当 P \(\neq\) NP时,由反证法可知所有NP-Hard都不可能通过多项式算法解决。
NP-Complete
NP-Complete问题是NP问题和NP-Hard问题的交集,即一方面问题本身是NP问题,另一方面所有的NP问题都可以归约到这个问题。上述提到的SAT问题就是一个NPC问题。
由SAT问题得到的常见NPC问题还有:3-SAT问题、最小点覆盖问题、集合覆盖问题、最大点独立集问题、最大团问题、最小支配集问题、哈密顿路径问题、3维匹配问题、子集和问题、01背包问题、3染色问题、3划分问题等等。
容易发现,如果一个问题的判定性版本是NPC问题,那么这个问题至少是一个NP-Hard问题。
\(k\)-center及其近似算法
定义
我们称带边权完全图 \(G(V,E)\) 是一张度量图当且仅当:
- \(d(u,u)=0\);
- \(d(u,v)=d(v,u)\);
- \(d(u,v)\le d(u,w)+d(w,v)\);
其中 \(d(u,v)\) 表示 \(u\) 和 \(v\) 之间边的边权。
\(k\)-center问题被定义为:给出一张度量图 \(G(V,E)\) 和正整数 \(k\)。一个点集 \(S\) 的半径 \(r(S)=\max\limits_{v\in V}\min\limits_{s\in S} d(s,v)\)。你要找出一个点集 \(S\), 满足 \(|S|\le k\),且 \(r(S)\) 最小。
通过从最小支配集问题归约可知,这个问题本身的判定性问题是NPC的。
2-近似
\(k\)-center问题有很多的 2-近似算法,即找到的 $r(\hat{S})\le2r^* $
这些算法大体思路都是:对所有的 \(s\in S\) 定义 \(V_s=\{v\in V|s=\arg\min\limits_{s_0\in S}d(v,s_0)\}\),由三角不等式可知 \(V_s\) 中的任意两点距离不超过 \(2r^*\),进而通过一些算法从每个 \(V_s\) 中找到一个点即为原问题的 2-近似。
下面介绍一种延拓性比较强的算法:
- 猜测一个最优解,记为 \(r_0\);
- 任选一个点加入点集,并删掉所有与该点距离小于等于 \(2r_0\) 的点,重复此过程直到所有的点都被删完;
- 如果最终加入点集的点数小于 \(k\),则找到了一组答案为 \(2r_0\) 的解;
- 否则,报告猜测的 \(r_0\) 过小,无法用这个算法找到解;
- 通过不断猜测可能的 \(r_0\) (可能情况只有 \(n^2\) 种),最小的可行解就是一个 2-近似解。
分析算法,当 \(r_0\ge r^*\) 时,每个 \(V_s\) 至多会选出一个点,因此一定能找到一组答案为 \(2r_0\) 的解;而当 \(r_0< r^ *\) 时,则可能会找不到解。因此 \(2r^ *\) 是一个紧界,即通过这个算法不能保证找到一组优于 \(2r^ *\) 的解。
\(k\)-center inapproximability
以下都是个人定义,如有错误欢迎指正!
强算法与弱算法
是否存在一个优秀的 \((2-\varepsilon)\)-近似算法(\(0<\varepsilon<1\))呢?对于原问题,直接分析会很困难,但是我们可以借鉴上述的 \(2\)-近似算法的思路。我们作出如下定义:
- 强算法:对于给定的 \(G\) 和 \(k\),\(A_s(G,k)\) 会给出一组解 \(\hat{S}\),满足 \(r(\hat{S})\le(2-\varepsilon)r^*\);
- 弱算法:对于给定的 \(G\) 和 \(k\),以及猜测的 \(r_0\),当 \(r_0\ge r^*\) 时 \(A_w(G,k,r_0)\) 一定会报告yes并给出一组解 \(\hat{S}\),满足 \(r(\hat{S})\le(2-\varepsilon)r_0\);而当 \(r_0< r^ *\) 时,\(A_w(G,k,r)\) 可能会返回报告no。
强算法和弱算法是可以相互转化的:
- 强算法 \(\to\) 弱算法:直接令 \(A_w(G,k,r_0)=\begin{cases}A_s(G,k)\text{, if }r(A_s(G,k))\ge(2-\varepsilon)r_0 \\ \text{no, otherwise}\end{cases}\) 即可;
- 弱算法 \(\to\) 强算法:猜测所有可能的 \(r_0\) (可能情况只有 \(n^2\) 种),最小的可行解就是一个 \((2-\varepsilon)\)-近似解,即 \(A_s\) 的一组解。
进而我们可以得知,强算法是NP-Hard当且仅当弱算法是NP-Hard。因此对于这个原近似算法也就是强算法,我们只需要分析弱算法的难度即可。
约定性问题
通过转化得到的弱算法依旧有一个问题:这个算法是有一定的非确定性的。当 \(r_0< r^*\) 时,弱算法并不保证给出no,因此弱算法的问题本身并不是一个完美的判定性问题。
我们现在要做的,就是对给定的输入加一些约定,使得这个算法的输出应该是确定性的。这样弱算法的问题就变成了一个判定性问题,进而可以通过归约来解决。
注意到我们始终遗漏了一个条件 \(r^*\) 是问题的最优解。因此:
- 当弱算法报告yes并给出解 \(\hat{S}\) 时,一定有 \(r^*\le r(\hat{S})\le(2-\varepsilon)r_0\) ;
- 当弱算法报告no时,一定有 \(r_0< r^*\)。
这样当 \(r_0< r^*\le(2-\varepsilon)r_0\) 时,弱算法的输出是非确定性的,而除此以外的情况,弱算法的报告(yes或no)都是确定的。那么我们干脆删掉这种情况,即对弱算法的问题的输入加上约定:要么 \(r^ *\le r_0\),要么 \(r^*>(2-\varepsilon)r_0\),这样弱算法的问题就变成了一个确定的、完美的判定性问题。
此时我们可以重新陈述这个约定性问题:
- 给出图 \(G\)、正整数 \(k\) 以及 \(r_0\),保证要么 \(r^ *\le r_0\),要么 \(r^*>(2-\varepsilon)r_0\)。判断究竟是这两种情况中的哪一种。
约定性问题的归约
在此我们只剩下最后一步:通过将其它NPC问题归约到这个约定性问题,进而证明这个问题是NPC问题。
我们考虑支配集问题。对于支配集问题中的图 \(G'\),我们构造度量图 \(G\),使得对任意的 \(u\neq v\), \(d(u,v)=\begin{cases}1\text{, if }(u,v)\in G' \\ 2\text{, otherwise}\end{cases}\)。
此时令约定性问题的 \(k\) 为支配集问题中的 \(k'\),\(r_0\) 为 \(1\),则 \(G'\) 中存在一个大小不超过 \(k'\) 的支配集当且仅当 \(r^ *\le r_0\)。进而我们说明了支配集问题可以归约到该约定性问题。
于是我们有:支配集(NPC)\(\to\)约定性弱算法的问题(NPC)\(\to\)弱算法的问题(NP-Hard)\(\to\)强算法的问题(NP-Hard),也即对任意的 \(0<\varepsilon<1\),\(k\)-center 的 \((2-\varepsilon)\)-近似是NP-Hard的。
当 P \(\neq\) NP 时,NP-Hard问题不能在多项式时间内解出,因此不存在一个多项式时间的 \((2-\varepsilon)\)-近似算法。
Q&A
Q:这些东西有什么用?
A:帮助你更好地理解NP、NPH、NPC的关系以及\(k\)-center inapproximability的思考过程。
Q:这些东西有什么用?
A:帮助你更好地理解算法设计课上的内容,从而应对期中考试。
Q:这些东西有什么用?
A:……我不知道(
Q:你写的太烂了!
A:以下是原笔记: