贪心策略
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
贪心法设计举例
例5.2 用贪心法求解货币兑付问题。设支付现金
A=25.9元,支付集合P= {10、5、1、 0.5,0.2、0.1元各10张} 解: 最少货币张数 — 贪心选择货币面值大者。
s s s s = = = = ф {10} {10,10} {10,10,5,0.5,0.2,0.2}
15.9 5.9 0
贪心算法的设计要素
可以用贪心算法求解的问题一般具
有2个重要的性质:
– –
最优子结构性质。 贪心选择性质
贪心算法的设计要素
最优子结构性质
当一个问题的最优解包含其子问题的最优解时 ,称此问题具有最优子结构性质。问题的最优 子结构性质是该问题可用动态规划算法或贪心 算法求解的关键特征。
贪心算法的设计要素
贪心算法的基本思路
基本思路
1.建立数学模型来描述问题。 2.把求解的问题分成若干个子问题。 3.对每一子问题求解,得到子问题的局部最优解。 4.把子问题的解局部最优解合成原来解问题的一个解 。 从问题的某一初始解出发; while 能朝给定总目标前进一步 do 求出可行解的一个解元素; 由所有解元素组合成问题的一个可行解;
活动安排问题的正确性证明 贪心算法并不总能求得问题的整体最 优解。但对于活动安排问题,贪心算 法greedySelector却总能求得整体最 优解,即它最终所确定的相容活动集 合A的规模最大。这个结论可以用数学 归纳法证明。
证明:(对算法步数进行归纳) (1)将活动集合按照截止时间递增顺序排列,得到序列 S。
背包问题
2016/6/22 计算机算法设计与分析 29
问题描述
给定n个物品和一个背包。物品i的重量为wi, 价值为vi,背包容量为C。问如何选择装入背包 中的物品,使得装入背包的物品的价值最大? 在装入背包时,每种物品i只有两种选择,装入 或者不装入,既不能装入多次,也不能只装入 一部分。因此,此问题称为0-1背包问题。 如果在装入背包时,物品可以切割,即可以只 装入一部分,这种情况下的问题称为背包问题。
2016/6/22 计算机算法设计与分析 7
贪心算法的特点
贪心算法中,较大子问题的解恰好包含 了较小子问题的解作为子集,这与动态 规划算法设计中的优化原则本质上是一 致的。 贪心算法在某一步决定优化函数的最大 或最小值时,不考虑子问题的计算结果 ,而是根据当时情况采取“只顾眼前” 的贪心策略决定取舍。
应用实例
策略1不正确。 活动安排问题—直觉贪心策略分析 反例:S={1, 2, 3},a1=<0, 20>, a2=<2, 5>, a3=<8, 15>。
策略2不正确。 反例: S={1, 2, 3},a1=<0, 8>, a2=<7, 9>, a3=<8, 15>。
策略3正确?
活动安排问题
贪心选择性质
贪心选择性质是指所求问题的整体最优解可以通过一 系列局部最优的选择,即贪心选择来达到。 贪心选择每次选取当前最优解,因此它依赖以往的选 择,而不依赖于将来的选择。 贪心算法通常以自顶向下的方式进行,以迭代的方式 作出相继的贪心选择,每作一次贪心选择就将所求问 题简化为规模更小的子问题。 对于一个具体问题,要确定它是否具有贪心选择性质 ,必须证明每一步所作的贪心选择最终导致问题的整 体最优解。
2016/6/22 计算机算法设计与分析 8
贪心算法的一般框架
GreedyAlgorithm(parameters){ 初始化; 重复执行以下的操作: 选择当前可以选择的(相容)最优解; 将所选择的当前解加入到问题的解中; 直至满足问题求解的结束条件。 }
2016/6/22
(3)假设算法前k步正确,令i1=1, i2, …, ik是前k步顺序选 择的活动,则原问题最优解可表示为A={i1=1, i2, …, ik}∪B, 令S’是S中剩余的与i1, i2, …, ik相容的活动,即S’={j | sj≥fk, j∈S},则B是S’的一个最优解。
若不然,假设S’有最优解B’,且|B’| > |B|,那么用B’替 换B可以得到的解={i1=1, i2, …, ik} ∪ B’将比A的活动更多, 与A为最优解矛盾。
template<class Type> 各活动起始时间 void GreedySelector(int n, Type s[], 与结束时间分别 Type f[], bool A[]) { 存储于数组s和f A[1] = true; 活动安排问题 —算法设计与分析中,且f中活动 int j= 1; 按结束时间非递 for (int i=2;i<=n;i++) { 减排序,即f1 ≤f2 if (s[i]>=f[j]) { A[i]=true; ≤… ≤fn。 j=i; } else A[i]=false; 时间复杂度O(n) } 预排序O(nlogn) } 该算法的贪心选择的意义是使剩余的可安排时间段极大化,以 便安排尽可能多的相容活动。
由于输入的活动以其完成时间的非减序排
列,所以算法greedySelector每次总是选 择具有最早完成时间的相容活动加入集合A 中。直观上,按这种方法选择相容活动为 未安排活动留下尽可能多的时间。也就是 说,该算法的贪心选择的意义是使剩余的 可安排时间段极大化,以便安排尽可能多 的相容活动。
应用实例
第四章
贪心策略
2016/6/22 计算机算法设计与分析 1
贪心法
在实际问题中,经常会遇到求一个问题的可行 解和最优解的问题,这就是所谓的最优化问题
。
每个最优化问题都包含一组限制条件和一个优 化函数,符合条件的解决方案称为可行解,使 优化函数取得最佳值的可行解称为最优解。
贪心法
贪心法是求解这类问题的一种常用算法,它从问题的 某一个初始解出发,采用逐步构造最优解的方法向给 定的目标前进。(问题:与分治法、递归、动态规划等 的关系、比较?) 在每个局部阶段,都做出一个看上去最优的决策(即某 种意义下的、或某个标准下的局部最优解),并期望通 过每次所做的局部最优选择产生出一个全局最优解。
计算机算法设计与分析
9
其设计方法描述如下:
greedy ( A, n) { solution ; for(i 1; i n; i ) { 选择准则 x select( A); if ( feasible ( solution , x )) solution union ( solution , x ); } return solution ; }
应用实例
活动安排问题—实例计算过程
设待安排的11个活动的开始时间和结束时间按结束时 间的非减序排列如下:
i s[i] 1 1 2 3 3 0 4 5 5 3 6 5 7 6 8 8 9 8 10 2 11 12
f[i]
4
5
6
7
8
9
10
11
12
13
14
首先选定活动1,其结束时间f[1]=4。 然后因s[4] = 5≥4,选定活动4,这时f[4] = 7。 又因s[8] = 8≥7,选定活动8,这时f[8] = 11。 最后因s[11] = 12≥11,选定活动11。
2016/6/22 计算机算法设计与分析 5
再找硬币
若硬币的面值改为一分、五分和一角一分3 种,而要找给顾客的是一角五分钱。
还用贪心算法,将找个顾客1个一角一分的 硬币和4个一分的硬币。
然而,3个五分的硬币显然才是最好的找法。
2016/6/22
计算机算法设计与分析
6
贪心算法的特点
顾名思义,贪心算法总是作出在当前看来最好 的选择。也就是说贪心算法并不从整体最优考 虑,它所作出的选择只是在某种意义上的局部 最优选择。 贪心算法不能对所有问题都得到整体最优解, 但对许多问题它能产生整体最优解。 在许多情况下,应用贪心算法能够得到整体最 优解;在一些情况下,即使贪心算法不能得到 整体最优解,其最终结果却是最优解的很好近 似。
做出贪心决策的依据称为贪心准Fra Baidu bibliotek(策略)
问题:
贪心法的特点/优点是什么?贪心法与穷举法、 回溯法、动态规划等方法的比较?
可以用贪心法解决的问题有什么特点?什么样
的问题适合于用贪心法来解决? 用贪心法解题时,如何判断能否保证得到最优 解?若不能得到最优解,该如何处理?
找硬币
假设有四种硬币,面值分别为
贪心法的正确性问题
针对具体问题不同,贪心策略的选择可能有多种 ,如何选择合适的贪心策略并证明该策略的正确 性是贪心算法设计中的一个关键问题。 一般可以通过对算法步数的归纳或通过对问题规 模的归纳来证明贪心法的正确性。 证明贪心选择将导致整体的最优解: 首先证明存在问题的一个整体最优解必定包含 了第一个贪心选择。 然后证明在做了贪心选择后,原问题简化为规 模较小的类似子问题,即可继续使用贪心选择。 于是用数学归纳法可证明,经过一系列贪心选 择可以得到整体最优解。
实现该算法的过程:
应用实例——活动安排问题
活动安排问题就是要在所给的活动集合中 选出最大的相容活动子集合,是可以用贪 心算法有效求解的很好例子。该问题要求 高效地安排一系列争用某一公共资源的活 动。贪心算法提供了一个简单、漂亮的方 法使得尽可能多的活动能兼容地使用公共 资源。
应用实例——活动安排问题
(2)算法第一步选择S中的活动1,设算法最终得到问题 最优解为A={i1, i2, …, ij},则i1=1;(算法第一步正确) 活动安排问题—贪心策略正确性证明 若i1≠1,用1替换i1,可得到A’=(A-{i1})∪{1},集合A’与A 中活动个数相同,且1比i1结束的更早,因此与i2, i3, …, ij 相容,于是A’也是问题的一个最优解。
活动实例
应用实例
策略1:尽早占用。 策略2:时间占用少 活动安排问题 —直觉贪心策略 的活动先安排。 把活动按照开始时间 从小到大排序,使得 计算每个活动占用时 间fi-si,按照占用时 s1 ≤ s2 ≤… ≤sn,然 后从前向后挑选,只 间从小到大对活动排 要与前面选择的活动 序,使得f1-s1 ≤ f2-s2 相容,便将这项活动 ≤… ≤fn-sn,然后从 选入最大相容集合A。 前向后挑选,只要与 前面活动相容,便将 这项活动选入最大相 容集合A。 策略3:早完成的活 动先安排。 把活动按照截止时间 从小到大排序,使得 f1 ≤ f2 ≤… ≤fn ,然后 从前向后挑选,只要 与前面选择的活动相 容,便将这项活动选 入最大相容集合A。
贪心算法
一般地,有这样一类问题:它有n个输入,而它的解就由 这n个输入的某个子集组成,只是这个子集必须满足某些事 先给定的条件。把那些必须满足的条件称为约束条件;而 把满足约束条件的子集称为该问题的可行解。为了衡量可 行解的优劣,事先给出了一定的标准。一般以函数形式给 出,称为目标函数。那些使目标函数取极值(极大或极小) 的可行解,称为最优解。 贪心法也是一个多步决策法。每一步选择都使得能构成问 题的一个可行解,同时使目标函数的值增加最快(求max) 或增加最小(如求min),这种选择过程是以某些最优量度 为根据,而最优化量度有时可以是目标函数本身,也可以是 别的量度。最优化度量的选择是贪心算法的关键。
有n个活动申请使用同一个礼堂,每项活动有一个开始 活动安排问题 时间和一个截止时间,如果任何两个活动不能同时举 行,问如何选择这些活动,从而使得被安排的活动数 量达到最多? 设S={1, 2, …, n}为活动的集合,si和fi分别为活动i的开 始和截止时间,i=1, 2, …, n。定义 活动i与j相容:si ≥ fj或sj ≥fi, i≠j 求S最大的两两相容的活动子集。
二角五分 一角 五分 一分
现在要找给某顾客六角三分钱,哪种找钱方法拿出 的硬币个数最少呢? 首先选出一个面值不超过六角三分的最大硬 币,即二角五分;然后从六角三分中减去二角五 二角五分 二角五分 一角 一分 一分 一分 分,剩下三角八分;再选出一个面值不超过三角 八分的最大硬币,即又一个二角五分,如此一直 做下去。这种方法实际上就是贪心算法。
(4)根据第(2)步,子问题S’存在最优解B*={ik+1, …}, 则 活动安排问题—贪心策略正确性证明 A’={i1=1, i2, …, ik} ∪B*={i1=1, i2, …, ik, ik+1} ∪(B*-{ik+1})为 原问题一个最优解,且恰好包含了前k+1步选择的活动。
应用实例之