贪心算法.ppt_第1页
贪心算法.ppt_第2页
贪心算法.ppt_第3页
贪心算法.ppt_第4页
贪心算法.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第7章 贪心法,7.1 概 述,7.2 图问题中的贪心法,7.3 组合问题中的贪心法,7.4 实验项目哈夫曼编码,7.1 概 述,7.1.1 贪心法的设计思想,7.1.2 贪心法的求解过程,贪心法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。换言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优。 这种局部最优选择并不总能获得整体最优解(Optimal Solution),但通常能获得近似最优解(Near-Optimal Solution)。,7.1.1 贪心法的设计思想,例:用贪心法求解付款问题。

2、 假设有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾客4元6角现金,为使付出的货币的数量最少,首先选出1张面值不超过4元6角的最大面值的货币,即2元,再选出1张面值不超过2元6角的最大面值的货币,即2元,再选出1张面值不超过6角的最大面值的货币,即5角,再选出1张面值不超过1角的最大面值的货币,即1角,总共付出4张货币。,在付款问题每一步的贪心选择中,在不超过应付款金额的条件下,只选择面值最大的货币,而不去考虑在后面看来这种选择是否合理,而且它还不会改变决定:一旦选出了一张货币,就永远选定。付款问题的贪心选择策略是尽可能使付出的货币最快地满足支付要求,其目的是使付出的货币张数最慢

3、地增加,这正体现了贪心法的设计思想。,贪心法求解的问题的特征: (1)最优子结构性质 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质,也称此问题满足最优性原理。 (2)贪心选择性质 所谓贪心选择性质是指问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来得到。,动态规划法通常以自底向上的方式求解各个子问题,而贪心法则通常以自顶向下的方式做出一系列的贪心选择。,7.1.2 贪心法的求解过程,用贪心法求解问题应该考虑如下几个方面: (1)候选集合C:为了构造问题的解决方案,有一个候选集合C作为问题的可能解,即问题的最终解均取自于候选集合C。例如,在付款问题中,各种面值的

4、货币构成候选集合。 (2)解集合S:随着贪心选择的进行,解集合S不断扩展,直到构成一个满足问题的完整解。例如,在付款问题中,已付出的货币构成解集合。,(3)解决函数solution:检查解集合S是否构成问题的完整解。例如,在付款问题中,解决函数是已付出的货币金额恰好等于应付款。 (4)选择函数select:即贪心策略,这是贪心法的关键,它指出哪个候选对象最有希望构成问题的解,选择函数通常和目标函数有关。例如,在付款问题中,贪心策略就是在候选集合中选择面值最大的货币。 (5)可行函数feasible:检查解集合中加入一个候选对象是否可行,即解集合扩展后是否满足约束条件。例如,在付款问题中,可行函

