5.3 算法设计-贪婪算法
贪婪算法思想及其应用[5篇模版]
贪婪算法思想及其应用[5篇模版]第一篇:贪婪算法思想及其应用贪婪算法思想及其应用摘要:贪婪算法也称作贪心算法,它没有固定的算法框架,算法设计的关键是贪婪策略的选择,并且所选的贪婪策略要具有无后向性。
关键词:贪婪策略,无后向性,最优正文:一.贪婪算法的定义:贪婪算法又叫登山法,它的根本思想是逐步到达山顶,即逐步获得最优解,是解决最优化问题时的一种简单但适用范围有限的策略。
二.贪婪算法思想:贪婪算法采用逐步构造最优解的方法,即在每个阶段,都选择一个看上去最优的策略(在一定的标准下)。
策略一旦选择就不可再更改,贪婪决策的依据称为贪婪准则,也就是从问题的某一个初始解出发并逐步逼近给定的目标,以尽可能快的要求得到更好的解。
而且它在设计时没有固定的框架,关键在于贪婪策略的选择。
但要注意的是选择的贪婪策略要具有无后向性,即某阶段状态一旦确定下来后,不受这个状态以后的决策的影响,也就是说某状态以后的过程不会影响以前的状态,只与当前状态有关。
三.贪婪算法的优缺点:贪婪算法的优点在于在求解问题的每一步它都是选择最优解,这样算法就容易实现也易于理解,同时也提高了效率并节省了时间。
然而贪婪算法的缺点也是不容忽视的,由于它采取逐步获得最优解的方法而不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。
因此贪婪算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题它都能得出整体最优解或者是整体最优解的近似解。
四.实例参考:下面就列举用贪婪算法成功得出问题最优解的例子:例:一个小孩拿着一美元去商店买糖果,花了33美分,售货员需要找回67美分给小孩,而美分的面值有25,10,5,1这几种。
问题是售货员找个小孩的钱币的个数应是最少的,但同时要满足67美分这个条件。
分析:选择硬币时所采用的贪婪准则如下:每一次都选择面值最大的货币来凑足要找的零钱总数,但前提是不能超出要找的67美分。
解:我们用贪婪算法来处理这个问题,首先我们肯定会选择面值为25的货币,这样的货币我们需要两枚,然后我们依据贪婪准则选择面值为10的货币,这样的货币我们需要一枚,接着继续选择面值为5的货币一枚和面值为1的货币两枚。
贪婪算法公式
贪婪算法公式
贪婪算法是一种基于“贪心”的策略,在每一步选择中都采取在
当前状态下最优的选择,以求达到全局最优解的目标。
它的公式可以
表示为:
贪婪算法=递归思想+贪心选择性质+最优子结构性质
其中,递归思想是贪婪算法的基础思想,它通过将原问题分解成
子问题来求解;贪心选择性质指的是,在选择当前最优解的基础上,
依据贪心算法的策略可以得到全局最优解;最优子结构性质是指在将
原问题分解为若干子问题后,各个子问题相互独立且具有最优子结构,即一个问题的最优解可以通过其子问题的最优解进行组合得到。
通过使用贪婪算法公式,我们可以更好地理解贪婪算法的思想和
特点,更好地应用贪婪算法来解决实际问题。
c语言算法--贪婪算法---01背包问题
c语言算法--贪婪算法---0/1背包问题在0 / 1背包问题中,需对容量为c 的背包进行装载。
从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。
对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高,即n ?i=1pi xi 取得最大值。
约束条件为n ?i =1wi xi≤c 和xi?[ 0 , 1 ] ( 1≤i≤n)。
在这个表达式中,需求出xt 的值。
xi = 1表示物品i 装入背包中,xi =0 表示物品i 不装入背包。
0 / 1背包问题是一个一般化的货箱装载问题,即每个货箱所获得的价值不同。
货箱装载问题转化为背包问题的形式为:船作为背包,货箱作为可装入背包的物品。
例1-8 在杂货店比赛中你获得了第一名,奖品是一车免费杂货。
店中有n 种不同的货物。
规则规定从每种货物中最多只能拿一件,车子的容量为c,物品i 需占用wi 的空间,价值为pi 。
你的目标是使车中装载的物品价值最大。
当然,所装货物不能超过车的容量,且同一种物品不得拿走多件。
这个问题可仿照0 / 1背包问题进行建模,其中车对应于背包,货物对应于物品。
0 / 1背包问题有好几种贪婪策略,每个贪婪策略都采用多步过程来完成背包的装入。
在每一步过程中利用贪婪准则选择一个物品装入背包。
一种贪婪准则为:从剩余的物品中,选出可以装入背包的价值最大的物品,利用这种规则,价值最大的物品首先被装入(假设有足够容量),然后是下一个价值最大的物品,如此继续下去。
这种策略不能保证得到最优解。
例如,考虑n=2, w=[100,10,10], p =[20,15,15], c = 1 0 5。
当利用价值贪婪准则时,获得的解为x= [ 1 , 0 , 0 ],这种方案的总价值为2 0。
而最优解为[ 0 , 1 , 1 ],其总价值为3 0。
另一种方案是重量贪婪准则是:从剩下的物品中选择可装入背包的重量最小的物品。
贪心算法模板
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。
贪心算法并不总是得到问题的最优解,但对许多问题它能产生整体最优解或整体最优解的近似解。
下面是一个简单的贪心算法模板,用于解决一些优化问题:pythondef greedy_algorithm(input_data):# 初始化结果变量result = []# 根据输入数据的特性进行排序或预处理sorted_data = sort_or_preprocess(input_data)# 遍历排序后的数据for item in sorted_data:# 检查是否满足某个条件,例如是否可以选择该元素if can_choose(item, result):# 如果满足条件,则选择该元素并更新结果result.append(item)# 可能还需要执行一些额外的操作,例如更新状态或计数器update_state(result, item)return result# 根据具体问题的需要,实现排序或预处理函数def sort_or_preprocess(input_data):# 对输入数据进行排序或预处理pass# 根据具体问题的需要,实现选择条件函数def can_choose(item, result):# 检查是否可以选择该元素pass# 根据具体问题的需要,实现状态更新函数def update_state(result, item):# 更新状态或计数器pass请注意,这只是一个通用的贪心算法模板,具体实现会根据问题的不同而有所变化。
在实际应用中,你需要根据问题的特点来设计合适的排序、选择和状态更新策略。
同时,也需要验证贪心策略是否能够得到全局最优解,或者是否能够得到满意的近似解。
1。
贪心法
贪心法贪心法(Greedy Approach)又称贪婪法, 在对问题求解时,总是做出在当前看来是最好的选择,或者说是:总是作出在当前看来最好的选择。
也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
当然,希望贪心算法得到的最终结果也是整体最优的。
虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。
如单源最短路经问题,最小生成树问题等。
在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。
贪心法的设计思想当一个问题具有以下的性质时可以用贪心算法求解:每一步的局部最优解,同事也说整个问题的最优解。
如果一个问题可以用贪心算法解决,那么贪心通常是解决这个问题的最好的方法。
贪婪算法一般比其他方法例如动态规划更有效。
但是贪婪算法不能总是被应用。
例如,部分背包问题可以使用贪心解决,但是不能解决0-1背包问题。
贪婪算法有时也用用来得到一个近似优化问题。
例如,旅行商问题是一个NP难问题。
贪婪选择这个问题是选择最近的并且从当前城市每一步。
这个解决方案并不总是产生最好的最优解,但可以用来得到一个近似最优解。
让我们考虑一下任务选择的贪婪算法的问题, 作为我们的第一个例子。
问题:给出n个任务和每个任务的开始和结束时间。
找出可以完成的任务的最大数量,在同一时刻只能做一个任务。
例子:下面的6个任务:start[] = {1, 3, 0, 5, 8, 5};finish[] = {2, 4, 6, 7, 9, 9};最多可完成的任务是:{0, 1, 3, 4}贪婪的选择是总是选择下一个任务的完成时间至少在剩下的任务和开始时间大于或等于以前选择任务的完成时间。
我们可以根据他们的任务完成时间,以便我们总是认为下一个任务是最小完成时间的任务。
1)按照完成时间对任务排序2)选择第一个任务排序数组元素和打印。
3) 继续以下剩余的任务排序数组。
……a)如果这一任务的开始时间大于先前选择任务的完成时间然后选择这个任务和打印。
算法设计与分析第04章 贪心算法PPT课件
4.1 活动安排问题
若被检查的活动i的开始时间Si小于最近选择的活动j 的结束时间fi,则不选择活动i,否则选择活动i加入集 合A中。
贪心算法并不总能求得问题的整体最优解。但对 于活动安排问题,贪心算法greedySelector却总能求 得的整体最优解,即它最终所确定的相容活动集合A的 规模最大。这个结论可以用数学归纳法证明。
•}
6
4.1 活动安排问题
由于输入的活动以其完成时间的非减序排列,所 以算法greedySelector每次总是选择具有最早完成 时间的相容活动加入集合A中。直观上,按这种方法 选择相容活动为未安排活动留下尽可能多的时间。也 就是说,该算法的贪心选择的意义是使剩余的可安排 时间段极大化,以便安排尽可能多的相容活动。
算法greedySelector的效率极高。当输入的活 动已按结束时间的非减序排列,算法只需O(n)的时间 安排n个活动,使最多的活动能相容地使用公共资源。 如果所给出的活动未按非减序排列,可以用O(nlogn) 的时间重排。
7
4.1 活动安排问题
例:设待安排的11个活动的开始时间和结束时间按结 束时间的非减序排列如下:
13
4.2 贪心算法的基本要素
3.贪心算法与动态规划算法的差异
贪心算法和动态规划算法都要求问题具有最优子结构 性质,这是2类算法的一个共同点。但是,对于具有最 优子结构的问题应该选用贪心算法还是动态规划算法 求解?是否能用动态规划算法求解的问题也能用贪心算 法求解?下面研究2个经典的组合优化问题,并以此说 明贪心算法与动态规划算法的主要差别。
11
4.2 贪心算法的基本要素
1.贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以通 过一系列局部最优的选择,即贪心选择来达到。这是 贪心算法可行的第一个基本要素,也是贪心算法与动 态规划算法的主要区别。
贪 心 算 法
贪心算法及几个常用的例题贪心算法:一、基本概念:所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。
也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。
必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。
所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。
二、贪心算法的基本思路:1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。
三、贪心算法适用的问题贪心策略适用的前提是:局部最优策略能导致产生全局最优解。
实际上,贪心算法适用的情况很少。
一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。
四、贪心算法的实现框架从问题的某一初始解出发;while (能朝给定总目标前进一步)利用可行的决策,求出可行解的一个解元素;由所有解元素组合成问题的一个可行解;五、贪心策略的选择因为用贪心算法只能通过解局部最优解的策略来达到全局最优解,因此,一定要注意判断问题是否适合采用贪心算法策略,找到的解是否一定是问题的最优解。
几个经典的例子:一、定义什么是贪心算法呢?所谓贪心算法是指,在对问题求解时,总是做出在当前看来最好的选择。
也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题都能产生整体最优解或整体最优解的近似解。
贪心算法的基本思路如下:1. .建立数学模型来描述问题。
2. 把求解的问题分成若干个子问题。
3. 对每个子问题求解,得到每个子问题的局部最优解。
4. 把每个子问题的局部最优解合成为原来问题的一个解。
贪婪算法(例题及相关解答)
第 1 章贪婪算法虽然设计一个好的求解算法更像是一门艺术,而不像是技术,但仍然存在一些行之有效的能够用于解决许多问题的算法设计方法,你可以使用这些方法来设计算法,并观察这些算法是如何工作的。
一般情况下,为了获得较好的性能,必须对算法进行细致的调整。
但是在某些情况下,算法经过调整之后性能仍无法达到要求,这时就必须寻求另外的方法来求解该问题。
本章首先引入最优化的概念,然后介绍一种直观的问题求解方法:贪婪算法。
最后,应用该算法给出货箱装船问题、背包问题、拓扑排序问题、二分覆盖问题、最短路径问题、最小代价生成树等问题的求解方案。
1.1 最优化问题本章及后续章节中的许多例子都是最优化问题( optimization problem),每个最优化问题都包含一组限制条件( c o n s t r a i n t)和一个优化函数( optimization function),符合限制条件的问题求解方案称为可行解(feasible solution),使优化函数取得最佳值的可行解称为最优解(optimal solution)。
例1-1 [ 渴婴问题] 有一个非常渴的、聪明的小婴儿,她可能得到的东西包括一杯水、一桶牛奶、多罐不同种类的果汁、许多不同的装在瓶子或罐子中的苏打水,即婴儿可得到n 种不同的饮料。
根据以前关于这n 种饮料的不同体验,此婴儿知道这其中某些饮料更合自己的胃口,因此,婴儿采取如下方法为每一种饮料赋予一个满意度值:饮用1盎司第i 种饮料,对它作出相对评价,将一个数值s i 作为满意度赋予第i 种饮料。
通常,这个婴儿都会尽量饮用具有最大满意度值的饮料来最大限度地满足她解渴的需要,但是不幸的是:具有最大满意度值的饮料有时并没有足够的量来满足此婴儿解渴的需要。
设a i是第i 种饮料的总量(以盎司为单位),而此婴儿需要t 盎司的饮料来解渴,那么,需要饮用n种不同的饮料各多少量才能满足婴儿解渴的需求呢?设各种饮料的满意度已知。
贪心算法----删数问题
贪⼼算法----删数问题
⼀、问题描述
给定n位整数a,去掉其中任意k<=n个数字后,剩下的数字按原次序排列组成⼀个新的正整数。
如输⼊⼀个正整数:178543;
删除其中4个数
得到:13
⼆、解决思路--贪婪算法
这⾥先介绍之前错误的思路:
找出数字中n-k个最⼩的数,组成新的正整数;
但是很快就有问题出现,虽然每次都找的是整数各个位置中最⼩的数,但是忽略掉了位置的相对关系,如以下的例⼦:
输⼊的⼀个整数:178906; 6位数的整数
删除其中4个数;
按照这个思路,即要选择6-4=2个最⼩的数,即0 和1,按照数中原有的次序,得到的是10;
但是事实上,应该是06,即6
所以换个思路,叫“最近下降点”优先。
利⽤“最陡下降点”优先,即每次找到第⼀个元素,使其满⾜⼤于下⼀个元素。
正如上述的那个例⼦,第⼀个删除的是9,因为9>0;
得到的整数是17806;第⼆个删除的是8,因为8>0,得到的整数是1706,第三个删除的是7,因为7>0,得到的整数是106;
第四个删除的是1,因为1>0,得到的是06,为正确的答案。
三、程序设计
(1)同样,给出错误的设计思路的程序:
(2)正确的设计思路的程序:。
算法设计中的贪心思想
算法设计中的贪心思想贪心思想是一种常见的算法设计思想,它通常用于优化问题。
贪心思想的核心思想是在每个子问题中选择最优解,从而得到全局最优解。
在本文中,将讨论贪心思想在算法设计中的应用及优缺点。
一、贪心思想的基本原理贪心算法在解决问题时,会在每个子问题中选择当前的最优解,而不会考虑将来会产生的影响。
这种局部最优解的选择,最终会得到整体最优解。
简单的说,贪心算法就是以当前状态为最优状态。
二、贪心算法的应用1.活动选择问题活动选择问题是在一定时间内选择活动的过程,活动有开始和结束的时间,需要选择不冲突的最多的活动。
贪心算法在此问题中的应用就是优先选择结束时间最早的活动,这样才能腾出更多的时间去选择其他活动。
2.背包问题背包问题是在一定容量的背包中,选择物品使得背包中物品价值最大。
贪心算法在此问题中的应用就是优先选择单价最高的物品,这样可以最大化背包中物品的价值。
3.霍夫曼编码问题霍夫曼编码是一种将字符串进行无损压缩的方法。
贪心算法在此问题中的应用就是优先选择频率最低的字符进行编码,这样可以最大程度地减小编码的长度。
三、贪心算法的优缺点1.优点贪心算法通常是高效的,因为它只考虑了当前状态的最优解,而不需要考虑所有子问题的最优解。
在某些情况下,贪心算法可以得到最优解,例如活动选择问题、霍夫曼编码问题等。
2.缺点贪心算法的局限性在于,它不能保证在所有情况下都能得到最优解。
因为贪心算法只考虑了当前状态的最优解,而没有考虑将来的影响。
当某个子问题的最优解与整体最优解不一致时,贪心算法可能会失效。
例如背包问题中,如果贪心算法优先选择单价最高的物品,而没有考虑物品的重量,就有可能导致最终选取的物品组合无法放入背包中。
四、结论综上所述,贪心思想是一种常见的算法设计思想,它在优化问题中的应用非常广泛。
虽然贪心算法不能保证在所有情况下都能得到最优解,但在某些特定问题中,贪心算法仍然是最优解的选择。
因此,在使用贪心算法时,需要深入了解问题本身的性质,权衡利弊,以保证算法的有效性。
贪心算法
6.贪心方法模型
a.工程计划模型 b.部分背包与每步最优 c.构造贪心算法
a.工程计划模型
我们常常碰到这样的问题:完成一个工程需
要若干个步骤,每个步骤都有若干种方法, 图示—— 步骤a 步骤b 步骤c ... 步骤n 方法b1 方法c1 方法a1 方法b2 方法c2 方法n1 方法a2 方法b3 方法c3 方法c4
种树问题:一条街道分为n个区域(按1-n编号), 每个都可种一棵树。有m户居民,每户会要求在区 域i-j区间内种至少一棵树。现求一个能满足所有要 求且种树最少的方案。 算法构造: 1.对于要求,以区间右端(升序)为首要关键字, 左端(升序)为次要关键字排序。 2.按排好的序依次考察这些要求,若未满足,则在 其最右端的区域种树,这时可能会满足多个要求。 证明思路:解法并不唯一,关键是证明没有比该解 法更好的解法。按步骤1排序之后,会发现对于每 个要求,在最右边的区域内种树所得的结果总不会 差于在其他区域种树。至于为什么这样排序,留给 你——读者们思考吧。
每个方法有一个权值(如效率、质量),其大小往 往和其他步骤中选取的方法有关。有些时候权值无 意义,表示方法不可选择。要求给出一个方法组合, 是权值和最大。 在这里,暂且把它称作“工程计划”。很多实际问 题都可以归纳为这个模型。 对于不同形式的工程计划,我们有不同的解法。 若权值与整个过程或前后步骤的方法选择都有关, 我们使用搜索算法——时间复杂度高得吓人。 若每个权值只与上(或下)一步或少数几步的方法 选择都有关,我们使用动态规划——有比较高的效 率,在下一章会讲到。 若每个权值与其他步骤的方法选择都没有关系,我 们使用贪心方法。
算法分析:设a[i]为第I堆纸牌的张数(0<=I<=n), v为均分后每堆纸牌的张数,s为最小移动次数。 我们用贪心算法,按照从左到右的顺序移动纸牌。 如第I堆的纸牌数不等于平均值,则移动一次(即s 加1),分两种情况移动: 1.若a[i]>v,则将a[i]-v张从第I堆移动到第I+1堆; 2.若a[i]<v,则将v-a[i]张从第I+1堆移动到第I堆。 为了设计的方便,我们把这两种情况统一看作是将 a[i]-v从第I堆移动到第I+1堆,移动后有a[i]=v; a[I+1]=a[I+1]+a[i]-v. 在从第I+1堆取出纸牌补充第I堆的过程中可能回出 现第I+1堆的纸牌小于零的情况。
贪婪法
贪婪法的设计思想
例:用贪婪法求解付款问题。 假设有面值为5元、2元、1元、5角、2角、1角的货币,需 要找给顾客4元6角现金,为使付出的货币的数量最少,首 先选出1张面值不超过4元6角的最大面值的货币,即2元, 再选出1张面值不超过2元6角的最大面值的货币,即2元, 再选出1张面值不超过6角的最大面值的货币,即5角,再选 出1张面值不超过1角的最大面值的货币,即1角,总共付出 4张货币。
可变长度编码
• 根据可变长度码原则,编码方式改为: a(100): 0000 b(80) : 0011 c(50) : 01010 d(40) : 01111 e(30) : 100100 • 那么现在需要 d i f i =100+80+100+80+90=450 (bits)来储存,其中di为编码长度,fi为出现次数,减少 了450(bits)的储存空间.
Prim算法
v1 3 V3 2 1 3 4 5 v2 3 v4 v3 2 v1 1 3 4 5 v2 6 v4 3 v3 2 v1 1 3 4 5 v2
ห้องสมุดไป่ตู้
v4
v5 1 3 4
v5
v5
v1 3 v3 2
v2 6 v4 5
v1 3 v3 2
1 3 4 5
v2 6 v4 3
v1
1 3 4 2 5
v2 6 v4
6
The Greedy Method
• E.g. Find a shortest path from v0 to v3.
贪婪法
2
1 贪婪算法的思想
贪婪算法(贪心算法 的根本思想 贪婪算法 贪心算法)的根本思想: 贪心算法 的根本思想: 求方法使生产某产品所花费的时间最少; 例:求方法使生产某产品所花费的时间最少; 最直接的方法:枚举; 最直接的方法:枚举; 高效一点的方法: 高效一点的方法:在生产该产品的每一道工序上都选择 最省时的方法; 最省时的方法; 以逐步的局部最优,达到最终的全局最优。 以逐步的局部最优,达到最终的全局最优。 贪婪算法通过一系列的局部选择来得到一个问题的解。所 贪婪算法通过一系列的局部选择来得到一个问题的解。 作的每一个选择都是当前状态下“最优”的选择。 作的每一个选择都是当前状态下“最优”的选择。 如何判断“当前最优” 如何判断“当前最优”? 要依照某种策略。策略“只顾眼前,不管将来”,称之 要依照某种策略。策略“只顾眼前,不管将来” 贪婪策略” 为“贪婪策略”。 贪婪算法没有固定的算法框架,算法设计的关键是贪婪策 贪婪算法没有固定的算法框架, 略的选择。 略的选择。 贪婪算法能否得到最优解? 贪婪算法能否得到最优解?
6
问题的形式描述
目标函数: 目标函数:
1≤ i ≤ n
∑px
i
i
约束条件: 约束条件:
1≤i ≤ n
∑w xBiblioteka i i≤M0 ≤ xi ≤ 1, pi > 0, wi > 0,1 ≤ i ≤ n
满足上述约束条件的任一集合 任一集合(x 可 行 解:满足上述约束条件的任一集合 1,x2,…,xn) 都是问题 的一个可行解——可行解可能为多个。 可行解可能为多个。 的一个可行解 可行解可能为多个 称为问题的一个解向量 (x1,x2,…,xn)称为问题的一个解向量 称为问题的一个 最 优 解:能够使目标函数取最大值的可行解是问题的 能够使目标函数取最大值的可行解是问题的 最大值 最优解——最优解也可能为多个。 最优解也可能为多个。 最优解 最优解也可能为多个
算法设计与分析论文(贪心算法)
贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪 心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划 算法的主要区别。
贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择 就将所求问题简化为一个规模更小的子问题。对于一个具体问题,要确定它是否 具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终能得到问题的最 优解。通常可以首先证明问题的一个整体最优解,是从贪心选择开始的,而且作 了贪心选择后,原问题简化为一个规模更小的类似子问题。然后,用数学归纳法 证明,通过每一步贪心选择,最终可得到问题的一个整体最优解。
物品超出背包容量为止。伪代码如下:
public static void DepWePr(double[][] a, double c, int[] ans) { // depend on
// the // weight // and price double[] w = new double[a[0].length]; // the weight of goods System.arraycopy(a[0], 0, w, 0, w.length); // copy the array
贪心算法
——不在贪心中爆发,就在贪心中灭亡 徐晓龙 武汉理工大学计算机科学与技术学院软件 ZY1101 班
摘要
本文介绍贪心算法的基本意义以及算法的使用范围,并通过具体的案例来分 析贪心算法的具体应用,从而指出其特点和存在问题。 关键字:贪心算法,贪心策略,TSP、0/1 背包
引言
我们用了 13 周的时间学完了《算法设计与分析》这本书。这本书中涵盖了 大量的常见算法,包括蛮力法、分治法、动态规划法、贪心算法等等。我最有印 象的就是贪心算法。贪心算法是一种有合理的数据组织和清晰高效的算法,它简 单有效。下面我们来详细解读一下这个算法。
贪心算法
max vi xi
i 1
n
于是,背包问题归结为寻找一个满足约束条 件式,并使目标函数式达到最大的解向量X=(x1, x2, …, xn)。
至少有三种看似合理的贪心策略: (1)选择价值最大的物品,因为这可以尽可能快 地增加背包的总价值。但是,虽然每一步选择获得 了背包价值的极大增长,但背包容量却可能消耗得 太快,使得装入背包的物品个数减少,从而不能保 证目标函数达到最大。 (2)选择重量最轻的物品,因为这可以装入尽可 能多的物品,从而增加背包的总价值。但是,虽然 每一步选择使背包的容量消耗得慢了,但背包的价 值却没能保证迅速增长,从而不能保证目标函数达 到最大。 (3)选择单位重量价值最大的物品,在背包价值 增长和背包容量消耗两者之间寻找平衡。
算法
main( ) { int i,j,n,GZ,A; int B[8]={0,100,50,20,10,5,2,1},S[8]; input(n); for(i=1;i<=n;i++) { input(GZ); for(j=1,j<=7;j++) { A=GZ/B[j]; S[j]=S[j]+A; GZ=GZ-A*B[j];} } for(i=1;i<=7;i++) print(B[i], “----”, S[i]); }
∞ b 4 0 a 8 h ∞ 4 b 4 0 a 8 h 8 11 7 11 7
8 ∞ i 6 1 2
∞ c
7
∞ d 14 9 e ∞ 10
4 g ∞
2
f ∞
(a)
8 ∞ i 6 1 g ∞ 2 4 f ∞ ∞ c 7 ∞ d 14 9 e ∞ 10 2
贪心法求解活动安排问题的关键是如何选择贪心策略,使 得按照一定的顺序选择相容活动,并能安排尽量多的活动。至 少有两种看似合理的贪心策略: (1)最早开始时间:这样可以增大资源的利用率。 (2)最早结束时间:这样可以使下一个活动尽早开始。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2014-5-19
算法设计与分析演示稿 纪玉波制 作(C)
3
例1.选取砝码 设天平有一些25克的砝码,一些10克的砝 码,一些5克的砝码和一些1克的砝码。现要称 63克的物体,问至少需要用几个砝码。 用贪婪算法,为了砝码数最少,在不超过 63克的前提 下,每次都尽量选择大的砝码,即 头两次选25克的,然后选一个10克的,最后选 三个1克的。总共用六个砝码,事实说明这是 最好的结果。
2014-5-19
算法设计与分析演示稿 纪玉波制 作(C)
9
例3.巡回推销员问题 设有5座城市,城市间的距离矩阵为:
前面用分枝限界方法讨论此问题,现以此为 例来说明贪婪算法的应用。
2014-5-19 算法设计与分析演示稿 纪玉波制 作(C) 10
将城市间的距离从小到大排列有:
d24(1),d13(2),d15(2),d25(3),d45(6),d35(9),d34(9),
2014-5-19
算法设计与分析演示稿 纪玉波制 作(C)
4
如果问题改成:砝码的种类分别为11克、5 克和1克,待称的物体是15克。用贪婪算法应先 选一个11克的,然后选四个1克的,共用五个砝 码。这不是最优结果,只要用三个5克的砝码就 够了。 贪婪算法虽不能保证得到最优结果,但对 于一些除了“穷举”方法外没有有效算法的问 题,用贪婪算法往往能很快地得出较好的结果, 如果此较好结果与最优结果相差不是很多的话, 此方法还是很实用的。
2014-5-19
算法设计与分析演示稿 纪玉波制 作(C)
13
6座城市间的距离矩阵为:
2014-5-19
算法设计与分析演示稿 纪玉波制 作(C)
14
用贪婪算法,先将任两城市间的连线距离按从小到 大的次序排列,然后从中逐个选择。但有两种情况的 连线应舍弃:
(1)使任一城市的度数(连线数)超过2的连线必须 舍弃; (2) 在得到经过所有点的回路前就形成小回路的连 线必须舍弃。 距离按从小到大的次序排列: Dde(3), Dab(5), Dbc(5), Def(5), Dae(7.07), Ddf(7.62), Dbe(11.01), Dbd(11.7), Ded(14), Dbf(14.32), Dce(14.32), Dae(15.52), Dad(16.55), Daf(18.38), Def(18.38)
2014-5-19
算法设计与分析演示稿 纪玉波制 作(C)
22
例如,对于下图中的带权图
各边按权值排序为: d13=1 d34=5 d46=2 d23=5 d25=3 d12=6 d36c4 d35=6 d14 = 5 d56=6
2014-5-19
算法设计与分析演示稿 纪玉波制 作(C)
2014-5-19
算法设计与分析演示稿 纪玉波制 作(C)
18
例5: 多机调度问题
设有n个独立的作业{1,2,…,n},由m台相同的机器进 行加工处理。作业i所需的处理时间为ti。现约定,任何 作业可以在任何一台机器上加工处理,但未完工前不允 许中断处理。任何作业不能拆分成更小的子作业。 多机调度问题要求给出一种作业调度方案,使所给的 n个作业在尽可能短的时间内由m台机器加工处理完成。 这个问题是一个NP完全问题,到目前为止还没有一个 有效的解法。对于这一类问题,用贪婪选择策略有时可 以设计出较好的近似算法。采用最长处理时间作业优先 的贪婪选择策略可以设计出解多机调度问题的较好的近 似算法。按此策略,当n≤m时,我们只要将机器 i 的 [0,ti]时间区间分配给作业i即可。 当n>m时,我们首先将 n个作业依其所需的处理时间 从大到小排序。然后依此顺序将作业分配给空闲的处理 机。
d12(14),d14(16),d23(25)。
由于是5个城市,环绕一圈为5条边,贪 婪方法求解此问题的过程是从最小边开始, 依此从小到大取边加入到回路边集中,但在 将1条边加入时不能使1顶点的度数超过3, 也不能形成小回路。 此问题解的过程如下:
2014-5-19
算法设计与分析演示稿 纪玉波制 作(C)
2014-5-19
算法设计与分析演示稿 纪玉波制 作(C)
2
顾名思义,贪婪算法总是作出在当前看来是最 好的选择。也就是说贪婪算法并不从整体最优上加 以考虑,它所作出的选择只是在某种意义上的局部 最优选择。当然,我们希望贪婪算法得到的最终结 果也是整体最优的。上面所说的找硬币算法得到的 结果就是一个整体最优解。虽然贪婪算法不是对所 有问题都能得到整体最优解,但对范围相当广的许 多问题它能产生整体最优解。如图的单源最短路径 问题,最小生成树问题等。在一些情况下,即使贪 婪算法不能得到整体最优解,但其最终结果却是最 优解的很好的近似解。
当 n>m 时,因此算法所需的计算时间复杂度为 O(nlogn) 。
2014-5-19 算法设计与分析演示稿 纪玉波制 作(C) 20
例6: 最小生成树
一般情况下,用贪婪算法得到的是近优解,而不能 保证得到最优解。但用贪婪方法计算最小生成树,却可 以设计出保证得到最优解的算法。 设 G=(V,B) 是一个无向连通带权图,即一个网络。 E 中每条边(v,w)的权为c[v][w]。如果G的一个子图G’是一 棵包含G的所有顶点的树,则称G’为G的生成树。生成树 上各边权的总和称为该生成树的费用。在G的所有生成树 中,费用最小的生成树称为G的最小生成树。 网络的最小生成树在实际中有广泛应用。例如,在设 计通信网络时,用图的顶点表示城市,用边 (v,w) 的权 c[v][w]表示建立城市v和城市w之间的通信线路所需的费 用,则最小生成树就给出了建立通信网络的最经济的方 案。
2014-5-19 算法设计与分析演示稿 纪玉波制 作(C) 21
Kruskal最小生成树算法 Kruskal 在1956年提出了1个最小生成树算法, 它的思路很容易理解。设G=(V,E)是一个连通带权 图,V={1,2,…,n}。将图中的边按其权值由小到大 排序,然后作如下的贪婪选择,由小到大顺序选取 各条边,若选某边后不形成回路,则将其保留作为 树的一条边;若选某边后形成回路,则将其舍弃, 以后也不再考虑。如此依次进行,到选够(n-1) 条边即得到最小生成树。
2014-5-19 算法设计与分析演示稿 纪玉波制 作(C) 19
例如,设 7 个独立作业 {1,2,3,4,5,6,7} 由 3 台机器 M1,M2,和M3来加工处理。各作业所需的处理时间分别为 {2,14,4,16,6,5,3}。按贪婪算法产生的作业调度如图 4-13 所示,所需的加工时间为17。
得到一条回路:
v1→v3→v4→v2→v5→v1
同由分枝限解方法得到的路径相同,因此是最佳 的回路。
2014-5-19 算法设计与分析演示稿 纪玉波制 作(C) 12
例4 设有六个城市,其坐标分别为a(0,0), b:(4,3), c:(1,7), d:(15,7), e(15,4), f:(18,0)。如下图所示:
2014-5-19 算法设计与分析演示稿 纪玉波制 作(C) 15
按贪婪算法原则,其选择过程如下: Dde; Dde+Dab; Dde+Dab+Dbc; Dde+Dab+Dbc+Def; Dde+Dab+Dbc+Def+[Dae];(形成小回路,舍弃) Dde+Dab+Dbc+Def+[Ddf];(形成小回路,舍弃) Dde+Dab+Dbc+Def+[Dbe];(b顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+[Dbd];(b顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd; Dde+Dab+Dbc+Def+Dcd+[Dbf];(b顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dce];(c、e顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dae];(e顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dae];(e顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dad];(d顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+Daf;得到1条回路
11
d24(1); d24(1)+d13(2); d24(1)+d13(2)+d15(2); d24(1)+d13(2)+d15(2)+d25(3); d24(1)+d13(2)+d15(2)+d25(3)+[d45(6)]; (下标中5出现了3次,顶点5有三条边相连,d45(6)放弃) d24(1)+d13(2)+d15(2)+d25(3)+[d35(9)]; (下标中5出现了3次,顶点5有三条边相连,d34(6)放弃) d24(1)+d13(2)+d15(2)+d25(3)+d34(9)。
2014-5-19 算法设计与分析演示稿 纪玉波制 作(C) 6
如果对上述算法作一些改进,可得到更好的结 果。先从n个物体中试着取j个总体积不超过C的 装入背包,剩下的(n-j)个物体则利用贪婪算法 尽量往里装。此j值从零开始逐渐增加,反复进 行试探,直至j达到某预先给定的常数k(0<k<n), 最后从这些结果中取其最好的一个。如果在试 探中能得到一个完全装满的方案,则此过程就 可提前结束。因为从n个物体中取出j个共有 种方案,此值随着j的增加而增加较快,但可以 j C k+1 n 证明此改进算法的复杂性为O(kn ),因k是常 数,故仍为多项式界的算法。