收藏 分享(赏)

算法分析与设计 近似算法.ppt

上传人:精品资料 文档编号:10800662 上传时间:2020-01-10 格式:PPT 页数:39 大小:218KB
下载 相关 举报
算法分析与设计 近似算法.ppt_第1页
第1页 / 共39页
算法分析与设计 近似算法.ppt_第2页
第2页 / 共39页
算法分析与设计 近似算法.ppt_第3页
第3页 / 共39页
算法分析与设计 近似算法.ppt_第4页
第4页 / 共39页
算法分析与设计 近似算法.ppt_第5页
第5页 / 共39页
点击查看更多>>
资源描述

1、第11章 近似算法,11.1 概 述,11.2 图问题中的近似算法,11.3 组合问题中的近似算法,11.4 实验项目TSP问题的近似算法,11.1 概 述,11.1.1 近似算法的设计思想,11.1.2 近似算法的性能,许多难解问题实质上是最优化问题,即要求在满足约束条件的前提下,使某个目标函数达到最大值或最小值的解。在这类问题中,求得最优解往往需要付出极大的代价。在现实世界中,很多问题的输入数据是用测量方法获得的,而测量的数据本身就存在着一定程度的误差,因此,输入数据是近似的。同时,很多问题的解允许有一定程度的误差,只要给出的解是合理的、可接受的,近似最优解常常就能满足实际问题的需要。此外

2、,采用近似算法可以在很短的时间内得到问题的近似解,所以,近似算法是求解难解问题的一个可行的方法。,11.1.1 近似算法的设计思想,即使某个问题存在有效算法,好的近似算法也会发挥作用。因为待求解问题的实例是不确定的,或者在一定程度上是不准确的,如果使用近似算法造成的误差比不精确的数据带来的误差小,并且近似算法远比精确算法高效,那么,出于实用的目的,当然更愿意选择近似算法了。近似算法的基本思想是用近似最优解代替最优解,以换取算法设计上的简化和时间复杂性的降低。近似算法是这样一个过程:虽然它可能找不到一个最优解,但它总会为待求解的问题提供一个解。为了具有实用性,近似算法必须能够给出算法所产生的解与

3、最优解之间的差别或者比例的一个界限,它保证任意一个实例的近似最优解与最优解之间相差的程度。显然,这个差别越小,近似算法越具有实用性。,11.1.2 近似算法的性能,衡量近似算法性能最重要的标准有两个: (1)算法的时间复杂性:近似算法的时间复杂性必须是多项式阶的,这是设计近似算法的基本目标; (2)解的近似程度:近似最优解的近似程度也是设计近似算法的重要目标。近似程度可能与近似算法本身、问题规模,乃至不同的输入实例都有关。不失一般性,假设近似算法求解的是最优化问题,且对于一个确定的最优化问题,每一个可行解所对应的目标函数值均为正数。若一个最优化问题的最优值为c*,求解该问题的一个近似算法求得的

4、近似最优值为c,则将该近似算法的近似比(Approximate Ratio)定义为:,在通常情况下,该性能比是问题输入规模n的一个函数(n),即:这个定义对于最大化问题和最小化问题都是适用的。对于一个最大化问题,cc*,此时近似算法的近似比表示最优值c*比近似最优值c大多少倍;对于一个最小化问题,c*c,此时近似算法的近似比表示近似最优值c比最优值c*大多少倍。所以,近似算法的近似比不会小于1,近似算法的近似比越大,它求出的近似解就越差。显然,一个能求得最优解的近似算法,其近似比为1。有时用相对误差表示一个近似算法的近似程度会更方便些。若一个最优化问题的最优值为c*,求解该问题的一个近似算法求

5、得的近似最优值为c,则该近似算法的相对误差(Relative Error)定义为:,近似算法的相对误差总是非负的,它表示一个近似最优解与最优解相差的程度。若问题的输入规模为n,存在一个函数(n),使得则称(n)为该近似算法的相对误差界(Relative Error Bound)。近似算法的近似比(n)与相对误差界(n)之间显然有如下关系: 有许多问题的近似算法具有固定的近似比和相对误差界,即(n)和(n)不随着问题规模n的变化而变化,在这种情况下,用和来表示近似比和相对误差界。还有许多问题的近似算法没有固定的近似比,即近似比(n)随着问题规模n的增长而增长,换言之,问题规模n越大,近似算法求出

