ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:105.70KB ,
资源ID:6311118      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6311118.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(贪心法专题.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

贪心法专题.docx

1、贪心法专题算法设计技术贪心法专题一、贪心法的设计思想正如其名字一样,贪心法(greedy method)在解决问题的策略上目光短浅,只根据当前已有的信息做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。考虑用贪心法求解付款问题(payment problem)。假设有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾客4元6角现金,为使付出的货币的数量最少,首先选出1张面值不超过4元6角的最大面值的货币,即2元,再选出1张面值不超过2元6角的最大面值的货币,即2元,再选出1张面值不超过6角的最大面值的货币,即5角,再选出1张面值不超过1角的最大面值的货币,即1角,总

2、共付出4张货币。在付款问题每一步的贪心选择中,在不超过应付款金额的条件下,只选择面值最大的货币,而不去考虑在后面看来这种选择是否合理,而且它还不会改变决定:一旦选出了一张货币,就永远选定。付款问题的贪心选择策略是尽可能使付出的货币最快地满足支付要求,其目的是使付出的货币张数最慢地增加,这正体现了贪心法的设计思想。上述付款问题应用贪心法得到的是整体最优解,但是如果把面值改为3元、1元、8角、5角、1角,需要找给顾客4元6角现金,则找给顾客的是1个3元、1个1元、1个5角和1个1角共4张货币,但最优解却是3张货币:1个3元和2个8角。由于贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的

3、局部最优,这种局部最优选择并不总能获得整体最优解(optimal solution),但通常能获得近似最优解(near-optimal solution)。如果一个问题的最优解只能用蛮力法穷举得到,则贪心法不失为寻找问题近似最优解的一个较好办法。例1 埃及分数【问题】埃及同中国一样,也是世界文明古国之一。古埃及人只用分子为1的分数,在表示一个真分数时,将其分解为若干个埃及分数之和,例如:7/8表示为1/2 + 1/3 + 1/24。埃及分数问题(Egypt fraction)要求把一个真分数表示为最少的埃及分数之和的形式。【想法】一个真分数的埃及分数表示不是唯一的,例如:7/8又可以表示为1/

4、8 + 1/8 + 1/8 + 1/8 + 1/8 + 1/8 + 1/8。显然,把一个真分数表示为最少的埃及分数之和的形式,其贪心策略是选择真分数包含的最大埃及分数,以7/8为例,7/8 1/2,则1/2是第一次贪心选择的结果;7/8 1/2 = 3/8 1/3,则1/3是第二次贪心选择的结果;7/8 1/2 1/3 = 1/24,则1/24是第三次贪心选择的结果,即7/8 = 1/2 + 1/3 + 1/24。接下来的问题是:如何找到真分数包含的最大埃及分数?设真分数为A/B,B除以A的整数部分为C,余数为D,则有下式成立:B = A C + D即:B/A = C + D/A 1/(C +

5、 1)即1/(C + 1) 即为真分数A/B包含的最大埃及分数。设E = C + 1,由于A/B 1/E = (AE) B)/(BE)则真分数减去最大埃及分数后,得到真分数(AE) B)/BE,该真分数可能存在公因子,需要化简,可以将分子和分母同时除以最大公约数。【算法】设函数EgyptFraction实现埃及分数问题,算法用伪代码描述如下:算法7.1:埃及分数EgyptFraction输入:真分数的分子A和分母B输出:最少的埃及分数之和1. E = B/A + 1;2. 输出1/E;3. A = A * E B; B = B * E;4. 求A和B的最大公约数R,如果R不为1,则将A和B同时

6、除以R;5. 如果A等于1,则输出1/B,算法结束;否则转步骤重复执行;例2 TSP问题【问题】TSP问题是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。【想法1】TSP问题的贪心策略可以采用最近邻点策略:从任意城市出发,每次在没有到过的城市中选择最近的一个,直到经过了所有的城市,最后回到出发城市。如图7.1(a)所示是一个无向图的代价矩阵,从顶点1出发,按照最近邻点的贪心策略,得到的路径是143521,总代价是14,求解过程如图7.1(b)(f)所示。需要说明的是,用最近邻点贪心策略求解TSP问题所得的结果不一定是最优解,例如,图7.1(a)中从