5、数是每一步选择的货币和已付出的货币相加不超过应付款。,贪心法的一般过程 Greedy(C) /C是问题的输入集合即候选集合 S= ; /初始解集合为空集 while (not solution(S) /集合S没有构成问题的一个解 x=select(C); /在候选集合C中做贪心选择 if feasible(S, x) /判断集合S中加入x后的解是否可行 S=S+x; C=C-x; return S; ,7.2 图问题中的贪心法,7.2.1 TSP问题,7.2.2 图着色问题,7.2.3 最小生成树问题,7.2.1 TSP问题,求解TSP问题至少有两种贪心策略是合理的: (1)最近邻点策略:从任

6、意城市出发,每次在没有到过的城市中选择最近的一个,直到经过了所有的城市,最后回到出发城市。,设图G有n个顶点,边上的代价存储在二维数组wnn中,集合V存储图的顶点,集合P存储经过的边,最近邻点策略求解TSP问题的算法如下:,算法7.1的时间性能为O(n2),因为共进行n-1次贪心选择,每一次选择都需要查找满足贪心条件的最短边。 用最近邻点贪心策略求解TSP问题所得的结果不一定是最优解,图7.1(a)中从城市1出发的最优解是125431,总代价只有13。当图中顶点个数较多并且各边的代价值分布比较均匀时,最近邻点策略可以给出较好的近似解,不过,这个近似解以何种程度近似于最优解,却难以保证。例如,在

7、图7.1中,如果增大边(2, 1)的代价,则总代价只好随之增加,没有选择的余地。,(2)最短链接策略:每次在整个图的范围内选择最短边加入到解集合中,但是,要保证加入解集合中的边最终形成一个哈密顿回路。因此,当从剩余边集E中选择一条边(u, v)加入解集合S中,应满足以下条件: 边(u, v)是边集E中代价最小的边; 边(u, v)加入解集合S后,S中不产生回路; 边(u, v) 加入解集合S后,S中不产生分枝;,设图G有n个顶点,边上的代价存储在二维数组wnn中,集合E是候选集合即存储所有未选取的边,集合P存储经过的边,最短链接策略求解TSP问题的算法如下:,在算法7.2中,如果操作“在E中选

8、取最短边(u, v)”用顺序查找,则算法7.2的时间性能是O(n2),如果采用堆排序的方法将集合E中的边建立堆,则选取最短边的操作可以是O(log2n),对于两个顶点是否连通以及是否会产生分枝,可以用并查集的操作将其时间性能提高到O(n),此时算法7.2的时间性能为O(nlog2n)。,7.2.2 图着色问题,给定无向连通图G=(V, E),求图G的最小色数k,使得用k种颜色对G中的顶点着色,可使任意两个相邻顶点着色不同。,例如,图7.3(a)所示的图可以只用两种颜色着色,将顶点1、3和4着成一种颜色,将顶点2和顶点5着成另外一种颜色。为简单起见,下面假定k个颜色的集合为颜色1, 颜色2, ,

9、 颜色k。,贪心策略:选择一种颜色,以任意顶点作为开始顶点,依次考察图中的未被着色的每个顶点,如果一个顶点可以用颜色1着色,换言之,该顶点的邻接点都还未被着色,则用颜色1为该顶点着色,当没有顶点能以这种颜色着色时,选择颜色2和一个未被着色的顶点作为开始顶点,用第二种颜色为尽可能多的顶点着色,如果还有未着色的顶点,则选取颜色3并为尽可能多的顶点着色,依此类推。,设数组colorn表示顶点的着色情况,贪心法求解图着色问题的算法如下:,考虑一个具有2n个顶点的无向图,顶点的编号从1到2n,当i是奇数时,顶点i与除了顶点i+1之外的其他所有编号为偶数的顶点邻接,当i是偶数时,顶点i与除了顶点i-1之外

10、的其他所有编号为奇数的顶点邻接,这样的图称为双向图(Bipartite)。,7.2.3 最小生成树问题,设G=(V,E)是一个无向连通网,生成树上各边的权值之和称为该生成树的代价,在G的所有生成树中,代价最小的生成树称为最小生成树(Minimal Spanning Trees)。,最小生成树问题至少有两种合理的贪心策略: (1)最近顶点策略:任选一个顶点,并以此建立起生成树,每一步的贪心选择是简单地把不在生成树中的最近顶点添加到生成树中。 Prim算法就应用了这个贪心策略,它使生成树以一种自然的方式生长,即从任意顶点开始,每一步为这棵树添加一个分枝,直到生成树中包含全部顶点。,设图G中顶点的编

11、号为0n-1,Prim算法如下:,设连通网中有n个顶点,则第一个进行初始化的循环语句需要执行n-1次,第二个循环共执行n-1次,内嵌两个循环,其一是在长度为n的数组中求最小值,需要执行n-1次,其二是调整辅助数组,需要执行n-1次,所以,Prim算法的时间复杂度为O(n2)。,(2)最短边策略:设G=(V,E)是一个无向连通网,令T=(U,TE)是G的最小生成树。最短边策略从TE=开始,每一次贪心选择都是在边集E中选取最短边(u, v),如果边(u, v)加入集合TE中不产生回路,则将边(u, v)加入边集TE中,并将它在集合E中删去。 Kruskal算法就应用了这个贪心策略,它使生成树以一种

12、随意的方式生长,先让森林中的树木随意生长,每生长一次就将两棵树合并,到最后合并成一棵树。,Kruskal算法为了提高每次贪心选择时查找最短边的效率,可以先将图G中的边按代价从小到大排序,则这个操作的时间复杂度为O(elog2e),其中e为无向连通网中边的个数。对于两个顶点是否属于同一个连通分量,可以用并查集的操作将其时间性能提高到O(n),所以,Kruskal算法的时间性能是O(elog2e)。,7.3 组合问题中的贪心法,7.3.1 背包问题,7.3.2 活动安排问题,7.3.3 多机调度问题,7.3.1 背包问题,给定n种物品和一个容量为C的背包,物品i的重量是wi,其价值为vi,背包问题

13、是如何选择装入背包的物品,使得装入背包中物品的总价值最大?,于是,背包问题归结为寻找一个满足约束条件式7.1,并使目标函数式7.2达到最大的解向量X=(x1, x2, , xn)。,设xi表示物品i装入背包的情况,根据问题的要求,有如下约束条件和目标函数:,(式7.1),(式7.2),至少有三种看似合理的贪心策略: (1)选择价值最大的物品,因为这可以尽可能快地增加背包的总价值。但是,虽然每一步选择获得了背包价值的极大增长,但背包容量却可能消耗得太快,使得装入背包的物品个数减少,从而不能保证目标函数达到最大。 (2)选择重量最轻的物品,因为这可以装入尽可能多的物品,从而增加背包的总价值。但是,

14、虽然每一步选择使背包的容量消耗得慢了,但背包的价值却没能保证迅速增长,从而不能保证目标函数达到最大。 (3)选择单位重量价值最大的物品,在背包价值增长和背包容量消耗两者之间寻找平衡。,应用第三种贪心策略,每次从物品集合中选择单位重量价值最大的物品,如果其重量小于背包容量,就可以把它装入,并将背包容量减去该物品的重量,然后我们就面临了一个最优子问题它同样是背包问题,只不过背包容量减少了,物品集合减少了。因此背包问题具有最优子结构性质。,120 50 背包 180 190 200 (a) 三个物品及背包 (b) 贪心策略1 (c) 贪心策略2 (d) 贪心策略3,例如,有3个物品,其重量分别是20

15、, 30, 10,价值分别为60, 120, 50,背包的容量为50,应用三种贪心策略装入背包的物品和获得的价值如图所示。,设背包容量为C,共有n个物品,物品重量存放在数组wn中,价值存放在数组vn中,问题的解存放在数组xn中。,算法7.6的时间主要消耗在将各种物品依其单位重量的价值从大到小排序。因此,其时间复杂性为O(nlog2n)。,7.3.2 活动安排问题,设有n个活动的集合E=1, 2, , n,其中每个活动都要求使用同一资源(如演讲会场),而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si fi 。如果选择了活动i,则它

16、在半开时间区间si, fi)内占用资源。若区间si, fi)与区间sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当sifj或sjfi时,活动i与活动j相容。活动安排问题要求在所给的活动集合中选出最大的相容活动子集。,由于活动占用资源的时间没有限制,因此,后一种贪心选择更为合理。 为了在每一次贪心选择时快速查找具有最早结束时间的相容活动,先把n个活动按结束时间非减序排列。这样,贪心选择时取当前活动集合中结束时间最早的活动就归结为取当前活动集合中排在最前面的活动。,贪心法求解活动安排问题的关键是如何选择贪心策略,使得按照一定的顺序选择相容活动,并能安排尽量多的活动。至少有两种看似合理