6、的近似最优解与最优解相差得就越多。对有些难解问题,可以找到这样的近似算法,其近似比可以通过增加计算量来改进,也就是说,在计算量和解的精确度之间有一个折衷,较少的计算量得到较粗糙的近似解,而较多的计算量可以得到较精确的近似解。,11.2 图问题中的近似算法,11.2.1 顶点覆盖问题,11.2.2 TSP问题,11.2.1 顶点覆盖问题,无向图G=(V, E)的顶点覆盖是顶点集V的一个子集V V,使得若(u, v)是G的一条边,则vV或uV。顶点覆盖V的大小是它所包含的顶点个数|V|。顶点覆盖问题是求出图G中的最小顶点覆盖,即含有顶点数最少的顶点覆盖。顶点覆盖问题是一个NP难问题,因此,没有一个

7、多项式时间算法有效地求解。虽然要找到图G的一个最小顶点覆盖是很困难的,但要找到图G的一个近似最小覆盖却很容易。可以采用如下策略:初始时边集E= ,顶点集V= ,每次从边集E中任取一条边(u, v),把顶点u和v加入到顶点集V中,再把与u和v顶点相邻接的所有边从边集E中删除,直到边集E为空。显然,最后得到的顶点集V是无向图的一个顶点覆盖,由于每次把尽量多的相邻边从边集E,中删除,可以期望V中的顶点数尽量少,但不能保证V中的顶点数最少。图11.1中给出了一个顶点覆盖问题的近似算法求解过程。,假设无向图G中n个顶点的编号为0n-1,顶点覆盖问题的近似算法如下:,算法11.1可以用邻接表的形式存储无向

8、图,由于算法中对每条边只进行一次删除操作,设图G含有n个顶点e条边,则算法11.1的时间复杂性为O(n+e)。,下面考察算法11.1的近似比。若用A表示算法在步骤3.1中选取的边的集合,则A中任何两条边没有公共顶点。因为算法选取了一条边,并在将其顶点加入顶点覆盖后,就将E中与该边的两个顶点相关联的所有边从E中删除,因此,下一次再选取的边就与该边没有公共顶点。由数学归纳法易知,A中的所有边均没有公共顶点。算法结束时,顶点覆盖中的顶点数|V|=2|A|。另一方面,图G的任一顶点覆盖一定包含A中各边的至少一个端点,因此,若最小顶点覆盖为V*,则|V*|A|。由此可得,|V|2|V*|,即算法11.1

9、的近似比为2。,11.2.2 TSP问题,TSP问题是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。如果无向图G=(V, E)的顶点在一个平面上,边(i, j)E的代价c(i, j)均为非负整数,且两个顶点之间的距离为欧几里德距离(Euclidean Distance),则对图G的任意3个顶点i, j, kV,显然满足如下三角不等式: c(i, j)+c(j, k)c(i, k)事实上,很多以TSP问题为背景的应用问题,如交通、航线、机械加工等应用问题,顶点之间的代价都满足三角不等式。可以证明,满足三角不等式的TSP问题仍为NP难问题,,但是,可以

10、设计一个近似算法,其近似比为2。图11.2(a)给出了一个满足三角不等式的无向图,图中方格的边长为1。求解TSP问题的近似算法首先采用Prim算法生成图的最小生成树T,如图(b)所示,图中粗线表示最小生成树中的边,然后对T进行深度优先遍历,经过的路线为abcbhbadefegeda,得到遍历序列L=(a, b, c, h, d, e, f, g),由序列L得到哈密顿回路,即近似最优解,如图(d)所示,其路径长度约为19.074,图(e)所示是(a)的最优解,其路径长度约为16.084。,算法11.2满足三角不等式的TSP问题 1在图中任选一个顶点v; 2采用Prim算法生成以顶点v为根结点的最

11、小生成树T; 3对生成树T从顶点v出发进行深度优先遍历,得到遍历序列L; 4根据L得到图G的哈密顿回路;,算法11.2的时间主要耗费在采用Prim算法构造最小生成树,因此,其时间复杂性为O(n2)。下面考察算法11.2的近似比。设满足三角不等式的无向图G的最短哈密顿回路为H*,W(H*)是H*的代价之和;T是由Prim算法求得的最小生成树,W(T)是T的代价之和;H是由算法11.2得到的近似解,也是图G的一个哈密顿回路,W(H)是H的代价之和。因为图G的任意一个哈密顿回路删去一条边,构成图G的一个生成树,所以,有W(T)W(H*)设算法11.2中深度优先遍历生成树T得到的路线为R,则R中对于T

