近似算法
对于一个问题,有时候我们很难高效地求出问题的精确解,却能求出在一定偏差范围内的近似解。以图上的最大独立集问题为例,假设当问题的答案为时,我们的算法总能找到一个的解,那么就称这个算法为一个最大独立集问题的-近似算法。很多NP-hard问题没有多项式算法,但可以有多项式近似算法。
最小点覆盖的2-近似算法
图的一个点覆盖是一个点集,使得每条边至少有一个端点在这个点集里。最小点覆盖问题是NP-hard问题。
我们任意的一条条选边,同时保证这些边构成一个匹配(已经被选的边两两没有公共顶点),直到没有边能被加进来,这时候我们就得到了一个“极大匹配”。注意“极大”不一定是“最大”。假设这个极大匹配的边数为。
我们发现“极大匹配”中所有的顶点(个)一定能构成一个点覆盖,因为如果存在一条边没有被覆盖,那么这条边的两个顶点都不在极大匹配中,那么根据匹配的定义,这条边一定可以被加到极大匹配里,这就与“极大”矛盾了。
同时我们发现,最小点覆盖至少要有个点。我们要覆盖所有的边,至少要覆盖这条边,因此每条边至少有一个端点要被选进最小点覆盖。而极大匹配中的边是两两独立的,选某条边的一个端点只能覆盖这条中的一条。因此每条边至少要选一个点,最小点覆盖至少要有个点。
因此答案,我们已经找到了一个的答案。,因此“找极大匹配”就是一个2-近似算法。
中的等号会不会其实取不到呢?即我们能否通过“更好的分析”来发现这实际上是一个更好的近似(比如1.9)?答案是否定的,我们只需要找到一个Tight Example:构造这样一张图,它是条两两独立的边,最小点覆盖应当是,我们的算法会给出,于是我们说明了等号是会被取到的。那么我们只能说这是个2-近似算法。
考虑另外一种贪心的做法,每次选出度数最大的一个点,然后把与它相连的边全删掉。这似乎也是一种不错的近似算法,但事实证明,可以构造出一个反例使得它的近似系数达到无穷大。
Max-3SAT
我们将3SAT问题“每一项都为true(CNF输出true)”的判定问题改为“最多能使多少项为true”的优化问题,就得到了Max-3SAT问题。这也是NP-hard问题。
首先来考虑这样一个平凡的随机算法——以0.5的概率随机给每个变量赋值。我们来计算这样得到的答案的期望。根据期望的线性性,我们只需计算每项为true的概率。由于每项内部的变量是用连接的,因此false的概率只有1/8,所以true的概率是7/8。假设总共有项,我们的随机算法给出的答案期望就是。
设总共有多少项为true的随机变量为。那么成立。于是一定有或。我们已经知道算期望的算法是平凡的了(只需按照已知条件算出每一项的期望相加),我们令从而使得的那个值。接下来,成立,依次类推我们令从而有。不断迭代,最终我们得到,而左侧已经不是一个随机变量了,它是一个确定的赋值。综上,我们已经得到了一个-近似算法。
Max-Cut
把图上的点集分成两组,把所有“一端在一个点集另一端在另一个点集”的边收集在一起就称为一个Cut(割)。
Max-Cut是NP-hard问题。
考虑这样一个基于贪心的近似算法。首先把点集任意分成两组。此时如果能找到一个点,把它放到另一边会产生更大的Cut,那么就把它放另一边。不断重复上述过程,直到不能找到能产生更大Cut的点。
这个过程是多项式复杂度的,由于Max-Cut不超过总边数,每次更新Max-Cut至少加一,因此不可能更新超过总边数次;每次更新最多找总点数次,判断每个点不超过总边数次复杂度。总复杂度不超过。
对于终态我们观察到,对于中的每个点,假设它有条边连向点集,有条边连向点集。那么一定有。如果,那么把它放到中一定能产生更大的Max-Cut。中的点同理。我们可以这样统计Max-Cut——考虑每个点对Max-Cut的贡献,那么每条边会恰好被算两次。根据我们得到的不等关系,我们的算法得到的答案至少。而根据握手定理,,因此我们得到了一个大小至少为的Cut。
而显然Max-Cut。因此这至少是一个0.5-近似算法。我们可以给出一个Tight Example证明这就是一个0.5-近似算法。
这并不是最优的多项式近似算法,对于Max-Cut问题,最优的多项式近似算法可以做到0.878。
-centers
定义一个点到无向图上一个点集的距离,这个就是对应的center。问怎么选这个才能让最小。显然中点越多答案就可以做到越小,k-centers规定中只能有个点,要求最小化答案。
考虑这样一个贪心的算法:首先任选一个点加入。然后找到使得最大的那个点加进里。直到选完个。
我们来证明这是一个近似算法。我们找到的这个点集记为,标准答案的点集记为。并且设我们的答案是,标准答案是。设中的第个点为,所有以作为center的点组成点集。到就构成了对的一个划分。
如果与每个都有交集,那么根据鸽巢原理每个里面恰好有一个中的点,记为。里的每个点一定满足,因此也有。相加得到。也就是说,。因此。所以令取遍到,得到,也即。
如果存在一个与没有交集,那么根据鸽巢原理会有一个里有。根据我们的贪心算法,假设是后被选进来的那个点,这意味着。而,因此也有。
综上,,这是一个2-近似算法。一个Tight Example就是一条三个点的链,如果第一步选了边上的点那么就得到答案是2,正确答案是1。
不可近似性
我们如何证明不存在一个更优的多项式时间复杂度的近似算法呢?我们用反证法,假设这样的算法存在,然后证明它可以用来解决NP-hard问题。这就会导致P=NP,就是我们认定的“矛盾”。
Dominating Set
如果能选出图上的一个点集,使得所有不在中的点都至少有一个相邻点在中,就称为一个Dominating Set。
我们证明点覆盖判定问题可以归约为Dominating Set判定问题。对于,我们可以这样构造一个:将中的每条边拆成两条边,中间加上一个新的点;然后让所有旧点之间两两连边。假设有一个个点的点覆盖,那么在中选同样的点一定能构成一个Dominating Set。如果里有一个个点的Dominating Set,假设它包含了新点,由于新点只连接两个旧点且不连别的新点,所以每个被选的新点如果被换成相邻的旧点依然能构成一个Dominating Set。所以我们在中一定有一个至多个点(向下兼容)的Dominating Set,相应的这一定构成中的一个点覆盖。
因此Dominating Set问题是NP-hard问题。
k-centers的-不可近似性
如果有一个个点的Dominating Set,那么k-centers的答案就是1。(不考虑0)。如果没有,那么答案至少为2。
我们知道k-centers的2-近似算法复杂度是多项式的。如果我们能有一个多项式复杂度的-近似算法,如果,那么,我们能判定有一个个点的Dominating Set;如果,那么,那么,说明不存在个点的Dominating Set。于是,我们竟然可以在多项式时间复杂度内判定Dominating Set了!这将会导致P=NP,我们相信这是不可能的。