近似算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

近似算法
12.1 简介
到目前为止,我们已经学习了很多可以在多项式时间内高效解决的问题,我们可以很快速的解决这些问题。

然而,在下面几讲,我们将考虑一些不知道如何高效解决的问题。

12.1.1 NP-完全性问题
在学习这些问题的时候,我们会遇到这个概念NP-完全性。

NP-完全性问题是由很多组合和最优化问题组成,这些问题都有两个共同点:
z没有很高效的算法;然而,我们可以在指数时间内解决这些问题。

z有高效的缩影存在于所有其他的NP-完全性问题中;因此,如果我们有一个黑盒,它能解决其中的一个问题,那么我们就能够高效的解决所有的问题。

下面就列举了一些NP-完全性问题的例子。

除了SAT的每一个问题都可以被阐明为最优化问题,尽管严格来说,它取决于每一个问题的NP-完全性。

另一方面讲,存在一个与SAT相关的最优化问题,称为MAXSAT。

在这个问题中,我们给出一个布尔公式,我们必须找到一些变量的赋值来最大化的满足子句。

可满足性问题(SAT):给定一个布尔公式,是否存在一个变量的赋值使得它满足此公式(即使公式的值为真)?
装箱问题:给定一些箱子和物品,这些物品有着特定的大小,这些箱子有着一定的容积,求出能容纳这些物品的所需的最小箱子数。

最大独立子集问题:给定一个图,找出节点的最大子集,使得在这个子集中没有两个节点是相互连接的。

背包问题:给定一个能容纳一定大小的背包和一些物品,这些物品有着特定的大小和价值,求出此背包能容纳的最大价值量。

并行机器调度问题:给定一组相同的机器和一组任务,这些任务都有特定的所需时间,求如何分配任务给这些机器,使得所有的机器完成分配给它们的任务所需的时间最小。

旅行商问题:找出一个最短路径使得旅行商从一个城市出发,最后又回到该城市,并且要求每一个城市只能经过一次。

所有的这些问题不能依赖于这个假定P≠NP高效的解决。

尽管这个推测还没有被证明,但是我们可以相信它是正确的,所以我们可以简单的假定P≠NP。

12.1.2 解决NP-完全性问题
如果我们不知道如何高效的解决NP-完全性问题,那我们应该怎么做呢?
启发式:一种可能性就是放弃寻求多项式算法,取而代之的是集中开发启发式的算法,它在实践中接近于多项式的时间复杂度。

但是一般来说,很难找到低于指数级的算法,达到这样的目标是有分歧的(关于P和NP问题是否相同)。

一般情况分析:与其分析这些算法的最坏情况下的性能,我们不如分析某一类特定输入
下的算法行为。

这取决于某些特定输入实例的分布情况。

但是,使用不同的分布又会有很大的差别。

近似算法:我们试图找到多项式时间的近似算法,它们被证明是近似正确的。

12.2 最优化问题
在我们讨论近似算法之前,我们必须为最优化问题定义一些术语。

定义1 一个最优化问题有一组问题实例(problem instances)。

定义2 每一个实例I 都有一个解集。

()S I 定义3 最大/最小化问题就是找到一个解()s S I ∈,能达到最大/最小化的目标值()f s 。

我们假定f 的输入和输出都是整数(由多项式级的位数组成)。

定义4 实例I 得到的最优解值()f s ,用表示。

()OPT I 12.1.1给出的每一个最优化问题的例子都符合这个最优化的结构。

例如,最大独立子集
问题。

每一个问题实例都是一个图;图的解集都是由节点的所有子集组成,在每个子集中,没有两个顶点是互相连接的。

解的值就是在这个子集中的节点的个数。

尽管我们喜欢把这些最优化问题归于NP-完全性问题,但是这个术语经常为决策(判定
问题)问题所保留。

所以,我们用NP-难这个概念来代替。

定义5 如果一些其他的NP-难问题能够在多项式的时间内解决,那这样的最优化问题称为NP-hard 。

