贪心算法学习.docx
- 文档编号:2778861
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:14
- 大小:27.84KB
贪心算法学习.docx
《贪心算法学习.docx》由会员分享,可在线阅读,更多相关《贪心算法学习.docx(14页珍藏版)》请在冰豆网上搜索。
贪心算法学习
贪心算法
一、算法思想
贪心法的基本思路:
——从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。
当达到某算法中的某一步不能再继续前进时,算法停止。
该算法存在问题:
1.不能保证求得的最后解是最佳的;
2.不能用来求最大或最小解问题;
3.只能求满足某些约束条件的可行解的范围。
实现该算法的过程:
从问题的某一初始解出发;
while能朝给定总目标前进一步do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解;
二、例题分析
1、[背包问题]有一个背包,背包容量是M=150。
有7个物品,物品可以分割成任意大小。
要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
物品A B CDEFG
重量35 30 60 50 40 10 25
价值 10 40 3050 35 40 30
分析:
目标函数:
∑pi最大
约束条件是装入的物品总重量不超过背包容量:
∑wi<=M(M=150)
(1)根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?
(2)每次挑选所占重量最小的物品装入是否能得到最优解?
(3)每次选取单位重量价值最大的物品,成为解本题的策略。
?
值得注意的是,贪心算法并不是完全不可以使用,贪心策略一旦经过证明成立后,它就是一种高效的算法。
贪心算法还是很常见的算法之一,这是由于它简单易行,构造贪心策略不是很困难。
可惜的是,它需要证明后才能真正运用到题目的算法中。
一般来说,贪心算法的证明围绕着:
整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的。
对于例题中的3种贪心策略,都是无法成立(无法被证明)的,解释如下:
(1)贪心策略:
选取价值最大者。
反例:
W=30
物品:
A B C
重量:
281212
价值:
302020
根据策略,首先选取物品A,接下来就无法再选取了,可是,选取B、C则更好。
(2)贪心策略:
选取重量最小。
它的反例与第一种策略的反例差不多。
(3)贪心策略:
选取单位重量价值最大的物品。
反例:
W=30
物品:
A B C
重量:
282010
价值:
282010
根据策略,三种物品单位重量价值一样,程序无法依据现有策略作出判断,如果选择A,则答案错误。
所以需要说明的是,贪心算法可以与随机化算法一起使用,具体的例子就不再多举了。
(因为这一类算法普及性不高,而且技术含量是非常高的,需要通过一些反例确定随机的对象是什么,随机程度如何,但也是不能保证完全正确,只能是极大的几率正确)
贪心算法的基本要素:
1、贪心选择性质:
所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
(与动态规划的主要区别)
采用自顶向下,以迭代的方式作出相继的贪心选择,每作一次谈心选择就将所求问题简化为一个规模更小的子问题。
对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终导致问题的最优解。
通常可以首先证明问题的一个整体最优解,是从贪心选择开始的,而且作了贪心选择后,原问题简化为一个规模更小的类似子问题。
然后,用数学归纳法证明,通过每一步作贪心选择,最终可得到问题的一个整体最优解。
2、最优子结构性质:
包含子问题的最优解
1、设有n个活动的安排,其中每个活动都要求使用同一资源,如演讲会场,而在同一时间只允许一个活动使用这一资源。
每个活动都有使用的起始时间和结束时间。
问:
如何安排可以使这间会场的使用率最高。
活动起始时间结束时间
114
235
306
457
538
659
7610
8811
9812
10213
111214
算法:
一开始选择活动1,然后依次检查活动一i是否与当前已选择的所有活动相容,若相容则活动加入到已选择的活动集合中,否则不选择活动i,而继续检查下一活动的相容性。
即:
活动i的开始时间不早于最近加入的活动j的结束时间。
Prodedureplan;
Begin
n:
=length[e];
a{1};
j:
=1;
fori:
=2tondo
ifs[i]>=f[j]then
beginaa∪{i};
j:
=i;
end
end;
例1[找零钱]一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。
售货员希望用数目最少的硬币找给小孩。
假设提供了数目不限的面值为25美分、10美分、5美分、及1美分的硬币。
售货员分步骤组成要找的零钱数,每次加入一个硬币。
选择硬币时所采用的贪婪准则如下:
每一次选择应使零钱数尽量增大。
为保证解法的可行性(即:
所给的零钱等于要找的零钱数),所选择的硬币不应使零钱总数超过最终所需的数目。
假设需要找给小孩67美分,首先入选的是两枚25美分的硬币,第三枚入选的不能是25美分的硬币,否则硬币的选择将不可行(零钱总数超过67美分),第三枚应选择10美分的硬币,然后是5美分的,最后加入两个1美分的硬币。
贪婪算法有种直觉的倾向,在找零钱时,直觉告诉我们应使找出的硬币数目最少(至少是接近最少的数目)。
可以证明采用上述贪婪算法找零钱时所用的硬币数目的确最少(见练习1)。
例2[机器调度]现有n件任务和无限多台的机器,任务可以在机器上得到处理。
每件任务的开始时间为si,完成时间为fi,si [si,fi]为处理任务i的时间范围。 两个任务i,j重指两个任务的时间范围区间有重叠,而并非是指i,j的起点或终点重合。 例如: 区间[1,4]与区间[2,4]重叠,而与区间[4,7]不重叠。 一个可行的任务分配是指在分配中没有两件重叠的任务分配给同一台机器。 因此,在可行的分配中每台机器在任何时刻最多只处理一个任务。 最优分配是指使用的机器最少的可行分配方案。 假设有n=7件任务,标号为a到g。 它们的开始与完成时间如图13-1a所示。 若将任务a分给机器M1,任务b分给机器M2,...,任务g分给机器M7,这种分配是可行的分配,共使用了七台机器。 但它不是最优分配,因为有其他分配方案可使利用的机器数目更少,例如: 可以将任务a、b、d分配给同一台机器,则机器的数目降为五台。 一种获得最优分配的贪婪方法是逐步分配任务。 每步分配一件任务,且按任务开始时间的非递减次序进行分配。 若已经至少有一件任务分配给某台机器,则称这台机器是旧的;若机器非旧,则它是新的。 在选择机器时,采用以下贪婪准则: 根据欲分配任务的开始时间,若此时有旧的机器可用,则将任务分给旧的机器。 否则,将任务分配给一台新的机器。 根据例子中的数据,贪婪算法共分为n=7步,任务分配的顺序为a、f、b、c、g、e、d。 第一步没有旧机器,因此将a分配给一台新机器(比如M1)。 这台机器在0到2时刻处于忙状态。 在第二步,考虑任务f。 由于当f启动时旧机器仍处于忙状态,因此将f分配给一台新机器(设为M2)。 第三步考虑任务b,由于旧机器M1在Sb=3时刻已处于闲状态,因此将b分配给M1执行,M1下一次可用时刻变成fb=7,M2的可用时刻变成ff=5。 第四步,考虑任务c。 由于没有旧机器在Sc=4时刻可用,因此将c分配给一台新机器(M3),这台机器下一次可用时间为fc=7。 第五步考虑任务g,将其分配给机器M2,第六步将任务e分配给机器M1,最后在第七步,任务2分配给机器M3。 (注意: 任务d也可分配给机器M2)。 上述贪婪算法能导致最优机器分配的证明留作练习(练习7)。 可按如下方式实现一个复杂性为O(nlogn)的贪婪算法: 首先采用一个复杂性为O(nlogn)的排序算法(如堆排序)按Si的递增次序排列各个任务,然后使用一个关于旧机器可用时间的最小堆。 例3[最短路径]给出一个有向网络,路径的长度定义为路径所经过的各边的耗费之和。 要求找一条从初始顶点s到达目的顶点d的最短路径。 贪婪算法分步构造这条路径,每一步在路径中加入一个顶点。 假设当前路径已到达顶点q, 且顶点q并不是目的顶点d。 加入下一个顶点所采用的贪婪准则为: 选择离q最近且目前不在路径中的顶点。 这种贪婪算法并不一定能获得最短路径。 例如,假设在图13-2中希望构造从顶点1到顶点5的最短路径,利用上述贪婪算法,从顶点1开始并寻找目前不在路径中的离顶点1最近的顶点。 到达顶点3,长度仅为2个单位,从顶点3可以到达的最近顶点为4,从顶点4到达顶点2,最后到达目的顶点5。 所建立的路径为1,3,4,2,5,其长度为10。 这条路径并不是有向图中从1到5的最短路径。 事实上,有几条更短的路径存在,例如路径1,4,5的长度为6。 根据上面三个例子,回想一下前几章所考察的一些应用,其中有几种算法也是贪婪算法。 例如,霍夫曼树算法,利用n-1步来建立最小加权外部路径的二叉树,每一步都将两棵二叉树合并为一棵,算法中所使用的贪婪准则为: 从可用的二叉树中选出权重最小的两棵。 LPT调度规则也是一种贪婪算法,它用n步来调度n个作业。 首先将作业按时间长短排序,然后在每一步中为一个任务分配一台机器。 选择机器所利用的贪婪准则为: 使目前的调度时间最短。 将新作业调度到最先完成的机器上(即最先空闲的机器)。 注意到在机器调度问题中,贪婪算法并不能保证最优,然而,那是一种直觉的倾向且一般情况下结果总是非常接近最优值。 它利用的规则就是在实际环境中希望人工机器调度所采用的规则。 算法并不保证得到最优结果,但通常所得结果与最优解相差无几,这种算法也称为启发式方法(heuristics)。 因此LPT方法是一种启发式机器调度方法。 定理9-2陈述了LPT调度的完成时间与最佳调度的完成时间之间的关系,因此LPT启发式方法具有限定性 能(boundedperformance)。 具有限定性能的启发式方法称为近似算法(approximationalgorithm)。 本章的其余部分将介绍几种贪婪算法的应用。 在有些应用中,贪婪算法所产生的结果总是最优的解决方案。 但对其他一些应用,生成的算法只是一种启发式方法,可能是也可能不是近似算法。 练习 1.证明找零钱问题(例13-4)的贪婪算法总能产生具有最少硬币数的零钱。 2.考虑例13-4的找零钱问题,假设售货员只有有限的25美分,10美分,5美分和1美分的硬币,给出一种找零钱的贪婪算法。 这种方法总能找出具有最少硬币数的零钱吗? 证明结论。 3.扩充例13-4的算法,假定售货员除硬币外还有50,20,10,5,和1美元的纸币,顾客买价格为x美元和y美分的商品时所付的款为u美元和v美分。 算法总能找出具有最少纸币与硬币数目的零钱吗? 证明结论。 4.编写一个C++程序实现例13-4的找零钱算法。 假设售货员具有面值为100,20,10,5和1美元的纸币和各种硬币。 程序可包括输入模块(即输入所买商品的价格及顾客所付的钱数),输出模块(输出零钱的数目及要找的各种货币的数目)和计算模块(计算怎样给出零钱)。 5.假设某个国家所使用硬币的币值为14,2,5和1分,则例13-4的贪婪算法总能产生具有最少硬币数的零钱吗? 证明结论。 6.1)证明例13-5的贪婪算法总能找到最优任务分配方案。 2)实现这种算法,使其复杂性为O(nlogn)(提示: 根据完成时间建立最小堆)。 *7.考察例13-5的机器调度问题。 假定仅有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪心 算法 学习