7、顶点1出发的最优解是125431,总代价只有13。当图中顶点个数较多并且各边的代价分布比较均匀时,最近邻点策略可以给出较好的近似解,不过,这个近似解以何种程度近似于最优解,却难以保证。例如,在图7.1中,如果增大边(2, 1)的代价,则总代价只好随之增加,没有选择的余地。【算法1】设图G中n个顶点的编号为1, 2, , n,cij表示顶点i到顶点j的代价(1i, jn),集合V存储图的顶点,集合P存储经过的边,从顶点w出发采用最近邻点策略求解TSP问题的算法如下:算法7.2:最近邻点策略求解TSP问题输入:无向带权图G=(V, E)输出:回路长度TSPLength1. 初始化:P= ; TSP

8、Length = 0;2. u=w; V=V-w; 3. 循环直到集合P中包含n-1条边3.1 查找与顶点u邻接的最小代价边(u, v)并且v属于集合V;3.2 P=P+(u, v); V=V-v; TSPLength = TSPLength + cuv;3.3 输出经过的路径uv,u=v,转步骤3继续求解;4. 输出TSPLength + cuw;例3 图着色问题【问题】给定无向连通图G=(V, E),图着色问题(graph coloring problem)求图G的最小色数k,使得用k种颜色对G中的顶点着色,可使任意两个相邻顶点着不同颜色。例如,图7.3所示的无向图可以只用两种颜色着色,将

9、顶点1、3和4着一种颜色,将顶点2和顶点5着另外一种颜色。【想法】假定k个颜色的集合为1, 2, , k。一种显然的贪心策略是选择一种颜色,用该颜色为尽可能多的顶点着色,具体地,选取颜色1,依次考察图中的未被着色的每个顶点,如果某顶点可以用颜色1着色,换言之,该顶点的邻接点都还未被着色,则用颜色1为该顶点着色;再选择颜色2,依次考察图中的未被着色的每个顶点,如果某顶点着颜色2与其相邻顶点的着色不发生冲突,则用颜色2为该顶点着色;如果还有未着色的顶点,则选取颜色3并为尽可能多的顶点着色,依此类推。需要说明的是,贪心法求解图着色问题得到的不一定是最优解。考虑一个具有2n个顶点的无向图,顶点的编号从

10、1到2n,当i是奇数时,顶点i与除了顶点i+1之外的其他所有编号为偶数的顶点邻接,当i是偶数时,顶点i与除了顶点i-1之外的其他所有编号为奇数的顶点邻接,这样的图称为二部图(bipartite graph)。在二部图中,顶点可以分成两个集合V1(编号为奇数的顶点集合)和V2(编号为偶数的顶点集合),并且每一条边都连接V1中的一个顶点和V2中的一个顶点。图7.4所示就是一个具有8个顶点的二部图。显然,二部图只用两种颜色就可以完成着色,例如,可以将奇数顶点全部着成颜色1,将偶数顶点全部着成颜色2。如果贪心法以1, 3, , 2n-1, 2, 4, , 2n的顺序为二部图着色,则算法可以得到这个最优

11、解,但是如果贪心法以1, 2, , n的自然顺序为二部图着色,则算法找到的是一个需要n种颜色的解。【算法】设数组colorn表示顶点的着色情况,贪心法求解图着色问题的算法如下:算法7.4:贪心法求解图着色问题输入:无向连通图G=(V, E)输出:最小色数k1. 所有顶点置未着色状态:2. 颜色k初始化为0; 3. 循环直到所有顶点均着色 3.1 取下一种颜色k+; 3.2 依次考察所有顶点: 3.2.1 若顶点i已着色,则转步骤3.2,考察下一个顶点; 3.2.2 若顶点i着颜色k不冲突,则colori=k;4. 输出各顶点的着色;例4 最小生成树问题prim算法【问题】设G=(V,E)是一个

