- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
贪心算法——不在贪心中爆发,就在贪心中灭亡武汉理工大学计算机科学与技术学院班摘要本文介绍贪心算法的基本意义以及算法的使用范围,并通过具体的案例来分析贪心算法的具体应用,从而指出其特点和存在问题。关键字:贪心算法,贪心策略,TSP、0/1背包引言我们用了13周的时间学完了《算法设计与分析》这本书。这本书中涵盖了大量的常见算法,包括蛮力法、分治法、动态规划法、贪心算法等等。我最有印象的就是贪心算法。贪心算法是一种有合理的数据组织和清晰高效的算法,它简单有效。下面我们来详细解读一下这个算法。贪心算法的含义贪心算法可以简单描述为:对一组数据进行排序,找出最小值,进行处理,再找出最小值,再处理。也就是说贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望得到结果是最好或最优的算法。贪心算法的基本思想贪心算法,法如其名,每次都贪心的选取当前最优解,一旦确定了当前解,不管将来有什么结果,之后都不会再修正,这一点与动态规划法比起来稍有逊色。如果一个问题的最优解只能用蛮力法穷举得到,则贪心法不失为寻找问题近似最优解的一个较好办法。贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止。贪心算法的基本要素贪心选择贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终能得到问题的最优解。通常可以首先证明问题的一个整体最优解,是从贪心选择开始的,而且作了贪心选择后,原问题简化为一个规模更小的类似子问题。然后,用数学归纳法证明,通过每一步贪心选择,最终可得到问题的一个整体最优解。最优子结构当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。运用贪心策略在每一次转化时都取得了最优解。问题的最优子结构性质是该问题可用贪心算法或动态规划算法求解的关键特征。贪心算法的每一次操作都对结果产生直接影响,而动态规划则不是。贪心算法对每个子问题的解决方案都做出选择,不能回退;动态规划则会根据以前的选择结果对当前进行选择,有回退功能。动态规划主要运用于二维或三维问题,而贪心一般是一维问题。贪心算法的核心贪心算法的核心问题是选择能产生问题最优解的最优度量标准,即具体的贪心策略。贪心策略决定着贪心算法是爆发或者是灭亡。所以,选择一个合理、正确的贪心策略是至关重要的。下面用例子说明:第一个例子我们选用大家熟知的0/1背包问题。给定种物品和一个背包。物品的重量是,其价值为,背包的容量为。在选择物品装入背包时,不可以选择物品的一部分,一定要全部装入背包,。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?设表示物品装入背包的情况,根据问题的要求,有如下约束条件和目标函数:于是,背包问题归结为寻找一个满足约束条件式,并使目标函数式达到最大的解向量。现在有一个容量为50的背包,共有三个物品,重量为别为20、30、10,价值分别为60、120、50。现使用贪心算法来放置物品,贪心策略也对应有三种,分别是根据重量、价格、重量与价格比。根据重量的贪心策略,即优先放置重量小的物品,以此来达到放置更多个物品的目的。首先需要将物品按照重量从小到大重新排序,然后从小到大的放置物品,直至下个物品无法放进背包为止。伪代码如下:publicclass worseGreedy {publicstaticvoid DepWeight(double[][] a, double c, int[] ans) // depend// on// the// weight to select// goods{double[] w = newdouble[a[0].length];System.arraycopy(a[0], 0, w, 0, w.length);EnumerationSearch sea = new EnumerationSearch();Quick.Sort(w);for (int i = 0; w[i] = c i w.length; i++) {c = c - w[i];int j = sea.search(a[0], w[i]);ans[j] = 1;}}程序的运行结果见附录。根据价格的贪心策略,即优先放置价格比较高的物品,以此来达到背
文档评论(0)