- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(算法设计与分析第五章贪心算法
贪心算法
§1.贪心算法基本思想
找零钱 假如售货员需要找给小孩67美分的零钱。现在,售货员手中只有25美分、10美分、5美分和1美分的硬币。在小孩的催促下,售货员想尽快将钱找给小孩。她的做法是:先找不大于67美分的最大硬币25美分硬币,再找不大于67-25=42美分的最大硬币25美分硬币,再找不大于42-25=17美分的最大硬币10美分硬币,再找不大于17-10=7美分的最大硬币5美分硬币,最后售货员再找出两个1美分的硬币。至此,售货员共找给小孩6枚硬币。售货员的原则是拿尽可能少的硬币个数找给小孩。从另一个角度看,如果售货员将捡出的硬币逐一放在手中,最后一起交给小孩,那么售货员想使自己手中的钱数增加的尽量快些,所以每一次都尽可能地捡面额大的硬币。
装载问题 有一艘大船用来装载货物。假设有n个货箱,它们的体积相同,重量分别是,货船的最大载重量是c。目标是在船上装最多货箱该怎样装?如果用表示装第个货箱,而表示不装第个货箱,则上述问题是解优化问题:求,
(5.1.1)
(5.1.2)
贪心方法,顾名思义,是在决策中总是作出在当前看来是最好的选择。例如找零钱问题中,售货员每捡一个硬币都想着使自己手中的钱尽快达到需要找钱的总数。在装载问题中,每装一个货箱都想着在不超重的前提下让船装更多的箱子。但是贪心方法并未考虑整体最优解,它所作出的选择只是在某种意义上的局部最优选择。当然,在采用贪心算法时未必不希望结果是整体最优的。事实上,有相当一部分问题,采用贪心算法能够达到整体最优,如前面的找零钱问题以及后面将要讲到的单点源最短路径问题、最小生成树问题、工件排序问题等。为了更好理解贪心算法,我们将装载问题稍加推广,考虑可分割的背包问题。
背包问题 已知容量为的背包和件物品。第件物品的重量为,价值是。因而将物品的一部分放进背包即获得的价值。问题是:怎样装包使所获得的价值最大。即是如下的优化问题:
(5.1.3)
(5.1.4)
采用贪心方法,有几种原则可循:a).每次捡最轻的物品装;b).每次捡价值最大的装;c).每次装包时既考虑物品的重量又考虑物品的价值,也就是说每次捡单位价值最大的装。按原则a来装只考虑到多装些物品,但由于单位价值未必高,总价值不能达到最大;按原则b来装,每次选择的价值最大,但同时也可能占用了较大的空间,装的物品少,未必能够达到总价值最大。比较合理的原则是c)。事实上,按照原则c)来装,确实能够达到总价值最大。
程序5-1-1 背包问题贪心算法
GreedyKnapsack(p, w, M, x, n) //价值数组p[1:n]、重量数组w[1:n],
//它们元素的排列顺序满足p[i]/w[i]≥p[i+1]/w[i+1]; M是背包容量,
// x是解向量
real p[1:n], w[1:n], x[1:n], M, rc;
integer i, n;
x=0; // 将解向量初始化为零
rc=M; // 是背包剩余容量初始化为M
for i from 1 to n do
if w[i] rc then exit endif
x[i]=1; rc=rc-w[i];
endfor
if i?n then
x[i]=rc/w[i];
endif
end GreedyKnapsack
例子 n=3, M=20, p=(25, 24, 15), w=(18,15,10)(说明该算法的执行情况)
定理5.1.1 如果,则GreedyKnapsack对于给定的背包问题实例生成一个最优解。
证明 设是GreedyKnapsack所生成的解,但不是最优解。因而必有某个不为1。不妨设是第一个这样的分量。于是,当时,;当,;当时,。不妨假定。因为不是最优解,必存在解向量,使得。设是使得的最小下标,则yk xk. 这是因为:当时,,上述不等式自然成立;当时,因为,所以由可推出,不是解向量,矛盾。
由,可以假定,进而有。
现在取新的向量满足
,
而且
由上段的不等式,这样的向量是存在的,而且是背包问题的可行解,因为
至此,我们找到一个新的解向量。以下证明它的总价值不小于的总价值:
中间的不等式是由于当时有而得。但是与的不同分量的个数比与的不同分量的个数至
文档评论(0)