12、无向连通网,求G的最小生成树。最小生成树(minimal spanning tree)是各边的权值之和最小的生成树。 【想法】最小生成树问题的贪心策略可以采用最近顶点策略:任选一个顶点,并以此建立生成树的根结点,每一步的贪心选择是把不在生成树中的最近顶点添加到生成树中。Prim算法就应用了这个贪心策略,它使生成树以一种自然的方式生长,即从任意顶点开始,每一步为这棵树添加一个分枝,直到生成树中包含全部顶点。设最小生成树T=(U, TE),初始时U=u0(u0为任意顶点),TE= 。显然,Prim算法的关键是如何找到连接U和V-U的最短边来扩充生成树T。对于每一个不在当前生成树中的顶点vV-U,必

13、须知道它连接生成树的最短边信息。所以,对不在当前生成树中的顶点vV-U,需要保存两个信息:lowcostv表示顶点v到生成树中所有顶点的最短边;adjvexv表示该最短边在生成树中的顶点。例如,对于图7.5(a)所示连通网,图7.5(b)(g)给出了从顶点A出发,用Prim算法构造最小生成树的过程。 【算法】设置数组shortEdgen表示候选最短边集,数组元素包括adjvex和lowcost两个域,分别表示候选最短边的邻接点和权值,例如,式7-1表明候选最短边(vi, vk)的权值为w,其中viV-U,vkU。(式7-1) 假设从顶点w出发构造最小生成树,则初始时,Uw,且shortEdge

14、w.lowcost = 0,表示顶点w已加入集合U中,数组元素shortEdgei.adjvex = 0,shortEdgei.lowcost = (w, i)的权值(1in-1)。然后在数组shortEdgen中不断选取最小权值shortEdgek.lowcost,将shortEdgek.lowcost置为0,表示顶点k已加入集合U中。由于顶点k从集合V-U进入集合U后,候选最短边集发生了变化,依据式7-2更新数组shortEdge的内容:(式7-2)设图G中顶点的编号为0n-1,Prim算法如下:算法7.5:Prim算法输入:无向连通网G=(V,E),起始点w输出:最小生成树1. 初始化辅

15、助数组shortEdge;2. U=w; 输出顶点w; 3. 重复执行下列操作n-1次 3.1 在lowcost中选取最短边,取adjvex中对应的顶点序号k; 3.2 输出顶点k和对应的权值; 3.3 U=U+k; 3.4 调整数组shortEdge;例5 最小生成树问题Kruskal算法【想法】最小生成树问题的贪心策略可以采用最短边策略:设最小生成树的边集为TE,最短边策略从TE=开始,每一次贪心选择都是在边集E中选取最短边(u, v),如果边(u, v)加入集合TE中不产生回路,则将边(u, v)加入边集TE中,并将它在集合E中删去。Kruskal算法就应用了这个贪心策略,它使生成树以一

16、种随意的方式生长,先让森林中的树木随意生长,每生长一次就将两棵树合并,到最后合并成一棵树。Kruskal算法对图7.6(a)所示无向连通网构造最小生成树的过程如图7.6(b)(f)所示,其中,粗边表示已加入边集TE中。121212261919192525171717 (d) (e) (f)图7.6 Kruskal方法构造最小生成树的过程【算法2】设图G中顶点的编号为0n-1,Kruskal算法如下:算法7.6:Kruskal算法输入:无向连通网G=(V,E)输出:最小生成树1. 初始化:U=V; TE= ; 2. 循环直到T中的连通分量个数为1 2.1 在E中寻找最短边(u,v);2.2 如果

17、顶点u、v位于T的两个不同连通分量,则2.2.1 将边(u,v)并入TE;2.2.2 将这两个连通分量合为一个;2.3 E=E-(u,v);例6 背包问题【问题】给定n个物品和一个容量为C的背包,物品i的重量是wi,其价值为vi,背包问题(knapsack problem)是如何选择装入背包的物品,使得装入背包中物品的总价值最大。注意和0/1背包问题的区别,在背包问题中,可以将某种物品的一部分装入背包中,但不可以重复装入。【想法】用贪心法求解背包问题的关键是如何选定贪心策略,使得按照一定的顺序选择每个物品,并尽可能的装入背包,直到背包装满。至少有三种看似合理的贪心策略:(1)选择价值最大的物品