一般情况下,NP-hard 问题对应于决策问题,它的最优解至少(或至多)是某个值
的问题。

()OPT I K
12.3 绝对近似算法
定义 6 近似算法就是在多项式时间内的算法,当给定一个实例I 时,返回解空间中的一个解。

()S I s 例如:在装箱问题中,一种可能的近似算法就是简单的把每一个物品放入一个箱子里。

但是这样做质量不高。

为了提高质量,我们考虑绝对近似算法。

定义7 给定一个实例I ,一个α-绝对近似算法就是找到一个解值至多是()OPT I α+。

我们需要指出的是这个定义只有针对最小化问题行得通,一个最大化问题的α-绝对近
似算法将返回的解值至少是()OPT I α−。

我们注意到当我们设计一个绝对近似算法的时候,我们希望α值越小越好。

12.3.1 图着色算法
考虑这样一个平面图的着色问题,在这个问题中,我们给定一个平面图,我们必须找出
一个顶点的着色方式,使得没有两个相邻的顶点着同样的颜色。

就像下面的定理所陈述的那样,这个问题就有一个绝对近似算法。

定理1 平面图着色问题都存在一个2-绝对近似算法。

证明:根据5色定理,每一个平面图都可以用5种颜色满足条件。

更进一步,空图(即没有边的图)可以用一种颜色,二分图可以用2种颜色满足条件,然而所有其他的图都需要至少3种颜色。

这种观察,可以让我们得出下面的一种算法:
1. 如果这个图是空图或者二分图,可以用最优的方式着色。

2. 其他情况下,用5种颜色着色。

因为这个算法只需要5种颜色,最优情况下,颜色的数量是3种,那么它就是2-绝对
近似算法。

我们可以再考虑边着色的问题。

不像平面图着色那样,边着色问题所需的颜色数量没有
固定的上界,因为的最优值的下界是由顶点的最大度数 决定的。

不过,我们有下面的定理:
()OPT I
定理2 任一个图的边着色至多使用 +1种颜色。

因为这个定理证明是具有建设性的,它能为我们提供一种算法:能找到比最优情况下至
多用一种颜色的方法给边着色。

推论1 边着色问题存在一个1-绝对近似算法。

12.3.2 通过缩放证明负面的例子
尽管这些着色问题都存在绝对近似算法,但是大部分的NP-难问题都不存在。

事实上,
对于这些问题的大部分,我们可以证明,绝对近似算法是不存在的,除非P 等同于NP 。

这个证明使用一种称为scaling(缩放)。

在缩放中,我们首先增加实例的某些参数值,然后我们就可以看出,如果一个绝对近似算法存在的话,它能够为一个修改过的实例得到解,那么这个解再回缩就能够为原来的实例产生一个最优的算法。

但是这就暗示着NP-难问题存在一种高效的算法,那么P 就等同于NP 。

下面的两个例子就证明了这种scaling 技术。

引理 1 背包问题不存在绝对近似算法。

证明:
考虑一个背包问题的实例I ,每一个物品i 都有其价值i p ,我们假定有一个α-绝对近似
算法A 。

如果我们把每一个物品的价值增大到2i p 来形成一个新的实例2I ,那么产生的最优算法就是原来最优算法的2倍,因为原来物品的设置能产生而现在产生的价值为2。

如果我们在实例(2)OPT I ()OPT I ()OPT I ()OPT I 2I 上运行这个绝对近似算法A ,那么我们就能得到一个解法至少是ε(2)2()OPT I OPT I αα−=−。

最后,我们可以用2除,那
么我们就能得到原来实例的一个解()/2OPT I α−,因此,我们可以提高α的值为/2α。

一般来说,缩放原实例I ,缩放因子为,然后再用除解值,那么我们就把r r α降低为
/r α。