17、的贪心策略: (1)最早开始时间:这样可以增大资源的利用率。 (2)最早结束时间:这样可以使下一个活动尽早开始。,例如,设有11个活动等待安排,这些活动按结束时间的非减序排列如下:,设有n个活动等待安排,这些活动的开始时间和结束时间分别存放在数组sn和fn中,集合B存放问题的解,即选定的活动集合,算法如下:,算法7.7的时间主要消耗在将各个活动按结束时间从小到大排序。因此,算法的时间复杂性为O(nlog2n)。,7.3.3 多机调度问题,设有n个独立的作业1, 2, , n,由m台相同的机器M1, M2, , Mm进行加工处理,作业i所需的处理时间为ti(1in),每个作业均可在任何一台机器上

18、加工处理,但不可间断、拆分。多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。,贪心法求解多机调度问题的贪心策略是最长处理时间作业优先,即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间。按照最长处理时间作业优先的贪心策略,当mn时,只要将机器i的0, ti)时间区间分配给作业i即可;当mn时,首先将n个作业依其所需的处理时间从大到小排序,然后依此顺序将作业分配给空闲的处理机。,例:设7个独立作业1, 2, 3, 4, 5, 6, 7由3台机器M1, M2, M3加工处理,各作业所需

19、的处理时间分别为2, 14, 4, 16, 6, 5, 3。贪心法产生的作业调度如下:,在算法7.9中,操作“数组dm中最小值对应的下标”如果采用蛮力法查找,则算法的时间性能为: 通常情况下mn,则算法7.9的时间复杂性为O(nm)。,7.4 贪心算法的理论基础,下面的关于极大独立子集的性质是很有用的。 定理4.1:拟阵M中所有极大独立子集大小相同。 这个定理可以用反证法证明。 若对拟阵M=(S,I)中的S指定权函数W,使得对于任意x S,有W(x)0,则称拟阵M为带权拟阵。依此权函数,S的任一子集A的权定义为 。 2.关于带权拟阵的贪心算法 许多可以用贪心算法求解的问题可以表示为求带权拟阵的