18、,因为这可以尽可能快地增加背包的总价值。但是,虽然每一步选择获得了背包价值的极大增长,但背包容量却可能消耗得太快,使得装入背包的物品个数减少,从而不能保证目标函数达到最大。(2)选择重量最轻的物品,因为这可以装入尽可能多的物品,从而增加背包的总价值。但是,虽然每一步选择使背包的容量消耗得慢了,但背包的价值却没能保证迅速增长,从而不能保证目标函数达到最大。(3)以上两种贪心策略或者只考虑背包价值的增长,或者只考虑背包容量的消耗,而为了求得背包问题的最优解,需要在背包价值增长和背包容量消耗两者之间寻找平衡。正确的贪心策略是选择单位重量价值最大的物品。【算法】设背包容量为C,共有n个物品,物品重量存

19、放在数组wn中,价值存放在数组vn中,问题的解存放在数组xn中,贪心法求解背包问题的算法如下:算法7.7:贪心法求解背包问题输入:背包容量C,物品重量wn,物品价值vn输出:数组xn1. 改变数组w和v的排列顺序,使其按单位重量价值vi/wi降序排列;2. 将数组xn初始化为0; 3. i=1; 4. 循环直到(wiC) 4.1 将第i个物品放入背包:xi=1; 4.2 C=C-wi; 4.3 i+;5. xi=C/wi;例7 活动安排问题【问题】设有n个活动的集合E=1, 2, , n,其中每个活动都要求使用同一资源(如演讲会场),而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个

20、要求使用该资源的起始时间si和一个结束时间fi,且si = fj) 则 4.1.1 B=B+j; 4.1.2 j=i; 4.2 i+;例8 多机调度问题【问题】设有n个独立的作业1, 2, , n,由m台相同的机器M1, M2, , Mm进行加工处理,作业i所需的处理时间为ti(1in),每个作业均可在任何一台机器上加工处理,但不可间断、拆分。多机调度问题(multi-machine scheduling problem)要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。【想法】贪心法求解多机调度问题的贪心策略是最长处理时间作业优先,即把处理时间最长的作业分配

21、给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间。按照最长处理时间作业优先的贪心策略,当mn时,只要将机器i的0, ti)时间区间分配给作业i即可;当mn时,首先将n个作业按其所需的处理时间从大到小排序,然后依此顺序将作业分配给最先空闲的处理机。例如,设7个独立作业1, 2, 3, 4, 5, 6, 7由3台机器M1, M2, M3加工处理,各作业所需的处理时间分别为2, 14, 4, 16, 6, 5, 3,首先将这7个作业按处理时间从大到小排序,则作业4, 2, 5, 6, 3, 7, 1的处理时间为16, 14, 6, 5, 4, 3, 2,贪心

22、法产生的作业调度如图7.10所示,具体过程如下:(1)按照最长处理时间作业优先的贪心策略,将作业4分配给机器M1,则机器M1将在时间16后空闲;将作业2分配给机器M2,则机器M2将在时间14后空闲;将作业5分配给机器M3,则机器M3将在时间6后空闲,至此,三台机器均已分配作业;(2)在三台机器中空闲最早的是机器M3,将作业6分配给机器M3,并且机器M3将在时间6511后空闲;(3)在三台机器中空闲最早的是机器M3,将作业3分配给机器M3,并且机器M3将在时间114=15后空闲;(4)在三台机器中空闲最早的是机器M2,将作业7分配给机器M2,并且机器M2将在时间143=17后空闲;(5)在三台机

23、器中空闲最早的是机器M3,将作业1分配给机器M3,并且机器M3将在时间152=17后空闲。最后得到所需加工的最短时间为17。 【算法】设n个作业的处理时间存储在数组tn中,m台机器的空闲时间存储在数组dm中,集合数组Sm存储每台机器所处理的作业,其中集合Si表示机器i所处理的作业,贪心法求解多机调度问题的算法如下:算法7.9:多机调度问题输入:n个作业的处理时间tn,m台机器的空闲时间dm输出:每台机器所处理的作业Sm1将数组tn由大到小排序,对应的作业序号存储在数组pn中;2将数组dm初始化为0;3for (i=0; im; i+) 3.1 将前m个作业分配给m个机器:Si=pi; 3.2 di=ti; 4. for (i=m; in; i+) 4.1 j=数组dm中最小值对应的下标; 4.2 将作业i分配给最先空闲的机器j :Sj=Sj+pi; 4.3 机器j将在dj后空闲:dj=dj+ti;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1