因此,如果我们选择为r ⎡⎤α2,那么我们就把α降低为α/⎡⎤α2≤1/2,那就意味着对实例I 的解的值至少是s ()1/2OPT I −。

假定实例I 的大小和价值是整型,能达到的最优解也是整型,所以一定等于。

因此, 我们解决背包问题的整型实例有高效的算法,那么就与我们的假定P≠NP 相矛盾。

()OPT I s ()OPT I
引理 2 最大独立子集也不存在绝对近似算法。

证明:
假定我们有个α-绝对近似算法A 。

如果我们修改实例I (通过复制该图),新实例称为
2I ,2I 中的最优独立子集的元素个数是I 中的2倍。

因此,等于,那么意味着在实例(2)OPT I 2(OPT I )2I 上运行算法A 产生的独立子集的大小至少是(2)2()OPT I OPT I αα−=−。

为了转换这个解来适合原来的实例I ,我们必须记住2I 中独立子集的顶点个数。

其中一个图必须包含至少一半的这些顶点,因此,那么这个图的独立子集的大小至少是(2())/2()/2OPT I OPT I αα−=−,意味着我们减小α为/2α。

为了使结论一般化,如果做⎡⎤α2个的图的副本,我们能够利用算法A 来找到I 实例的独立子集的大小至少为。

但是这个必须等于,因为顶点的个数是整型。

那么,我们就有解决最大独立子集的高效算法,那么就与之相矛盾。

()1/2OPT I −()OPT I
12.4 相对近似算法
因为绝对近似算法存在于太少的优化问题当中,所以我们有一种更好的近似算法就是相
对近似算法。

因为它们应用如此普遍,我们简单的把它们称为近似算法。

定义8 一个α-近似算法就是能找到一个解值最多是*(OPT I )α。

需要指出,虽然α的值能随着输入的大小而改变,那我们只考虑常量的情况。

为了阐
明α-近似算法的设计与分析,让我们考虑并行机器调度问题,负载平衡的普遍形式。

并行机器调度:给定台机器和个作业,每个作业的处理时间是m i m n j p ,给每个机器分配作业,使得负载 (所有机器完成分配的作业所需的时间)最小。

在调度符号中,
∑∈i
j j p max
这个问题可以被描述为。

max ||P C 解决这个问题的最自然的方法就是利用贪心算法,称为list scheduling(列表调度)。

定义9 一个列表调度算法就是分配作业给机器,分配每一个作业给具有最小负载的机器。

需要指出,处理作业的顺序并没有指定。

为了分析列表调度的性能,我们必须将每一个
实例I 的解(称这个解为()A I )与最优解相比较。

但是我们并不知道如何得到的分析表达式。

然而,如果我们能找到的下界,并能证明对于某个()OPT I ()OPT I ()OPT I ()LB I α,有()()A I LB I α≤i ,那么我们就能得到
()()A I LB I α≤i
()OPT I α≤i
利用的下界的方法,我们现在就可以得出列表调度的性能。

()OPT I 引理3 列表调度是为并行机器调度提出的一个2-近似算法。

证明:
考虑下面的最优负载的两个下界
()OPT I z 最大的处理时间max j j p p =
z 平均负载是=。

L ∑j j m p /最大处理时间p 很明显是一个下界,该机器完成所分配给它的任务所需要的时间至少
是p 。

平均负载也是一个下界,需要指出,如果所有的机器都能在少于的时间内完成它的任务,那么最大负载就小于平均值,这个是相互矛盾的。

现在假定机器有最大的运行时间,作业L i m max C j 是分配给该机器的最后一个作业。

当分配该作业j 时,必须有最小的负载量(),因为列表调度会分配每个作业给具有最低负载的机器。

因此,≤average load when i m i L i L j assigned≤final average load ,因为平均负载只能增加。

把L j 分配给,至多增加i L i L p ,那就意味着
max j C L ≤+p OPT I ≤L
L p ≤+
2()( and p Are lower bounds for )
()OPT I
解返回最大值,因此列表调度是并行机器调度的一个2-近似算法。