20、最大权独立子集问题。,给定带权拟阵M=(S,I),确定S的独立子集AI使得W(A)达到最大。这种使W(A)最大的独立子集A称为拟阵M的最优子集。由于S中任一元素x的权W(x)是正的,因此,最优子集也一定是极大独立子集。 例如,在最小生成树问题可以表示为确定带权拟阵 的最优子集问题。求带权拟阵的最优子集A的算法可用于解最小生成树问题。 下面给出求带权拟阵最优子集的贪心算法。该算法以具有正权函数W的带权拟阵M=(S,I)作为输入,经计算后输出M的最优子集A。,Set greedy (M,W) A=; 将S中元素依权值W(大者优先)组成优先队列; while (S!=) S.removeMax(x)

21、; if (AxI) A=Ax; return A ,算法greedy的计算时间复杂性为 。 引理4.2(拟阵的贪心选择性质) 设M=(S,I)是具有权函数W的带权拟阵,且S中元素依权值从大到小排列。又设x S是S中第一个使得x是独立子集的元素,则存在S的最优子集A使得x A。 算法greedy在以贪心选择构造最优子集A时,首次选入集合A中的元素x是单元素独立集中具有最大权的元素。此时可能已经舍弃了S中部分元素。可以证明这些被舍弃的元素不可能用于构造最优子集。,引理4.3:设M=(S,I)是拟阵。若S中元素x不是空集的可扩展元素,则x也不可能是S中任一独立子集A的可扩展元素。 引理4.4(拟阵

22、的最优子结构性质) 设x是求带权拟阵M(S,I)的最优子集的贪心算法greedy所选择的S中的第一个元素。那么,原问题可简化为求带权拟阵M=(S,I)的最优子集问题,其中: S=y|y S且x,y I I=B|B S-x且Bx I M的权函数是M的权函数在S上的限制(称M为M关于元素x的收缩)。,定理4.5(带权拟阵贪心算法的正确性) 设M(S,I)是具有权函数W的带权拟阵,算法greedy返回M的最优子集。 3.任务时间表问题 给定一个单位时间任务的有限集S。关于S的一个时间表用于描述S中单位时间任务的执行次序。时间表中第1个任务从时间0开始执行直至时间1结束,第2个任务从时间1开始执行至时

23、间2结束,第n个任务从时间n-1开始执行直至时间n结束。,具有截止时间和误时惩罚的单位时间任务时间表问题可描述如下。 (1) n个单位时间任务的集合S=1,2,n; (2) 任务i的截止时间 ,1in,1 n,即要求任务i在时间 之前结束; (3) 任务i的误时惩罚 ,1in,即任务i未在时间 之前结束将招致的 惩罚;若按时完成则无惩罚。 任务时间表问题要求确定S的一个时间表(最优时间表)使得总误时惩罚达到最小。,这个问题看上去很复杂,然而借助于拟阵,可以用带权拟阵的贪心算法有效求解。 对于一个给定的S的时间表,在截止时间之前完成的任务称为及时任务,在截止时间之后完成的任务称为误时任务。 S的任一时间表可以调整成及时优先形式,即其中所有及时任务先于误时任务,而不影响原时间表中各任务的及时或误时性质。 类似地,还可将S的任一时间表调整成为规范形式,其中及时任务先于误时任务,且及时任务依其截止时间的非减序排列。,首先可将时间表调整为及时优先形式,然后再进一步调整及时任务的次序。 任务时间表问题等价于确定最优时间表中及时任务子集A的问题。一旦确定了及时任务子集A,将A中各任务依其截止时间的非减序列出,然后再以任意次序列出误时任务,即S-A中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论