12、的每条边都经过两次,所以,有:W(R)=2W(T),算法11.2得到的近似解H是R删除了若干中间点(不是第一次出现的顶点)得到的,每删除一个顶点恰好是用三角形的一条边取代另外两条边。例如,在图11.2中,遍历生成树的路线为abcbhbadefegeda,删除第2次出现的顶点b,相当于用边(c, h)取代另外两条边(c, b)和(b, h)。由三角不等式可知,这种取代不会增加总代价,所以,有W(H)W(R)从而W(H)2W(H*)由此,算法11.2的近似比为2。,11.3 组合问题中的近似算法,11.3.1 装箱问题,11.3.2 子集和问题,11.3.1 装箱问题,设有n个物品和若干个容量为C

13、的箱子,n个物品的体积分别为s1, s2, , sn,且有siC(1in),把所有物品分别装入箱子,求占用箱子数最少的装箱方案。最优装箱方案可以通过把n个物品划分为若干子集,每个子集的体积和小于C,然后取子集个数最少的划分方案。但是,这种划分可能的方案数有(n/2)n/2种,在多项式时间内不能够保证找到最优装箱方案。大多数装箱问题的近似算法采用贪心策略,即在每个物品装箱时规定一种局部选择方法。下面介绍4种不同的求解装箱问题的近似算法。 1首次适宜法(First Fit)首次适宜法首先将所有的箱子初始化为空,然后依次,取每一个物品,将该物品装入第一个能容纳它的箱子中。例如,有10个物品,其体积分

14、别为S(4, 2, 7, 3, 5, 4, 2, 3, 6, 2),若干个容量为10的箱子,采用首次适宜法得到的装箱结果如图11.3所示。,首次适宜法求解装箱问题的算法如下:,算法FirstFit的基本语句是查找第1个能容纳物品i的箱子,其时间复杂性为O(n2)。下面考察算法11.3的近似比。不失一般性,假设箱子的容量C为一个单位的体积,Ci为第i个箱子已装入物品的体积,由首次适宜装箱策略,有Ci+Cj1。设装箱问题的近似解为k,则若k为偶数,则C1+C2+ +Ckk/2若k为奇数,则C1+C2+ +Ck(k-1)/2将两式相加,得:设装箱问题的最优解为m,则在最优化装入时,所有箱子恰好装入全

15、部物品,即:,所以,有:即由此,算法FirstFit的近似比小于2。,2最适宜法最适宜法的物品装入过程与首次适宜法类似,不同的是,总是把物品装到能够容纳它并且目前最满的箱子中,使得该箱子装入物品后闲置空间最小。例如,有10个物品,其体积分别为S(4, 2, 7, 3, 5, 4, 2, 3, 6, 2),若干个容量为10的箱子,采用最适宜法得到的装箱结果如图11.4所示。,3首次适宜降序法 首次适宜降序法首先将物品按体积从大到小排序,然后用首次适宜法装箱。例如,有10个物品,其体积分别为S(4, 2, 7, 3, 5, 4, 2, 3, 6, 2),若干个容量为10的箱子,采用首次适宜降序法得

16、到的装箱结果如图11.5所示。,4最适宜降序法最适宜降序法将物品按体积从大到小排序,然后用最适宜法装箱。例如,有10个物品,其体积分别为S(4, 2, 7, 3, 5, 4, 2, 3, 6, 2),若干个容量为10的箱子,采用首次适宜降序法得到的装箱结果如图11.6所示。,11.3.2 子集和问题,令S=s1, s2, sn是一个正整数的集合,子集和问题要求在这个正整数集合中,找出其和不超过正整数C的最大和数的子集。考虑蛮力法求解子集和问题,为了求得集合s1, s2, sn的所有子集和,先将所有子集和的集合初始化为L0=0,然后求得子集和中包含s1的情况,即L0中的每一个元素加上s1,用L0

17、+s1表示对集合L0中的每个元素加上s1后得到的新集合,则所有子集和的集合为L1=L0+(L0+s1)=0, s1;再求得子集和中包含s2的情况,即L1中的每一个元素加上s2,所有子集和的集合为L2=L1+(L1+s2)=0, s1, s2, s1+s2;依此类推,一般情况下,为求得子集和中包含si(1in)的情况,即Li-1中的每一个元素加上si,所有子集和的集合为Li=Li-1+(Li-1+si)。因为子集和问题要求不超过正整数C,所以,每次合并后都要在Li中删除所有大于C的元素。例如,若S=104,102, 201, 101,C=308,利用上述算法求解子集和问题的过程如图11.7所示。