max C 我们也许通过修改列表调度,使任务按照处理时间的降序排列,那我们有可能得到4/3-
近似算法。

更进一步,需要指出,列表调度是一个在线算法,更新的在线算法能够达到1.8。

12.5 多项式近似方案
一个很明显的问题就是我们能达到的α最好是多少?
定义10 一个多项式方案(PAS)是一个算法{A ε}的集合,其中每一个A ε都是多项式时间的1+ε-近似算法。

因此,给定任何一个ε>0,PAS 就能找到一个算法使其达到1+ε-近似。

那么我们如何
设计PAS 呢?最通用的方法就是用-列举法。

K 定义11 使用k -enumeration (-列举法)的近似算法能够为这个问题的个最重要的元素找到最优解,然后用近似多项式时间的方法来解决其余的问题。

K k 例如,用-列举法来解并行机器调度问题,如下:
k 1. 为个最大的作业找出所有的分配方案。

k 2. 列表调度其余的作业。

3. 返回具有最小负载的分配方案。

需要指出,为个最大作业找出所有的分配方案时,
这个算法总能为这些作业找到最优的分配方案。

下面的例子就证明了这个算法能够为我们提供PAS 。

k 引理4 对于任一个固定的,k -列举法能够为并行机器调度产生一个多项式近似方案。

、 m 证明:
就像在引理3中证明的那样,让我们考虑机器,最大运行时间是,i m max C j 是分配给的最后一个作业。

如果这个作业不属于个最大的作业,那它应采用列表调度,在这个时候,至少有最大的作业已经分配完毕。

因此,当作业i
m k j 被分配的时候,平均负载()至少是,那就意味着
assigned L */j k p m j P ≤k mLassigned ≤k mL
因为是max C j p 和在j 之前的上已经分配的作业的总和(Claim3中已经证明了,至多
是),则我们有
i m L max j C L ≤+p
(1m L k
≤+ (1()m OPT I k
≤+ 给定一个ε>0,如果我们让等于k /m ε,则 max (1)()C OPT I ε≤+
如果j 属于k 个最大的作业,那么这个条件也是成立的。

在这种情况下,j 是最优分配。

因此才等于。

最后,为了决定算法的运行时间,需要指出,因为每一个最大的作业都可以分配给m 台机器中的任何一个,则有max C ()OPT I k /k m m m ε=可能的分配方式。

因为列
表调度每一次分配作业需要的时间,所以总的运行时间为()O n /(m O nm )ε,它是一个多项
式的时间,因为是固定的。

因此,如果给定m ε>0,那么算法是1+ε-近似,因此我们有一个多项式近似方案。

很明显,我们想执行一个近似算法,其中不是固定的。

为了达到这个目标,我们第
一步,让我们考虑并行机器调度,其中问题中只有(类型)大小的作业,k 约定是一个常量。

在这种情况下,有可能利用动态规划的方法找到一个多项式时间的解决方案。

需要指出,每一个作业集合都可以用“轮廓”来描述,即每一个种类型作业的数量,并且可能的”轮廓”的数量至多是,输入的个数是多项式。

动态规划来计算这个函数m k k n 12(,...,)k M a a a ,在某个固定的时间T ,最少数量的机器需要完成个类型为i 的作业。

用i a X 来表示一个机器在
时间T 内完成的作业个数,并且用X 来初始化表中的项,剩下的项用下列公式来计算 121122(,...,1min (,,...,)k k )k M a a a M a x a x a x =+−−−,,...,)k 12(x x x X ∈,
因此,来完成一个轮廓 所需要的最小数目的机器可以这样来得到,通过不停的去除
掉所有可能的单个机器轮廓,并查看完成剩余的所需要的最小数目的机器。

最后,为了得
到完成所有的作业所需要的最优时间,动态规划可以用来在时间T 内完成二分查找的
“子程序”。

y y。

相关文档
最新文档