关闭

贪婪算法

4388人阅读 评论(1) 收藏 举报
分类:

0) 引论

贪婪算法是分阶段进行的一种算法,每一个阶段,我们只取最好的决策,而不管以后。贪婪算法是“take what you can get now”策略。

贪婪算法的结果一般会取到的是局部最优值而非全局最优的,一般情况下这两个值是不相等的,但是很多情况下,可以用局部最优值来模拟近似全局最优值。

常用的图论中的Dijkstra算法以及Kruskal算法都利用了贪婪算法的思想。

贪婪算法的一个典型例子是零钱兑换:

假设需要兑换16快钱的零钱,同时假设货币有10元,5元,1元的,同时我们定义钱的个数第为优,那么利用贪婪算法的兑换结果为一个10元,一个5元,一个1元,这个是全局最优解。但是假设货币有12元,10元,5元,1元的,那么利用贪婪算法的兑换结果为一个12元,四个1元,这个就不是最优解了,最优解仍是一个10元,一个5元,一个1元。

因此我们可以看到贪婪算法是无法保证最优解的,它只是提供了一个分段解决问题的思想,得到的结果只是局部最优。


1) 简单的调度问题

假设一个单核CPU有下面的4个任务,现在求这四个任务的平均完成时间。


一种方法是上面的Schedual #1,也就是按照Job的先后顺序来工作,那么平均完成时间为(15+(15+8)+(15+8+3)+(15+8+3+10))/4 = 25.

而一种方法是上面的Schedual #2,也就是先处理时间小的Job,那么平均完成时间为(3+(3+8)+(3+8+10)+(3+8+10+15))/4 = 17.75.

Schedual #2就是一种贪婪算法,每一个阶段只处理最好的值,在这里就是运行时间最短。这里贪婪算法能够取得最好的结果


2) 多线程调度问题

假设我们有多个CPU,同时进行以下的任务,要求这些任务的平均完成时间。


图中的方案就是根据贪婪算法得到的最优的解决方案,可以看到每个CPU按照最短的完成时间来进行任务分配。


3) 最快完成时间

针对上面的多线程任务问题,这里假设我们变更要求,要得到最快完成时间,即求所有任务完成需要的时间。

可以得到下面的最优结果


其实这个问题是一个NP-Complete问题,利用贪婪算法很难得到一个最优的结果。这里只是因为例子较少,所以我们可以得到最优结果,但是当例子个数增加时,很难得到结果的。

当然对于这一问题,贪婪算法提供了解决方案,但是解决方案并不是最优的。下面我们来看看这一解决方案


4) 集装箱问题

我们通过一个集装箱问题来介绍贪婪算法在上面问题的解决方案。

假设我们有一些包裹,他们的大小分别为2,5,4,7,1,4,8 。我们有N个箱子,每个箱子的大小为10,那么问题是要装下这些包裹需要多少个箱子。

我们可以通过观察得到下面的装箱结果:


可惜计算机不是人类,同时当包裹的数量增长到一定量时,我们也很难通过观察在较短时间内得到结果。因此我们要找到较好的算法解决这一问题。

对于这一问题,有两种情况,一种是on-line的情形,一种是off-line的情形。

a) on-line算法

on-line算法是指来一个包裹我们就要处理一个包裹,我们没法得知后面的包裹的信息。

对于on-line算法,是没有最优算法的。对于on-line算法,一般有3中解决方案

aa)Next-Fit

思想是:对于每一个包裹,如果现在的箱子放不下了,那么就放到一个新的箱子里。

结果如下图所示,我们可以看到这个结果相当不优。


bb)First-Fit

思想是:对于每一个包裹,搜索前面的箱子,把包裹放到第一个能够容纳的箱子里,如果现有的所有箱子都放不下了,那么就放到一个新的箱子里。

结果如下所示,较Next-Fit算法,效果更好一点。


cc)Best-Fit

思想是:对于每一个包裹,搜索前面的箱子,把包裹放到能够最紧凑的容纳的箱子里,如果现有的所有箱子都放不下了,那么就放到一个新的箱子里。

结果如下所示,Best-Fit可以得到更加紧凑的结果。这也应该是on-line算法的最佳选择。



