贪婪算法思想及其应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
贪婪算法思想及其应用
摘要:贪婪算法也称作贪心算法,它没有固定的算法框架,算法设计的关键是贪婪策略的选择,并且所选的贪婪策略要具有无后向性。
关键词:贪婪策略,无后向性,最优
正文:
一.贪婪算法的定义:
贪婪算法又叫登山法,它的根本思想是逐步到达山顶,即逐步获得最优解,是解决最优化问题时的一种简单但适用范围有限的策略。
二.贪婪算法思想:
贪婪算法采用逐步构造最优解的方法,即在每个阶段,都选择一个看上去最优的策略(在一定的标准下)。策略一旦选择就不可再更改,贪婪决策的依据称为贪婪准则,也就是从问题的某一个初始解出发并逐步逼近给定的目标,以尽可能快的要求得到更好的解。而且它在设计时没有固定的框架,关键在于贪婪策略的选择。但要注意的是选择的贪婪策略要具有无后向性,即某阶段状态一旦确定下来后,不受这个状态以后的决策的影响,也就是说某状态以后的过程不会影响以前的状态,只与当前状态有关。
三.贪婪算法的优缺点:
贪婪算法的优点在于在求解问题的每一步它都是选择最优解,这样算法就容易实现也易于理解,同时也提高了效率并节省了时间。然而贪婪算法的缺点也是不容忽视的,由于它采取逐步获得最优解的方法而不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。因此贪婪算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题它都能得出整体最优解或者是整体最优解的近似解。
四. 实例参考:
下面就列举用贪婪算法成功得出问题最优解的例子:
例:一个小孩拿着一美元去商店买糖果,花了33美分,售货员需要找回67美分给小孩,而美分的面值有25,10,5,1这几种。问题是售货员找个小孩的钱币的个数应是最少的,但同时要满足67美分这个条件。
分析:选择硬币时所采用的贪婪准则如下:每一次都选择面值最大的货币来凑足要找的零钱总数,但前提是不能超出要找的67美分。
解:我们用贪婪算法来处理这个问题,首先我们肯定会选择面值为25的货币,这样的货币我们需要两枚,然后我们依据贪婪准则选择面值为10的货币,这样的货币我们需要一枚,接着继续选择面值为5的货币一枚和面值为1的货币两枚。这样我们用贪婪算法就得到了解决问题的办法,而在实际中这也确实是这个问题的最优解。因此在找钱这个问题上,我们采用贪婪算法就能满足我们找出的钱的个数最少这个条件。
贪婪算法同时也有很多无法得出最优解的例子,比如我们熟知的背包问题:
例:有一个背包,容量是M=150。有7个物品,物品不能分割成任意大小。
要求尽可能让装入背包中的物品的总价值最大,但不能超过总容量。
物品:A B C D E F G
重量:35 30 60 50 40 10 25
价值:10 40 30 50 35 40 30
在使用贪婪算法的前提下解决下列问题,能否得到最优结果?
1.每次挑选价值最大的物品装入背包;
2.每次挑选所占重量最小的物品装入背包;
3.每次挑选单位重量价值最大的物品装入背包。
对于例题中的三种贪婪策略,都是无法成立的,即不能得到最优解。解释如下:
(1)贪婪策略:选取价值最大者。
反例:
背包容量:M=30
物品:A B C
重量:28 12 12
价值:30 20 20
根据策略,首先会选取价值最大的物品A,接下来就不能再进行选取了。然而实际情况是选择B或者C更好。
(2)贪婪策略:选取重量最小者。
反例:
背包容量:M=30
物品:A B C
重量:30 15 10
价值:60 30 10
根据策略,首先会选取重量最小的物品C,接下来就不能再进行选取了。然而实际情况是选择A或者B更好
(3)贪婪策略:选取单位重量价值最大者。
反例:
背包容量:M=40
物品:A B C
重量:28 15 10
价值:28 15 10
根据策略,要选择单位重量价值最大的,然而三种物品的单位重量价值一样,程序无法依据当前的策略做出判断,如果选A或者B,则答案都是错误的。
五.注意:贪婪算法可以提高效率节省时间,我们在设计算法的时候要注意贪婪策略的选择。
一定要注意所选算法的正确性,即要确保算法的可行性。在可行的条件下要能得出
整体最优解或近似的最优解。
六.参考文献:
《算法设计与分析》(第二版)清华大学出版社吕国英主编任瑞征钱宇华参编