18、,设集合Li以数组Li的形式存储,n个元素的正整数集合S用数组sn存储且下标从1开始,两个集合的合并操作与4.3.1中介绍的归并排序的合并算法类似,蛮力法求解子集和问题的算法如下:,算法SubsetSum1中的数组Li是一个包含了不超过C的所有可能的(s1, s2, si)的子集和,在最坏情况下(即Li中的元素各不相同),Li中的元素个数为2i,所以,算法SubsetSum1的时间复杂性为O(2n)。基于算法SubsetSum1的近似算法的基本思想是,在迭代过程中,对数组Li进行适当的修整,使得在子集和不,超过一定误差的前提下,尽可能减少数组Li中的元素个数,从而获得算法时间性能的提高。具体方

19、法是:用一个修整参数(01),从数组Li中删去尽可能多的元素,得到一个数组L1i,使得每一个从Li中删去的元素y,在数组L1i中都有一个修整后的元素z满足(1-)yzy,可以将z看作是被删去元素y在修整后的数组L1i中的代表。例如,若=0.1,且L=10, 11, 12, 15, 20, 21, 22, 23, 24, 29,则用对L进行修整后得到L1=10, 12, 15, 20, 23, 29。其中被删去的元素11由10来代表,21和22由20来代表,24由23来代表。 给定一个修整参数,对有序数组L的修整算法如下:,算法Trim的基本语句是for循环中的条件语句,显然,其时间复杂性为O(

20、m)。子集和问题的近似算法与蛮力法求解子集和问题的算法类似。不同的是,近似算法在每次合并结束并且删除所有大于C的元素后,在子集和不超过近似误差的前提下,以=/n作为修整参数对合并结果Li进行修整,尽可能减少下次参与迭代的元素个数。例如,设正整数的集合S=104, 102, 201, 101,C=308,给定近似参数=0.2,则修整参数为=/n=0.05,利用近似算法求解子集和问题的过程如图11.8所示。算法最后返回302作为子集和问题的近似解,而最优解为104+102+101=307,所以,近似解的相对误差不超过预先给定的近似参数0.02。,给定一个近似参数,子集和问题的近似算法如下:,在算法

21、SubsetSum2中,每次对数组Li进行合并、删除超过C的元素和修整操作的计算时间为O(|Li|)。因此,整个算法的计算时间不会超过O(n|Li|)。注意到,算法对数组Li进行修整后,Li中相继的两个元素a和b满足:,也就是说,数组Li中相继的元素之间至少相差一个比例因子 ,而数组Li中的最大元素不会超过C,因此,算法完成了对数组Li的合并、删除超过C的元素和修整操作后,Li的元素个数不超过所以,算法SubsetSum2的时间复杂性为O(n2/)。下面考察算法SubsetSum2的近似比。设子集和问题的最优解为c*,算法SubsetSum2得到的近似最优解为c,则算法SubsetSum2的相

22、对近似比为下面证明这个相对误差不超过,即,注意到,在对数组Li进行修整时,被删除元素与其代表元素的相对误差不超过/n。设子集和问题的最优解为c*,应用近似算法求得的近似最优解为c,求解最优解产生的子集和的集合序列为(P1, P2, , Pn),对修整次数i用数学归纳法可以证明,对于Pi中任一不超过C的元素y,有Li中的一个元素x,使得(1-/n)iyxy。由于最优解c*Pn,故存在xLn,使得(1-/n)nc*xc*。又因为算法返回的是Ln中的最大元素,所以,有xcc*。因此,(1-/n)nc*cc*。最后,由于(1-/n)n是n的递增函数,所以,当n1时,有(1-)(1-/n)n。由此可得,(1-)c*cc*。从而,算法SubsetSum2求得的近似解与最优解的相对误差不超过。,11.4 实验项目TSP问题的近似算法,1. 实验题目求解TSP问题的近似算法。,2. 实验目的(1)了解近似算法的局限性;(2)掌握求解NP完全问题的一种方法:只对问题的特殊实例求解。,3. 实验要求 (1)理解满足三角不等式的TSP问题的特点及应用实例; (2)设计近似算法求解满足三角不等式的TSP问题,并求出近似比; (3)将求解满足三角不等式的TSP问题的近似算法应用于一般的TSP问题,考察它的近似性能,理解为什么说TSP问题是NP问题中最难的一个问题。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报