b) off-line算法

off-line算法是指来我们可以在处理包裹前看到所有的包裹信息,然后在对其处理。

我们可以用穷举法得到最优的方案,但是那样太过耗时,尤其是当包裹量很大时,因此我们需要更好地的算法。

这里我们可以首先按照包裹的大小排序,然后再应用上面的First-Fit或者Best-Fit算法。

在实际中First-Fit一般能够取得很好的效果,对上面的例子,可以得到








0
3
查看评论

搜索最优解算法之贪心算法

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。迪杰斯特拉算法是贪心算法的一个典型案例。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个...
  • xunfeng13
  • xunfeng13
  • 2016-05-03 21:21
  • 2841

通用局部搜索算法之爬山法也叫贪婪算法

爬山法 Hill Climbing http://blog.163.com/highway_xxw/blog/static/26754625200972884316842/ 爬山法是向值增加的方向持续移动到简单循环过程,算法在到达一个“峰顶”时终止, 此时相邻状态中没...
  • danteLiujie
  • danteLiujie
  • 2016-06-07 22:57
  • 1362

算法总结1——贪婪算法,动态规划

该文章所用的图片取自上海交大电院高晓沨老师上课所用的课件~顺便说一句,高老师的英语简直太棒了! 网址:http://cs.sjtu.edu.cn/~gao-xf/algorithm/ 正值期中,即将考试,总结一下之前学的算法还是很有必要的,一方面记录以备之后用到,一方面防止自己在复习的过程中走神...
  • Sun7_She
  • Sun7_She
  • 2016-03-31 18:16
  • 4351

通用局部搜索算法之爬山法也叫贪婪算法 (转)

通用局部搜索算法之爬山法也叫贪婪算法 设施区位及算法 2009-08-28 20:43:16 阅读36 评论0 字号:大中小 爬山法 hill-climbing爬山法是向值增加的方向持续移动到简单循环过程,算法在到达一个“峰顶”时终止,此时相邻状态中没有比该“峰顶”更高的值。爬山法不维护搜索树,当前...
  • ximenchuixuezijin
  • ximenchuixuezijin
  • 2010-05-26 08:33
  • 3892

研究生课程 算法分析-贪心法

贪心法的思想在求解一些最优化问题的时候,一般会分成多个步骤,每一步都有一个选择。贪心算法的思想在于,先不从整体考虑,每次都只做当前看来最优的思想,即局部最优解,期望通过一步步的局部最优解,最后构造出全局最优解。贪心算法是很多问题的最优解,当然也有很多问题只是局部最优,或者近似最优解,在构造贪心算法的...
  • zhangxb35
  • zhangxb35
  • 2016-12-31 12:45
  • 423

从零开始学贪心算法

本文在写作过程中参考了大量资料,不能一一列举,还请见谅。 贪心算法的定义: 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即...
  • qq_32400847
  • qq_32400847
  • 2016-05-08 00:00
  • 65695

贪心算法详解

有人说贪心算法是最简单的算法,原因很简单:你我其实都很贪,根本不用学就知道怎么贪。有人说贪心算法是最复杂的算法,原因也很简单:这世上会贪的人太多了,那轮到你我的份?             &#...
  • effective_coder
  • effective_coder
  • 2013-03-31 02:03
  • 81733

贪婪算法

贪婪算法 0/1背包
  • changyuanchn
  • changyuanchn
  • 2016-05-15 16:53
  • 2958

贪心算法经典例子

一、定义 什么是贪心算法呢?所谓贪心算法是指,在对问题求解时,总是做出在当前看来最好的选择。也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题都能产生整体最优解或整体最优解的近似解。 贪心算法的基本...
  • wang704987562
  • wang704987562
  • 2017-04-29 23:42
  • 4235

贪心算法及几个经典例子

贪心算法 一、基本概念:        所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。     ...
  • a925907195
  • a925907195
  • 2014-11-20 15:50
  • 39171
    个人资料
    • 访问:267601次
    • 积分:2722
    • 等级:
    • 排名:第15694名
    • 原创:68篇
    • 转载:7篇
    • 译文:0篇
    • 评论:52条
    文章分类
    最新评论