算法设计与分析学习提纲,第十五章近似算法

  • 格式:doc
  • 大小:1.07 MB
  • 文档页数:19

第十五章 近似算法

输入数据本身就是近似的

很多问题的最优解,允许有一定程度的近似

采用近似算法可以在很短的时间内得到问题的解(特别是与指数时间相比较)

15.1 近似算法的性能

一、近似算法的基本要求

对于规模为n的问题,

1. 算法能以n的多项式时间内完成;

2. 算法的近似解满足一定的精度。

二、近似比率

1、近似算法的近似比率

是最小化问题,I是的一个实例,A是解的一个近似算法, )(IA是用算法A对的实例I求解时得到的近似值;OPTA是解的最优算法, )(IOPTA是算法OPTA对的实例I求解时所得到准确值。则近似算法A的近似比率)(I为:

)()()(IOPTAIAI

如果是最大化问题,则)(I为:

)()()(IAIOPTAI

2、与近似比率相关的问题

1)对最小化问题,有:)()(IOPTAIA;

对最大化问题,有:)()(IOPTAIA。

2)近似算法A的近似比率)(I总大于或等于1。

3)近似算法的近似比率越小,则算法的性能越好。

三、相对误差

1、相对误差的定义

相对误差表示近似算法的精确度,相对误差定义为:

)()()(IOPTAIAIOPTA

2、相对误差的界 若对输入规模为n的问题,存在函数)(n,使得:

)()()()(nIOPTAIAIOPTA

称函数)(n为近似算法A的相对误差的界。

3、相对误差)(n与近似比率)(n的关系

1)()(nn。

四、优化问题的近似方案(approximation scheme)

1、很多难解的问题,可以增加近似算法的计算量,来改善近似算法的性能。

2、优化问题的近似方案

把满足1),(IA的一类近似算法}0|{A,称为优化问题的近似方案

算法的性能比率会聚于1。

3、多项式近似方案(polynomial approximation scheme PAS)

近似方案中的每一个算法A,以输入实例的规模的多项式时间运行,称该近似方案为多项式近似方案。

算法的计算时间,不随的减少而增长太快。

4、完全多项式近似方案(fully polynomial approximation scheme FPAS)

减少常数倍,近似方案中算法的计算时间的增长不超过个常数倍。

近似方案中算法的计算时间是/1和n的多项式

15.2 装箱问题

一、装箱问题(BIN PACKING)

给定n个物体nuuu,,,21,体积分别为nsss,,,21,容量为C的箱子,,,,21kbbb,满足Csi,ni,,2,1。要求物体不能分割,把所有物体装进箱子,使所装入的箱子尽可能少。

二、装箱问题的四种算法

1、 First Fit(首次适宜FF)算法:

把箱子按下标,,,2,1k标记,所有的箱子初始化为空;

按物体nuuu,,,21顺序装入箱子。

装入过程如下:

把第一个物体1u装入第一个箱子1b,

如果1b还容纳得下第二个物体,继续把第二个物体2u装入1b;

否则,把2u装入2b。

一般地,为了装入物体iu,先找出能容纳得下is的下标最小的箱子kb,

再把物体iu装入箱子kb,

重复这些步骤,直到把所有物体装入箱子为止。 2、Best Fit(最适宜BF)算法:

与FF算法类似,

不同点:为了装入物体iu,首先检索能容纳得下is、剩余容量最小的箱子kb,

再把物体iu装入箱子kb,

重复这些步骤,直到把所有物体装入箱子为止。

3、First Fit Decreasing(首次适宜降序FFD)算法:

首先把物体按体积大小递减的顺序排序,

然后用FF算法装入物体。

4、Best Fit Decreasing(最适宜降序BFD)算法:

首先把物体按体积大小递减的顺序排序,

然后用BF算法装入物体。

15.2.1 首次适宜算法

一、FF算法的描述:

算法15.1 装箱问题的首次适宜算法

输入:n个物体的体积s[],箱子的容量C

输出:装入箱子的个数k,每个箱子中装入的物体累计体积b[]

1. void first_fit(float s[],int n,float C,float b[],int &k)

2. {

3. int i,j;

4. k = 0; /* 装入物体的箱子下标 */

5. for (i=0;i

6. b[i] = 0;

7. for (i=0;i

8. j = 0;

9. while ((C-b[j])

10. j++;

11. b[j] += s[i];

12. k = max(k,j); /* 已装入物体的箱子最大下标 */

13. }

14. k++; /* 箱子的最大下标转换为箱子的个数 */

15. }

二、FF算法的分析

1、时间复杂性: )(2nO时间。

2、算法性能估计: 假定,C为一个单位体积,1is,ni,,2,1。

令)(IFF表示在实例I下,使用算法FF装入物体时,所使用的箱子数目;

令)(IOPT为最优装入时所使用的箱子数目。

至多有一个非空的箱子所装的物体体积小于2/1。

否则,如果有两个以上的箱子所装的物体体积小于2/1,

假设这两个箱子是ib及jb,并且ji,

装入ib及jb中物体的体积均小于2/1。

按照算法的装入规则,必然把jb中的物体继续装入ib,而不会装入另外的箱子。

则装入箱子的物体如图15.1 所示:

1 2 1k k

┅┅

1 2 1k k

图15.1 FF算法的箱子装入情况

i为箱子中的空余体积,i为箱子中装入的物体体积。有:

niikiis11 及 ii,12,1ki

对第k个箱子,或者是kk,或者是kk。

对后一情况,有:kk1,1kk,所以:kkkk11。

对这两种情况都有:

niikiikiis111

所以,

niikiikiisIFF1112)(

在最优化装入时,所有的箱子恰好装入全部物体,即:

niisIOPT1)(

FF算法的性能比率)(IFF为:

2)()()(IOPTIFFIFF FF算法的性能比率小于2。

实际上,经过复杂而冗长的证明,可以得到:

定理15.1 对装箱物体的所有实例I,FF算法的性能为:

2)(1017)(IOPTIFF

15.2.2 最适宜算法及其它算法

一、最适宜算法

1、算法描述:

算法15.2 装箱问题的最适宜算法

输入:n个物体的体积s[],箱子的容量C

输出:装入箱子的个数k,每个箱子中装入的物体累计体积b[]

1. void best_fit(float s[],int n,float C,float b[],int &k)

2. {

3. int i,j,m;

4. float min,temp;

5. k = 0; /* 装入物体的箱子下标 */

6. for (i=0;i

7. b[i] = 0;

8. for (i=0;i

9. min = C; m = k + 1;

10. for (j=0;j<=k;j++) { /* 检索能容纳物体i且剩余容量最小的箱子j*/

11. temp = C – b[j] – s[i];

12. if ((temp>=0)&&(temp

14. min = temp; m = j;

15. }

16. }

17. b[m] += s[i];

18. k = max(k,m); /* 已装入物体的箱子最大下标 */

19. }

20. k++; /* 箱子的最大下标转换为箱子的个数 */

21. }

2、时间复杂性也:)(2nO时间。

3、性能比率:与首次适宜算法FF的性能比率相同。

二、首次适宜降序算法FFD及最适宜降序算法: 1、算法描述:

算法15.3 装箱问题的首次适宜降序算法

输入:n个物体的体积s[],箱子的容量C

输出:装入箱子的个数k,每个箱子中装入的物体累计体积b[]

1. void first_fit_dec(float s[],int n,float C,float b[],int &k)

2. {

3. mergsort(s,n); /* 把物体按体积大小的递减顺序排序 */

4. first_fit(s,n,C,b,k); /* 按首次适宜算法把排序过的问题装入箱子 */

5. }

算法15.4 装箱问题的最适宜降序算法

输入:n个物体的体积s[],箱子的容量C

输出:装入箱子的个数k,每个箱子中装入的物体累计体积b[]

1. void best_fit_dec(float s[],int n,float C,float b[],int &k)

2. {

3. mergsort(s,n); /* 把物体按体积大小递减的顺序排序 */

4. best_fit_dec(s,n,C,b,k); /* 按最适宜算法把排序过的问题装入箱子 */

5. }

2、时间复杂性

两个算法的第3行,对物体按其体积大小的递减顺序排序,需)log(nnO时间。

第4行分别调用首次适宜算法和最适宜算法把物体装入箱子,需)(2nO时间。

因此,这两个算法的时间复杂性也是)(2nO时间。

2、性能比率

两个算法的性能比率相同,都好于首次适宜算法和最适宜算法。

有下面的定理:

定理15.2 对装箱物体的所有实例I,FFD算法的性能为:

4)(911)(IOPTIFFD

15.3 顶点覆盖问题

一、顶点覆盖的优化问题

无向图),(EVG,G的顶点覆盖C是顶点集V的子集,VC,使得Evu),(,有Cu,或者Cv。顶点覆盖的优化问题,是找出图G中的最小顶点覆盖

二、数据结构

假定,顶点用1,,1,0n编号;用的邻接表存放顶点与顶点之间的关联边。