- 1、本文档共36页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.3 算法设计-贪婪算法
算法设计与分析演示稿 纪玉波制作(C) 算法设计与分析 ——贪婪算法 * * 贪婪算法(greedy algorithms,也叫登山法) 我们来看一个找硬币的例子。假设有四种硬币,它们的面值分别为二角五分、一角、五分和一分。现在要找给某顾客六角三分钱。这时,我们会不假思索地拿出2个二角五分的硬币,1个一角的硬币和3个一分的硬币交给顾客。这种找硬币方法与其他的找法相比,所拿出的硬币个数是最少的。这里,我们下意识地使用了这样的找硬币算法:首先选出一个面值不超过六角三分的最大硬币,即二角五分;然后从六角三分中减去二角五分,剩下三角八分;再选出一个面值不超过三角八分的最大硬币,即又一个二角五分,如此一直做下去。这个找硬币的方法实际上就是贪婪算法。 顾名思义,贪婪算法总是作出在当前看来是最好的选择。也就是说贪婪算法并不从整体最优上加以考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,我们希望贪婪算法得到的最终结果也是整体最优的。上面所说的找硬币算法得到的结果就是一个整体最优解。虽然贪婪算法不是对所有问题都能得到整体最优解,但对范围相当广的许多问题它能产生整体最优解。如图的单源最短路径问题,最小生成树问题等。在一些情况下,即使贪婪算法不能得到整体最优解,但其最终结果却是最优解的很好的近似解。 例1.选取砝码 设天平有一些25克的砝码,一些10克的砝码,一些5克的砝码和一些1克的砝码。现要称63克的物体,问至少需要用几个砝码。 用贪婪算法,为了砝码数最少,在不超过63克的前提 下,每次都尽量选择大的砝码,即头两次选25克的,然后选一个10克的,最后选三个1克的。总共用六个砝码,事实说明这是最好的结果。 如果问题改成:砝码的种类分别为11克、5克和1克,待称的物体是15克。用贪婪算法应先选一个11克的,然后选四个1克的,共用五个砝码。这不是最优结果,只要用三个5克的砝码就够了。 贪婪算法虽不能保证得到最优结果,但对于一些除了“穷举”方法外没有有效算法的问题,用贪婪算法往往能很快地得出较好的结果,如果此较好结果与最优结果相差不是很多的话,此方法还是很实用的。 例2. 背包问题 设有n=8个体积分别为54,45,43,29,23,21,14,1的物体和一个容积为C=110的背包,问选择哪几个物体装入背包可以使其装的最满。 如直接用贪婪算法,将物体由大到小顺次装入背包,到装不下时再逐个试装更小的一些,直至试到最小的一个或装满为止。按此处所给数据,先装入54和45两个,容积尚余11,最后只能再装入体积为1的一个,总体积达到100,并不算太满。此方法的好处是节省时间,主要的运算时间是用来对n个元素进行排序,故其复杂性是O(nlogn)。 如果对上述算法作一些改进,可得到更好的结果。先从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+23+29+14+1=110)。故知此问题当取k≥2时就可得到最优解。 当n不太大时,适当的取k值,此改进方法常常可以得到最优解,但不能因此就说一般背包问题有多项式算法。当n增大时,k不能随着n不断的加大,如k随n增大而同时加大,其复杂性就是指数型而不是多项式型的了,而如k取值较小,又不能保证得出最优解。 例3.巡回推销员问题 设有5座城市,城市间的距离矩阵为: 前面用分枝限界方法讨论此问题,现以此为例来说明贪婪算法的应用。 将城市间的距离从小到大排列有: d24(1),d13(2),d15(2),d25(3),d45(6),d35(9),d34(9), d12(14),d14(16),d23(25)。 由于是5个城市,环绕一圈为5条边,贪婪方法求解此问题的过程是从最小边开始,依此从小到大取边加入到回路边集中,但在将1条边加入时不能使1顶点的度数超过3,也不能形成小回路。 此问题解的过程如下: d24(1); d24(1)+d13(2); d24(1)+d13(2)+d15(2); d24(1)+
文档评论(0)