- 1、本文档共40页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法设计与分析演示稿 纪玉波制作(C) 算法设计与分析 ——贪婪算法 这个问题是一个NP完全问题,到目前为止还没有一个有效的解法。对于这一类问题,用贪婪选择策略有时可以设计出较好的近似算法。采用最长处理时间作业优先的贪婪选择策略可以设计出解多机调度问题的较好的近似算法。按此策略,当n≤m时,我们只要将机器i的[0,ti]时间区间分配给作业i即可。 当n>m时,我们首先将n个作业依其所需的处理时间从大到小排序。然后依此顺序将作业分配给空闲的处理机。 例如,对右图中的有向图,应用Dijkstra算法计算从源顶点1到其他顶点间最短路径的过程列在下页的表中。 Dijkstra算法每次从V-S中取出具有最短路径长度的顶点vi,将vi添加到S中,同时检查vi添加到S中后,源点到V-S中各顶点的距离是否可以通过源点到vi的路径而缩短,如果缩短则对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其他顶点之间的最短路径长度。 例如下图所示 距离矩阵 现以顶点6为源点,求到其他各顶点的最短路径长度。 我们来看一个找硬币的例子。假设有四种硬币,它们的面值分别为二角五分、一角、五分和一分。现在要找给某顾客六角三分钱。这时,我们会不假思索地拿出2个二角五分的硬币,1个一角的硬币和3个一分的硬币交给顾客。这种找硬币方法与其他的找法相比,所拿出的硬币个数是最少的。这里,我们下意识地使用了这样的找硬币算法:首先选出一个面值不超过六角三分的最大硬币,即二角五分;然后从六角三分中减去二角五分,剩下三角八分;再选出一个面值不超过三角八分的最大硬币,即又一个二角五分,如此一直做下去。这个找硬币的方法实际上就是贪婪算法。 贪婪算法(greedy algorithms,也叫登山法) 顾名思义,贪婪算法总是作出在当前看来是最好的选择。也就是说贪婪算法并不从整体最优上加以考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,我们希望贪婪算法得到的最终结果也是整体最优的。上面所说的找硬币算法得到的结果就是一个整体最优解。虽然贪婪算法不是对所有问题都能得到整体最优解,但对范围相当广的许多问题它能产生整体最优解。如图的单源最短路径问题,最小生成树问题等。在一些情况下,即使贪婪算法不能得到整体最优解,但其最终结果却是最优解的很好的近似解。 设天平有一些25克的砝码,一些10克的砝码,一些5克的砝码和一些1克的砝码。现要称63克的物体,问至少需要用几个砝码。 用贪婪算法,为了砝码数最少,在不超过63克的前提 下,每次都尽量选择大的砝码,即头两次选25克的,然后选一个10克的,最后选三个1克的。总共用六个砝码,事实说明这是最好的结果。 例1.选取砝码 如果问题改成:砝码的种类分别为11克、5克和1克,待称的物体是15克。用贪婪算法应先选一个11克的,然后选四个1克的,共用五个砝码。这不是最优结果,只要用三个5克的砝码就够了。 贪婪算法虽不能保证得到最优结果,但对于一些除了“穷举”方法外没有有效算法的问题,用贪婪算法往往能很快地得出较好的结果,如果此较好结果与最优结果相差不是很多的话,此方法还是很实用的。 设有n=8个体积分别为54,45,43,29,23,21,14,1的物体和一个容积为C=110的背包,问选择哪几个物体装入背包可以使其装的最满。 如直接用贪婪算法,将物体由大到小顺次装入背包,到装不下时再逐个试装更小的一些,直至试到最小的一个或装满为止。按此处所给数据,先装入54和45两个,容积尚余11,最后只能再装入体积为1的一个,总体积达到100,并不算太满。此方法的好处是节省时间,主要的运算时间是用来对n个元素进行排序,故其复杂性是O(nlogn)。 例2. 背包问题 如果对上述算法作一些改进,可得到更好的结果。先从n个物体中试着取j个总体积不超过C的装入背包,剩下的(n-j)个物体则利用贪婪算法尽量往里装。此j值从零开始逐渐增加,反复进行试探,直至j达到某预先给定的常数k(0kn),最后从这些结果中取其最好的一个。如果在试探中能得到一个完全装满的方案,则此过程就可提前结束。因为从n个物体中取出j个共有 种方案,此值随着j的增加而增加较快,但可以证明此改进算法的复杂性为O(knk+1),因k是常数,故仍为多项式界的算法。 按本例所给数值,取j=0时,因就是前述普通贪婪算法,已经得到100的结果;取j=1时,共有8种方案,当用29或23先装入时,可得到54+29+23+1=107的更好结果;取j=2时,共有28种方案,其中有能将背包完全装满的结果(43
文档评论(0)