当前位置:
文档之家› 第4章 贪心算法(0-算法思想)
第4章 贪心算法(0-算法思想)
10
4.1 活动安排问题
设有n个活动的集合E={1,2,…,n},其中 每个活动都要求使用同一资源,如演讲会场 等,而在同一时间内只有一个活动能使用这 一资源。每个活动i都有一个要求使用该资源 的起始时间 si和一个结束时间fi,且si <fi 。如果 活动安排问题:就是要在 所给的活动集合内选出最 选择了活动 i,则它在半开时间区间[si, fi)内占 大的相容活动子集合。 用资源。若区间 [si, fi)与区间[sj, fj)不相交,则 称活动i与活动j是相容的。也就是说,当si≥fj 或sj≥fi时,活动i与活动j相容。
30
4.2 贪心算法的基本要素
用贪心算法解背包问题的基本步骤:
首先计算每种物品单位重量的价值Vi/Wi,然 后,依贪心选择策略,将尽可能多的单位重量价值 最高的物品装入背ቤተ መጻሕፍቲ ባይዱ。若将这种物品全部装入背包 后,背包内的物品总重量未超过C,则选择单位重量 价值次高的物品并尽可能多地装入背包。依此策略 一直地进行下去,直到背包装满为止。 具体算法可描述如下页:
4.1 活动安排问题
例:设待安排的11个活动的开始时间和结束 时间按结束时间的非减序排列如下:
i
1 2
3 0 6
4 5 7
5 3 8
6 5
7 6
8 8
9 10 11 8 2 12
S[i] 1 3 f[i] 4 5
9 10 11 12 13 14
15
4.1 活动安排问题
算法greedySelector 的计算过程如左图所 示。图中每行相应于算 法的一次迭代。 阴影长条表示的活动 是已选入集合A的活动, 而空白长条表示的活动 是当前正在检查相容性 的活动。
17
4.1 活动安排问题
18
4.1 活动安排问题
19
4.1 活动安排问题
20
4.1 活动安排问题
首先证明最优解A的构成:前k步和剩 下活动的最优解;再根据剩下活动的 最优解和前k步一样,又包含剩下活动 的第一个的最优解,即第k+1个。
21
4.1 活动安排问题
思考:其它的贪心选择方案:
(1)选择具有最短时段的相容活动 (2)选择覆盖未选择活动最少的相 容活动 (1)(2)都无法获得最优解。 如右图所示活动系列: 最优解{1,2,3,4} (1)选择为{1,4,5} (2)的初选5,5一旦选中,最多只能再选两个
16
4.1 活动安排问题
若被检查的活动i的开始时间Si小于最近选 择的活动j的结束时间fi,则不选择活动i,否 则选择活动i加入集合A中。 贪心算法并不总能求得问题的整体最优 解。但对于活动安排问题,贪心算法 greedySelector却总能求得的整体最优解,即 它最终所确定的相容活动集合A的规模最大。 这个结论可以用数学归纳法证明。(书 P104-105)
【渴婴】 问题模型定义:设ai为第i种饮料的总量(假设以毫升 为单位),而婴儿需要t毫升的饮料来解渴,那么需 要饮用n种不同的饮料各多少才能满足婴儿解渴的需 求呢? 设各种饮料的满意度Si已知,令xi为将要饮用的第i种 饮料的量,那么需要解决的问题是:求解一组实数向 n 量xi(1≤i≤n),使得: S i xi 最大,并满足:
8
4.1 活动安排问题
活动安排问题就是要在所给的活动 集合中选出最大的相容活动子集合,是 可以用贪心算法有效求解的很好例子。 该问题要求高效地安排一系列争用某一 公共资源的活动。贪心算法提供了一个 简单、漂亮的方法使得尽可能多的活动 能兼容地使用公共资源。
9
4.1 活动安排问题
设有n个活动的集合E={1,2,…,n},其中 每个活动都要求使用同一资源,如演讲会场 等,而在同一时间内只有一个活动能使用这 一资源。每个活动i都有一个要求使用该资源 的起始时间si和一个结束时间fi,且si <fi 。如果 选择了活动i,则它在半开时间区间[si, fi)内占 用资源。若区间[si, fi)与区间[sj, fj)不相交,则 称活动i与活动j是相容的。也就是说,当si≥fj 或sj≥fi时,活动i与活动j相容。
7
顾名思义,贪心算法总是作出在当前看来最 好的选择。 也就是说贪心算法并不从整体最优考虑, 它所作出的选择只是在某种意义上的局部最优 选择。 当然,希望贪心算法得到的最终结果也是 使用贪心法要解决的问题: 整体最优的。虽然贪心算法不能对所有问题都 得到整体最优解,但对许多问题它能产生整体 是否可以得到最优解? 最优解。如单源最短路经问题,最小生成树问 不能得到最优解,贪心解与最优解的 题等。在一些情况下,即使贪心算法不能得到 误差估计 整体最优解,其最终结果却是最优解的很好近 似。
27
对具体的一个问题,能否用贪心法得到最优 解。
动态规划法实质: 贪心法实质: 当前状态下的最 好选择。
自底向上
自顶向下
求相关子问题后, 做出选择。
28
4.2 贪心算法的基本要素
0-1背包问题:
给定n种物品和一个背包。物品i的重量是Wi, 其价值为Vi,背包的容量为C。应如何选择装入背 包的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有 2种选择,即装入背包或不装入背包。不能将物品 i装入背包多次,也不能只装入部分的物品i。
31
4.2 贪心算法的基本要素
void Knapsack(int n,float M,float v[],float w[],float x[]) { Sort(n,v,w); int i; for (i=1;i<=n;i++) x[i]=0; float c=M; for (i=1;i<=n;i++) { if (w[i]>c) break; x[i]=1; c-=w[i]; } if (i<=n) x[i]=c/w[i]; }
4.2 贪心算法的基本要素
2、最优子结构性质
当一个问题的最优解包含其子问题的最优 解时,称此问题具有最优子结构性质。问题的 最优子结构性质是该问题可用动态规划算法或 贪心算法求解的关键特征。
26
4.2 贪心算法的基本要素
3、贪心算法与动态规划算法的差异
贪心算法和动态规划算法都要求问题具有最优 子结构性质,这是2类算法的一个共同点。但是, 对于具有最优子结构的问题应该选用贪心算法还是 动态规划算法求解?是否能用动态规划算法求解的 问题也能用贪心算法求解?下面研究2个经典的组合 优化问题,并以此说明贪心算法与动态规划算法的 主要差别。
第4章 贪心算法
1
学习要点
贪心算法的基本思想 贪心算法的基本要素
(1)最优子结构性质 (2)贪心选择性质
贪心算法与动态规划算法的差异 正确性的证明 范例学习贪心设计策略
(1)活动安排问题; (4)单源最短路径; (2)最优装载问题; (5)最小生成树; (3)哈夫曼编码; (6)多机调度问题。
29
4.2 贪心算法的基本要素
背包问题:
与0-1背包问题类似,所不同的是在选择物品i 装入背包时,可以选择物品i的一部分,而不 一定要全部装入背包,1≤i≤n。 这2类问题都具有最优子结构性质,看似相 似,但却是两种不同难易度的问题。 背包问题可以用贪心算法求解,而0-1背包问 题却不能用贪心算法求解。
2
难!
【渴婴】 有一个非常渴的、但很聪明的小婴儿。她可能得到的东 西包括:一杯水、一小罐牛奶、多罐其它不同种类的 果汁……。即婴儿可能得到n种不同口味的饮料。 根据以前对这n种饮料的不同体验,这个婴儿知道其中 某种饮料更适合自己的胃口,因此婴儿采用如下方法 为每一种饮料赋予一个满意度值,即Si作为满意度赋 予第i种饮料。 通常,这个婴儿都会尽量饮用具有最大满意度的饮料来 最大限度地满足她解渴地需要,但不幸地是:她最满 意地饮料有时并没有足够地量来满足这个婴儿解渴地 需要。 3
5
贪心算法 形象模型
最高峰 次高峰 小山峰 小山峰 小山峰 小山峰
6
顾名思义,贪心算法总是作出在当前看来最 好的选择。 也就是说贪心算法并不从整体最优考虑, 它所作出的选择只是在某种意义上的局部最优 选择。 当然,希望贪心算法得到的最终结果也是 整体最优的。虽然贪心算法不能对所有问题都 得到整体最优解,但对许多问题它能产生整体 最优解。如单源最短路经问题,最小生成树问 题等。在一些情况下,即使贪心算法不能得到 整体最优解,其最终结果却是最优解的很好近 似。
24
4.2 贪心算法的基本要素
1、贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以 通过一系列局部最优的选择,即贪心选择来达到。这是 贪心算法可行的第一个基本要素,也是贪心算法与动态 规划算法的主要区别。 动态规划算法通常以自底向上的方式解各子问题,而 贪心算法则通常以自顶向下的方式进行,以迭代的方式 作出相继的贪心选择,每作一次贪心选择就将所求问题 简化为规模更小的子问题。 对于一个具体问题,要确定它是否具有贪心选择性 质,必须证明每一步所作的贪心选择最终导致问题的整 25 体最优解。
x
n
n
i 1
a i t ,则不可能找到问题的求解方案,因 不过,若 i 1 为即使喝光了所有的饮料也不能使婴儿解渴。 4
i 1
i
t
0 xi a i
【找零钱】 一个小孩买糖,付了1美元,假设需要找给小孩67 美分。而提供了如下数目不限的面值钱币:25美分 (Quarters)、10美分(Dimes)、5美分(Nickels)及1 美分(Pennies)。现在问题就是:保证找回67美 分,且希望用最少数目的钱币找给小孩。 解:售货员每次加入一种钱币,并采用的贪婪准则 是:每次选择的某种钱币面值尽可能大,所需张数 尽可能少,但同时需保证解法的可行性(即,所给 的零钱等于要找的零钱数,不多给不少给)。
11
4.1 活动安排问题