第4章贪心算法
合集下载
第4章 贪心算法
提 纲 第4章 贪心算法
应用背景和动机 贪心算法的基本思想 背包问题 最小生成树 单源最短路径 哈夫曼编码
应用背景和动机
最优化问题
—— 优化问题和贪心算法
找钱币的贪心算法
例子:有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾 客4元6角现金 目标:找出的货币的数量最少 贪心算法: 多步决策:根据总额,每步确定不超过总额的最大面额货币数(贪
多步决策:每步选择一项活动加入A
(3)把活动按照截止时间从小到大排序,使得f1≤f2≤…≤fn, 然后从前向后挑选,只要与前面选的活动相容,就可以把这项活 动选入A。
贪心选择策略: (1)把活动按照开始时间从小到大排序,使得s1≤s2≤…≤sn, 然后从前向后挑选,只要与前面选的活动相容,就可以把这项活 动选入A。 (2)计算每个活动的占用时间,即fi-si,然后,按照占用时间从 小到大对活动排序,使得f1-s1≤f2-s2≤…≤fn-sn,然后从前向后挑 选,只要与前面选的活动相容,就可以把这项活动选入A。
心选择:最快地满足支付要求,其目的是使付出的货币张数最慢地增加),
做出一组选择以达到一个最优解,而不仅仅是一个解
贪心算法
贪心算法通常应用于最优化问题,目标也是获得一个最优解 (不是总能如愿)
总额中减去已找面额获得新的总额(子问题);重复上述过程直到剩 余总额为0。 选择: •选出2元*2,余6角 •选出5角,余1角 •选出1角,余0 •总共付出4张货币
例:
i s[i] f[i] 1 1 4 2 3 5 3 0 6 4 5 7 5 3 8 6 5 9 7 6 10 8 8 11 9 8 12 10 2 13 11 12 14
最优解:A={1, 4, 8, 11} 总共可安排的最大活动数是4个。 最优解不唯一:A={2, 4, 8, 11}
应用背景和动机 贪心算法的基本思想 背包问题 最小生成树 单源最短路径 哈夫曼编码
应用背景和动机
最优化问题
—— 优化问题和贪心算法
找钱币的贪心算法
例子:有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾 客4元6角现金 目标:找出的货币的数量最少 贪心算法: 多步决策:根据总额,每步确定不超过总额的最大面额货币数(贪
多步决策:每步选择一项活动加入A
(3)把活动按照截止时间从小到大排序,使得f1≤f2≤…≤fn, 然后从前向后挑选,只要与前面选的活动相容,就可以把这项活 动选入A。
贪心选择策略: (1)把活动按照开始时间从小到大排序,使得s1≤s2≤…≤sn, 然后从前向后挑选,只要与前面选的活动相容,就可以把这项活 动选入A。 (2)计算每个活动的占用时间,即fi-si,然后,按照占用时间从 小到大对活动排序,使得f1-s1≤f2-s2≤…≤fn-sn,然后从前向后挑 选,只要与前面选的活动相容,就可以把这项活动选入A。
心选择:最快地满足支付要求,其目的是使付出的货币张数最慢地增加),
做出一组选择以达到一个最优解,而不仅仅是一个解
贪心算法
贪心算法通常应用于最优化问题,目标也是获得一个最优解 (不是总能如愿)
总额中减去已找面额获得新的总额(子问题);重复上述过程直到剩 余总额为0。 选择: •选出2元*2,余6角 •选出5角,余1角 •选出1角,余0 •总共付出4张货币
例:
i s[i] f[i] 1 1 4 2 3 5 3 0 6 4 5 7 5 3 8 6 5 9 7 6 10 8 8 11 9 8 12 10 2 13 11 12 14
最优解:A={1, 4, 8, 11} 总共可安排的最大活动数是4个。 最优解不唯一:A={2, 4, 8, 11}
第4章 贪心算法
2
【渴婴】
有一个非常渴的、但很聪明的小婴儿。她可能得到的东 西包括:一杯水、一小罐牛奶、多罐其它不同种类的 果汁……。即婴儿可能得到n种不同口味的饮料。
根据以前对这n种饮料的不同体验,这个婴儿知道其中 某种饮料更适合自己的胃口,因此婴儿采用如下方法 为每一种饮料赋予一个满意度值,即Si作为满意度赋 予第i种饮料。 通常,这个婴儿都会尽量饮用具有最大满意度的饮料来 最大限度地满足她解渴地需要,但不幸地是:她最满 意地饮料有时并没有足够地量来满足这个婴儿解渴地 需要。 3
对于一个具体问题,要确定它是否具有贪心选择性质, 必须证明每一步所作的贪心选择最终导致问题的整体最 23 优解。
4.2 贪心算法的基本要素
2、最优子结构性质
当一个问题的最优解包含其子问题的最优 解时,称此问题具有最优子结构性质。问题的 最优子结构性质是该问题可用动态规划算法或
贪心算法求解的关键特征。
20
4.1 活动安排问题
和活动安排问题类似的是“区间相 交问题”。
【区间相交问题】:给定x轴上n个 闭区间。去掉尽可能少的闭区间, 使剩下的闭区间都不相交。 算法:这个问题和“活动安排问题” 类似。每次选取右端点坐标最小的 闭区间,并将与其相交的闭区间删 去!
21
4.2 贪心算法的基本要素
本节着重讨论可以用贪心算法求解的问题 的一般特征。 对于一个具体的问题,怎么知道是否可用 贪心算法解此问题,以及能否得到问题的最 优解呢?这个问题很难给予肯定的回答。 但是,从许多可以用贪心算法求解的问题 中看到这类问题一般具有2个重要的性质: 贪心选择性质和最优子结构性质。
首先证明最优解A的构成: 前k步和剩下活动的最优
解;再根据剩下活动的最
优解和前k步一样,又包
【渴婴】
有一个非常渴的、但很聪明的小婴儿。她可能得到的东 西包括:一杯水、一小罐牛奶、多罐其它不同种类的 果汁……。即婴儿可能得到n种不同口味的饮料。
根据以前对这n种饮料的不同体验,这个婴儿知道其中 某种饮料更适合自己的胃口,因此婴儿采用如下方法 为每一种饮料赋予一个满意度值,即Si作为满意度赋 予第i种饮料。 通常,这个婴儿都会尽量饮用具有最大满意度的饮料来 最大限度地满足她解渴地需要,但不幸地是:她最满 意地饮料有时并没有足够地量来满足这个婴儿解渴地 需要。 3
对于一个具体问题,要确定它是否具有贪心选择性质, 必须证明每一步所作的贪心选择最终导致问题的整体最 23 优解。
4.2 贪心算法的基本要素
2、最优子结构性质
当一个问题的最优解包含其子问题的最优 解时,称此问题具有最优子结构性质。问题的 最优子结构性质是该问题可用动态规划算法或
贪心算法求解的关键特征。
20
4.1 活动安排问题
和活动安排问题类似的是“区间相 交问题”。
【区间相交问题】:给定x轴上n个 闭区间。去掉尽可能少的闭区间, 使剩下的闭区间都不相交。 算法:这个问题和“活动安排问题” 类似。每次选取右端点坐标最小的 闭区间,并将与其相交的闭区间删 去!
21
4.2 贪心算法的基本要素
本节着重讨论可以用贪心算法求解的问题 的一般特征。 对于一个具体的问题,怎么知道是否可用 贪心算法解此问题,以及能否得到问题的最 优解呢?这个问题很难给予肯定的回答。 但是,从许多可以用贪心算法求解的问题 中看到这类问题一般具有2个重要的性质: 贪心选择性质和最优子结构性质。
首先证明最优解A的构成: 前k步和剩下活动的最优
解;再根据剩下活动的最
优解和前k步一样,又包
4-贪心算法
二、TSP问题的贪心算法
min ci
i 1 n
从驻地城市开始,每次选择还没到的最近(费用最少)的城市去.
1 2 7
1 4 4
2 4 1
7 4 1
5 3 2 3
5
3
2
3
1
2
5
3
4
Cost=1+3+2+1+7=14
1
2
5
4
3
Cost=1+3+3+1+2=10
template <class Type> Type GreedyTSP(Type **C,int n,int k,int x[ ]){ //从城市k出发用贪心算法求解TSP问题. //最佳解放在x[ ]里,路程(费用)用函数值返回 x[1]=k; int u=k; Type cost=0; for(int i=2; i<=n;i++){ Type min=; int v=0; for(int j=1; j<=n;j++) if(C[u][j]<min){min= C[u][j]; v=j;} cost+= min;x[i]=v; C[v][u]= ;u=v; } cost+=C[u][k]; return cost; }
§4.5 最小生成树
一、最小生成树
设G=(V,E)是一个无向连通带权图(无向连通网),E中每条 边(v,w)的权为c[v][w]. 如果G的一个子图G’是一棵包含G的所有顶点的树,则称G’为 G的生成树. 生成树上各条边权的总和称为该生成树的耗费,在G的所有 生成树中,耗费最小的生成树称为G的最小生成树.
贪心算法讲义
float p[1..n], w[1..n], x[1..n], M, rc;
integer i, n; x:= 0; // 将解向量初始化为零
//w[1..n],它们元素的排列 //顺序满p[i]/w[i]≥p[i+1]/w[i+1] //M是背包容量,x[1..n]是解向量
rc:= M; // 背包的剩余容量初始化为M
作业调度问题
单机作业调度问题的贪心算法
将上述算法找到的作业集按作业期限升序排列,就产生一 个作业调度。
算法的复杂度分析
J {i}的相容性判断最坏|J|次,|J|最大i-1。所以 T(n)=1+2+…+n-1=O(n2)
例子: 设n=7,
(p1, p2,… ,pn)=(35,30,25,20,15,10,5), (d1, d2,… ,dn)=(4,2,4,3,4,8,3) 算法GreedyJob的执行过程 : 作业 1 ;2, 1; 2, 1, 3; 2, 4, 1, 3; 2, 4, 1, 3 , 6; 期限 4; 2, 4; 2,4, 4; 2, 3, 4, 4; 2, 3, 4, 4, 8;
带期限的单机作业安排问题
已知n项作业 E={1, 2, … ,n}要求使用同台机器完成, 而且每项作业需要的时间都是1。第k项作业要求在时 刻2, d…k之, n前。完成, 而且完成这项作业将获得效益pk,k=1,
作业集E的子集称为相容的如果其中的作业可以被安 排由一台机器完成。
带限期单机作业安排问题就是要在所给的作业集合中 选出总效益值最大的相容子集。
许多NP难组合优化问题,目前仍未找到有效的算法, 贪心策略常用于设计这些问题的近似算法。
贪心算法的基本思想
第4章_贪心算法_Second_Part_
编码的前缀性质可以使译码方法非常简单。 表示最优前缀码的二叉树总是一棵完全二叉树,即树 中任一结点都有2个儿子结点。 平均码长定义为: B(T ) f (c)d T (c)
cC
使平均码长达到最小的前缀码编码方案称为给定编码 字符集C的最优前缀码。
4.4 哈夫曼编码
2、构造哈夫曼编码
哈夫曼提出构造最优前缀码的贪心算法,由此产生的 编码方案称为哈夫曼编码。 哈夫曼算法以自底向上的方式构造表示最优前缀码的 二叉树T。 算法以|C|个叶结点开始,执行|C|-1次的“合并” 运算后产生最终所要求的树T。
4.6 最小生成树
1、最小生成树性质 用贪心算法设计策略可以设计出构造最小生成树 的有效算法。本节介绍的构造最小生成树的Prim算法 和Kruskal算法都可以看作是应用贪心算法设计策略的 例子。尽管这2个算法做贪心选择的方式不同,它们都 利用了下面的最小生成树性质: 设G=(V,E)是连通带权图,U是V的真子集。如果 (u,v)E,且uU,vV-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最小生 成树,它以(u,v)为其中一条边。这个性质有时也称为 MST性质。 证明MST性质。P125
4.6 最小生成树
利用最小生成树性质 和数学归纳法容易证明, 上述算法中的边集合T始终 包含G的某棵最小生成树中 的边。因此,在算法结束 时,T中的所有边构成G的 一棵最小生成树。 例如,对于右图中的 带权图,按Prim算法选取 边的过程如下页图所示。
4.6 最小生成树
4.6 最小生成树
在上述Prim算法中,还应当考虑如何有效地找出满 足条件iS,jV-S,且权c[i][j]最小的边(i,j)。实现 这个目的的较简单的办法是设置2个数组closest和 lowcost。 在Prim算法执行过程中,先找出V-S中使lowcost值 最小的顶点j,然后根据数组closest选取边 (j,closest[j]),最后将j添加到S中,并对closest和 lowcost作必要的修改。 用这个办法实现的Prim算法所需的计算时间为O(n 2 )
cC
使平均码长达到最小的前缀码编码方案称为给定编码 字符集C的最优前缀码。
4.4 哈夫曼编码
2、构造哈夫曼编码
哈夫曼提出构造最优前缀码的贪心算法,由此产生的 编码方案称为哈夫曼编码。 哈夫曼算法以自底向上的方式构造表示最优前缀码的 二叉树T。 算法以|C|个叶结点开始,执行|C|-1次的“合并” 运算后产生最终所要求的树T。
4.6 最小生成树
1、最小生成树性质 用贪心算法设计策略可以设计出构造最小生成树 的有效算法。本节介绍的构造最小生成树的Prim算法 和Kruskal算法都可以看作是应用贪心算法设计策略的 例子。尽管这2个算法做贪心选择的方式不同,它们都 利用了下面的最小生成树性质: 设G=(V,E)是连通带权图,U是V的真子集。如果 (u,v)E,且uU,vV-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最小生 成树,它以(u,v)为其中一条边。这个性质有时也称为 MST性质。 证明MST性质。P125
4.6 最小生成树
利用最小生成树性质 和数学归纳法容易证明, 上述算法中的边集合T始终 包含G的某棵最小生成树中 的边。因此,在算法结束 时,T中的所有边构成G的 一棵最小生成树。 例如,对于右图中的 带权图,按Prim算法选取 边的过程如下页图所示。
4.6 最小生成树
4.6 最小生成树
在上述Prim算法中,还应当考虑如何有效地找出满 足条件iS,jV-S,且权c[i][j]最小的边(i,j)。实现 这个目的的较简单的办法是设置2个数组closest和 lowcost。 在Prim算法执行过程中,先找出V-S中使lowcost值 最小的顶点j,然后根据数组closest选取边 (j,closest[j]),最后将j添加到S中,并对closest和 lowcost作必要的修改。 用这个办法实现的Prim算法所需的计算时间为O(n 2 )
《计算机算法设计与分析》PPT第四章贪心算法资料
11
假设活动已按结束时间的单调非递减顺序排序 f0≤f1≤f2≤… ≤fn<fn+1
则,当i≥j时, Sij=φ。
假设存在一活动ak∈Sij,其中i≥j,则在已排的序列中 ai在aj后面。
因fi≤sk<fk≤sj<fj ,与在已排的序列中ai在aj后面的 假设相矛盾。
所以,设活动按结束时间的单调非递减顺序排序,子 问题空间被用来从sij中选择最大相容活动子集,其中 0≤i<j≤n+1,而且所有其它的sij是空的。
14
步骤2:递归地定义最优解的值 设c[i, j]为Sij中最大相容子集中的活动数。当 Sij=φ时,c[i, j] = 0。对于一个非空子集Sij, 如果ak在Sij的最大相容子集中被使用,则子问 题Sik和Skj的最大相容子集也被使用。从而:
c[i, j] = c[i, k] + c[k, j] + 1
活动安排问题:要在所给的活动集合中选出最大 的相容活动子集合。
10
用动态规划方法求解
步骤1:分析最优解的结构特征 构造子问题空间 Sij={ ak∈S: fi≤sk<fk≤sj} Sij是S中活动的子集,其中每个活动都在活动ai 结束之后开始,且在活动aj开始之前结束。 Sij包含了所有与ai和aj相容的活动,并且与不迟 于ai结束和不早于aj开始的活动相容。此外, 虚构活动a0和an+1,其中f0=0, Sn+1=∞。原 问题即为寻找S0,n+1中最大相容活动子集。
(5)约束函数constraint:检查解集合中加入一 个候选对象是否满足约束条件。例如,在找零钱 问题中,约束函数是每一步选择的货币和已付出 的货币相加不超过应找零钱。
7
贪心算法的一般框架
假设活动已按结束时间的单调非递减顺序排序 f0≤f1≤f2≤… ≤fn<fn+1
则,当i≥j时, Sij=φ。
假设存在一活动ak∈Sij,其中i≥j,则在已排的序列中 ai在aj后面。
因fi≤sk<fk≤sj<fj ,与在已排的序列中ai在aj后面的 假设相矛盾。
所以,设活动按结束时间的单调非递减顺序排序,子 问题空间被用来从sij中选择最大相容活动子集,其中 0≤i<j≤n+1,而且所有其它的sij是空的。
14
步骤2:递归地定义最优解的值 设c[i, j]为Sij中最大相容子集中的活动数。当 Sij=φ时,c[i, j] = 0。对于一个非空子集Sij, 如果ak在Sij的最大相容子集中被使用,则子问 题Sik和Skj的最大相容子集也被使用。从而:
c[i, j] = c[i, k] + c[k, j] + 1
活动安排问题:要在所给的活动集合中选出最大 的相容活动子集合。
10
用动态规划方法求解
步骤1:分析最优解的结构特征 构造子问题空间 Sij={ ak∈S: fi≤sk<fk≤sj} Sij是S中活动的子集,其中每个活动都在活动ai 结束之后开始,且在活动aj开始之前结束。 Sij包含了所有与ai和aj相容的活动,并且与不迟 于ai结束和不早于aj开始的活动相容。此外, 虚构活动a0和an+1,其中f0=0, Sn+1=∞。原 问题即为寻找S0,n+1中最大相容活动子集。
(5)约束函数constraint:检查解集合中加入一 个候选对象是否满足约束条件。例如,在找零钱 问题中,约束函数是每一步选择的货币和已付出 的货币相加不超过应找零钱。
7
贪心算法的一般框架
贪心算法 PPT课件
第4章 贪心算法
1
学习要点
理解贪心算法的概念。 掌握贪心算法的基本要素 (1)最优子结构性质
(2)贪心选择性质
理解贪心算法与动态规划算法的差异 理解贪心算法的一般理论 通过应用范例学习贪心设计策略。 (1)活动安排问题; (2)最优装载问题; (3)哈夫曼编码; (4)单源最短路径; (5)最小生成树; (6)多机调度问题。
15
4.2 贪心算法的基本要素
1、贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以 通过一系列局部最优的选择,即贪心选择来达到。这是 贪心算法可行的第一个基本要素,也是贪心算法与动态 规划算法的主要区别。 动态规划算法通常以自底向上的方式解各子问题, 而贪心算法则通常以自顶向下的方式进行,以迭代的方 式作出相继的贪心选择,每作一次贪心选择就将所求问 题简化为规模更小的子问题。
7
4.1 活动安排问题
活动安排问题就是要在所给的活动集合 中选出最大的相容活动子集合,是可以用 贪心算法有效求解的很好例子。该问题要求 高效地安排一系列争用某一公共资源的活动。 贪心算法提供了一个简单、漂亮的方法使得 尽可能多的活动能兼容地使用公共资源。
8
4.1 活动安排问题
设有n个活动的集合E={1,2,…,n},其中每个活 动都要求使用同一资源,而在同一时间内只有一个活 动能使用这一资源。每个活动i都有一个要求使用该 资源的起始时间si和一个结束时间fi,且si <fi 。如 果选择了活动i,则它在半开时间区间[si, fi)内占 用资源。
{ A[1]=true; int j=1; for (int i=2;i<=n;i++) {
1
学习要点
理解贪心算法的概念。 掌握贪心算法的基本要素 (1)最优子结构性质
(2)贪心选择性质
理解贪心算法与动态规划算法的差异 理解贪心算法的一般理论 通过应用范例学习贪心设计策略。 (1)活动安排问题; (2)最优装载问题; (3)哈夫曼编码; (4)单源最短路径; (5)最小生成树; (6)多机调度问题。
15
4.2 贪心算法的基本要素
1、贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以 通过一系列局部最优的选择,即贪心选择来达到。这是 贪心算法可行的第一个基本要素,也是贪心算法与动态 规划算法的主要区别。 动态规划算法通常以自底向上的方式解各子问题, 而贪心算法则通常以自顶向下的方式进行,以迭代的方 式作出相继的贪心选择,每作一次贪心选择就将所求问 题简化为规模更小的子问题。
7
4.1 活动安排问题
活动安排问题就是要在所给的活动集合 中选出最大的相容活动子集合,是可以用 贪心算法有效求解的很好例子。该问题要求 高效地安排一系列争用某一公共资源的活动。 贪心算法提供了一个简单、漂亮的方法使得 尽可能多的活动能兼容地使用公共资源。
8
4.1 活动安排问题
设有n个活动的集合E={1,2,…,n},其中每个活 动都要求使用同一资源,而在同一时间内只有一个活 动能使用这一资源。每个活动i都有一个要求使用该 资源的起始时间si和一个结束时间fi,且si <fi 。如 果选择了活动i,则它在半开时间区间[si, fi)内占 用资源。
{ A[1]=true; int j=1; for (int i=2;i<=n;i++) {
第四章 贪心算法1
定义2(greedy选择性质)
若一个优化问题的全局优化解可通过局部优化 选择得到,则该问题称为具有greedy选择性质。
6
Greedy算法正确性证明方法
• 证明算法所求解的问题具有优化子结构性质 • 证明算法所求解的问题具有Greedy选择性 • 说明算法确实按照Greedy选择性进行局部 优化选择的
8
二、活动安排问题 (An activity-selection problem)
<1>问题的定义
活动安排问题是可以用贪心算法有效求解的一 个很好的例子。 •活动 设有n个活动的集合E={1,2,…,n},其中每个 活动都要求使用同一资源,如演讲会场等,而在 同一时间内只允许一个活动使用这一资源。每个 活动i都有一个要求使用该资源的起始时间si和一 个结束时间fi,且si < fi。如果选择了活动i,则它 在半开的时间区间(si,fi]内占用资源。
22
问题定义
给定编码字符集C及其概率分布f,即C中任意字符c以 概率f(c)在数据文件中出现。C的一个前缀编码方案对应 一棵二叉树T。字符c在树T中的深度记为dT(c)。dT(c)也 是字符c的前缀码长。该编码方案的平均码长定义为:
B(T) f(c) dT (c )。
cC
目标:
求出使平均码长最小的前缀编码方案――哈夫曼编码。
19
算法:
Template <class Type> void Loading(int x[ ], Type w[ ], Type c, int n) { int *t= new int[n+1]; Sort(w, t, n); //数组元素t[i] 存放重量第i轻的集装箱号。 for ( int i=1;i<=n; i++) x[i]=0; // 数组元素x[i]=0表示不装入集装箱i。 for ( int i=1; i<=n &&w[t[i]]<= c; i++) {x[t[i]] =1; c- = w[t[i]]; } }
算法-第4章贪心法-PPT课件
f i A
i , j A , i j , f ( i ) t f ( j ) or f ( j ) t f ( i ) i j
12
实例
A={1, 2, 3, 4, 5}, T=<5, 8, 4, 10, 3>, D=<10, 12, 15, 11, 20> 调度1: f1(1)=0, f1(2)=5, f1(3)=13, f1(4)=17, f1(5)=27 各任务延迟:0, 1, 2, 16, 10; 最大延迟:16 5 1 2 13 3 17 4 27 5 30
18
i j
f2(j)=s f2(i)=s+tj
delay(f’,i)=s+tj+ti- di <delya(f,j)r delay(f, j)=s+ti+tj-dj
4.3 得不到最优解的处理方法
讨论对于哪些输入贪心法能得到最优解:输入条件 讨论贪心法的解最坏情况下与最优解的误差(见第8章)
例4.4 找零钱问题 设有 n 种零钱, 重量分别为w1, w2, ... , wn, 价值分别为 v1=1, v2, ... , vn. 需要付的总钱数是 Y .不妨设币值和钱数都为 正整数. 问:如何付钱使得所付钱的总重最轻?
设计思想:按完成时间从早到晚安排任务,没有空闲
15
交换论证:正确性证明
算法的解的性质: (1) 没有空闲时间, 没有逆序. (2) 逆序 (i, j): f(i) < f(j) 且 di > dj 引理4.1 所有没有逆序、没有空闲时间的调度具有相同的 最大延迟. 证: 设 f 没有逆序,在 f 中具有相同完成时间的客户i1, i2, … , ik 必被连续安排. 在这k个客户中最大延迟是最后一个客 户,被延迟的时间是 k
i , j A , i j , f ( i ) t f ( j ) or f ( j ) t f ( i ) i j
12
实例
A={1, 2, 3, 4, 5}, T=<5, 8, 4, 10, 3>, D=<10, 12, 15, 11, 20> 调度1: f1(1)=0, f1(2)=5, f1(3)=13, f1(4)=17, f1(5)=27 各任务延迟:0, 1, 2, 16, 10; 最大延迟:16 5 1 2 13 3 17 4 27 5 30
18
i j
f2(j)=s f2(i)=s+tj
delay(f’,i)=s+tj+ti- di <delya(f,j)r delay(f, j)=s+ti+tj-dj
4.3 得不到最优解的处理方法
讨论对于哪些输入贪心法能得到最优解:输入条件 讨论贪心法的解最坏情况下与最优解的误差(见第8章)
例4.4 找零钱问题 设有 n 种零钱, 重量分别为w1, w2, ... , wn, 价值分别为 v1=1, v2, ... , vn. 需要付的总钱数是 Y .不妨设币值和钱数都为 正整数. 问:如何付钱使得所付钱的总重最轻?
设计思想:按完成时间从早到晚安排任务,没有空闲
15
交换论证:正确性证明
算法的解的性质: (1) 没有空闲时间, 没有逆序. (2) 逆序 (i, j): f(i) < f(j) 且 di > dj 引理4.1 所有没有逆序、没有空闲时间的调度具有相同的 最大延迟. 证: 设 f 没有逆序,在 f 中具有相同完成时间的客户i1, i2, … , ik 必被连续安排. 在这k个客户中最大延迟是最后一个客 户,被延迟的时间是 k
贪心算法讲义
许多NP难组合优化问题,目前仍未找到有效的算法, 贪心策略常用于设计这些问题的近似算法。
贪心算法的基本思想
proc GreedyAction(s, f,n) //策略3的活动安排贪心算法 //s[1..n]、f[1..n]分别代表n项活动的起始时间和结束时间, //并且满足f[1] f[2]… f[n] j:=1; solution:={1}; //解向量初始化 for i from 2 to n do if sifj then // 将i加入解中 solution:=solution {i}; j:=i; end{if} end{for} return(solution);
end{GreedyAction}
ቤተ መጻሕፍቲ ባይዱ
贪心算法的基本思想
活动安排问题的策略3贪心算法正确性证明:归纳法
证:将活动按截止时间递增排列。归纳证明算法前k步导致最优解。 K=1时,算法选择了活动1。设A={i1,i2,..,ij}是一个最优解,则
A1={1,i2,..,ij}也是一个最优解,因为活动1比i1结束时间更早,A1是 相容的活动集。即算法的第一步导致最优解。 设对算法的第k步正确,令i1=1,i2,…ik是算法选择的活动序列,则存 在最优解A={i1=1,i2,…ik} ∪B。令S/是S中剩下的与i1=1,i2,…ik相容的 活 最动优,解即是SB//=且{j||Bsj/|≥>f|iBk,|j,∈那S么},用那B么/替B换是BS得/的到一的个解最=优{i1解=1。,i2否,…则ik,} ∪若BS/比/的A 活动更多,与A是最优解矛盾。 根据归纳假设,算法第一步选择结束时间最早的活动总是导致一个 最优解,所以问题S/存在一个最优解B*={ik+1,…},|B*|=|B|。 于是A/={i1=1,i2,…ik} ∪B*={i1=1,i2,…ik,ik+1} ∪(B*-{ik+1})与A的活动 一样多,也是最优解,且包含了算法前k+1步选择的活动。算法步 数是有限的,k是任意的,得证。
贪心算法的基本思想
proc GreedyAction(s, f,n) //策略3的活动安排贪心算法 //s[1..n]、f[1..n]分别代表n项活动的起始时间和结束时间, //并且满足f[1] f[2]… f[n] j:=1; solution:={1}; //解向量初始化 for i from 2 to n do if sifj then // 将i加入解中 solution:=solution {i}; j:=i; end{if} end{for} return(solution);
end{GreedyAction}
ቤተ መጻሕፍቲ ባይዱ
贪心算法的基本思想
活动安排问题的策略3贪心算法正确性证明:归纳法
证:将活动按截止时间递增排列。归纳证明算法前k步导致最优解。 K=1时,算法选择了活动1。设A={i1,i2,..,ij}是一个最优解,则
A1={1,i2,..,ij}也是一个最优解,因为活动1比i1结束时间更早,A1是 相容的活动集。即算法的第一步导致最优解。 设对算法的第k步正确,令i1=1,i2,…ik是算法选择的活动序列,则存 在最优解A={i1=1,i2,…ik} ∪B。令S/是S中剩下的与i1=1,i2,…ik相容的 活 最动优,解即是SB//=且{j||Bsj/|≥>f|iBk,|j,∈那S么},用那B么/替B换是BS得/的到一的个解最=优{i1解=1。,i2否,…则ik,} ∪若BS/比/的A 活动更多,与A是最优解矛盾。 根据归纳假设,算法第一步选择结束时间最早的活动总是导致一个 最优解,所以问题S/存在一个最优解B*={ik+1,…},|B*|=|B|。 于是A/={i1=1,i2,…ik} ∪B*={i1=1,i2,…ik,ik+1} ∪(B*-{ik+1})与A的活动 一样多,也是最优解,且包含了算法前k+1步选择的活动。算法步 数是有限的,k是任意的,得证。
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
20
4.1 活动安排问题的贪心选择性质 为所给的活动集合。 设E={1,2,…,n}为所给的活动集合。 = 为所给的活动集合 E中活动按结束时间的非减序排列,故活动 具有 中活动按结束时间的非减序排列, 中活动按结束时间的非减序排列 故活动1具有 最早的完成时间。 最早的完成时间。 首先, 首先,证明活动安排问题有一个最优解以贪心选 择开始,即该最优解中包含活动1。 择开始,即该最优解中包含活动 。
19
2、最优子结构性质
当一个问题的最优解包含其子问题的最优 解时,称此问题具有最优子结构性质。 解时,称此问题具有最优子结构性质。 问题的最优子结构性质是该问题可用动态 规划算法或贪心算法求解的关键特征。 规划算法或贪心算法求解的关键特征。
以下证明活动安排问题具备这两个基本要 即可由贪心算法求最优解。 素,即可由贪心算法求最优解。
6
4.1 活动安排问题
新学期来临,为迎接新生,各院系都要举办迎 新晚会。时间将近,各院系在申请使用学院礼堂 进行彩排。为了提高礼堂使用率,决定白天不间 断的开放,各院系可以上报各自使用的时间区间 (开始时间以及终止时间,时间长短不限),由 礼堂管理人员安排尽可能多的院系在同一天里彩 排。 请根据以下时间段尽可能多安排几个院系: [8:00,10:30), [9:00,11:30), [7:00,11:00), [11:30-14:00), [12:00,13:30) , [13:00,15:30), [15:00,16:00), [14:30,16:00), [16:00,18:00)
15
4.1 活动安排问题
贪心算法并不总能求得问题的整体最优解。 贪心算法并不总能求得问题的整体最优解。 对于活动安排问题,算法greedySelector greedySelector却总能 但对于活动安排问题,算法greedySelector却总能 求得它的整体最优解, 求得它的整体最优解,即它最终所确定的相容活动 集合A的规模最大。 集合A的规模最大。
10
4.1 活动安排问题
解活动安排问题的贪心算法GreedySelector 解活动安排问题的贪心算法GreedySelector :
template<class Type> void GreedySelector(int n, Type s[], Type f[], bool A[]) { A[1]=true; //加入最早结束的活动 加入最早结束的活动 int j=1; //刚加入集合的活动号 刚加入集合的活动号
16
4.2 贪心算法的基本要素
本节着重讨论可以用贪心算法求解的问题的一 般特征。 般特征。 从许多可以用贪心算法求解的问题中看到这类 问题一般具有2个重要的性质:贪心选择性质和 问题一般具有2个重要的性质:贪心选择性质和最 优子结构性质。 优子结构性质。
17
4.2 贪心算法的基本要素
1、贪心选择性质 所谓贪心选择性质是指所求问题的整体 最优解可以通过一系列局部最优的选择,即 可以通过一系列局部最优的选择, 贪心选择来达到。 贪心选择来达到。 这是贪心算法可行的第一个基本要素, 这是贪心算法可行的第一个基本要素,也 是贪心算法与动态规划算法的主要区别。 是贪心算法与动态规划算法的主要区别。
21
4.1 活动安排问题的贪心选择性质
的一个子集, 设A是E的一个子集,且A是所给的活动安排问题的一个 最优解, 中活动也按结束时间非减序排列, 最优解,且A中活动也按结束时间非减序排列,A中第 一个活动是活动k 一个活动是活动k。 k=1, 中第一个活动是活动1 活动1 若k=1,则A中第一个活动是活动1,活动1是E中最早结 束的, 就是一个以贪心选择开始的最优解。 束的,即A就是一个以贪心选择开始的最优解。 k>1,则我们可以设B=(A B=(A∪{1}.即用活动 即用活动1 若k>1,则我们可以设B=(A-{k}) ∪{1}.即用活动1替 换掉活动k 由于f 中活动是互为相容的, 换掉活动k,由于f1≤fk,且A中活动是互为相容的,故 中活动也是互为相容的(说明B是一个可行解)。 )。又 B中活动也是互为相容的(说明B是一个可行解)。又B 中活动个数与A中活动个数相等, 是最优的, 中活动个数与A中活动个数相等,且A是最优的,则B也 是最优的。 是最优的。
有位顾客买了两斤苹果,需付3元7角,实付10元,你需找 零6元3角。假设你抽屉里有一些硬币,面值分别为:2元5 角、1元、5角和1角,现在问题是:怎么找币最快(取硬 币次数最少)?
问题描述:M=6.3 ,n=4 V={2.5, 1.0, 0.5 ,0.1}(分量用vi表示) X={ x1, x2, x3, x4 } (xi>=0, i=1~4) 即求:
13
4.1 活动安排问题
设待安排的11 11个活动的开始时间和结束时 例:设待安排的11个活动的开始时间和结束时 间按结束时间的非减序排列如下: 间按结束时间的非减序排列如下:
i S[i] f[i] 1 1 2 3 3 0 4 5 5 3 6 5 7 6 8 8 9 8 10 2 11 12
4
5
6
18
1、贪心选择性质 动态规划算法中,每步所作的选择往往依赖于相 动态规划算法中 关子问题的解。因此, 关子问题的解。因此,动态规划算法通常以自底 向上的方式解各子问题。 向上的方式解各子问题。 贪心算法则通常以自顶向下的方式进行 则通常以自顶向下的方式进行, 贪心算法则通常以自顶向下的方式进行,以迭代 的方式作出相继的贪心选择, 的方式作出相继的贪心选择,每作一次贪心选择 就将所求问题简化为规模更小的子问题。 就将所求问题简化为规模更小的子问题。 对于一个具体问题, 对于一个具体问题,要确定它是否具有贪心选择 性质, 性质,必须证明每一步所作的贪心选择最终导致 问题的整体最优解。 问题的整体最优解。
11
4.1 活动安排问题
算法GreedySelector每次总是选择具有最 算法GreedySelector每次总是选择具有最 GreedySelector 早完成时间的相容活动加入集合A 早完成时间的相容活动加入集合A中。 该算法的贪心选择的意义是使剩余的可安 排时间段极大化, 排时间段极大化,以便安排尽可能多的相容 活动。 活动。
9
4.1 活动安排问题
将各活动的起始时间和结束时间存储于数组s和f 中,且按结束时间的非减序排列: f1<=f2 <=f3... ... <=fn 即需要先对各活动按结束时间排序。
如:[2,3), [1,4), [3,5), [1,2) 按结束时间排序后: [1,2), [2,3), [1,4), [3,5) 剩余时间越多,可安排的活动就越多! 剩余时间越多,可安排的活动就越多!
22
4.1 活动安排问题的贪心选择性质 也就是说, 是一个以贪心选择活动 是一个以贪心选择活动1开始的最优 也就是说,B是一个以贪心选择活动 开始的最优 活动安排。因此,我们证明了总存在一个以贪心 活动安排。因此,我们证明了总存在一个以贪心 选择开始的最优活动安排方案( ) 选择开始的最优活动安排方案(a) 。 以下证明在贪心选择了活动1之后 之后, 以下证明在贪心选择了活动 之后,原问题简化为 中所有与1相容的活动进行活动安排的子问题 对E中所有与 相容的活动进行活动安排的子问题 中所有与 相容的活动进行活动安排的子问题。
8
4.1 活动安排问题
设有n个活动的集合E={1,2,…,n} 设有n个活动的集合E={1,2, ,n},其中每个活动都 E={1,2, ,n}, 要求使用同一资源,如会场等, 要求使用同一资源,如会场等,而在同一时间内只有一 个活动能使用这一资源。 个活动能使用这一资源。 每个活动i都有一个要求使用该资源的起始时间si和一 每个活动i都有一个要求使用该资源的起始时间s 个结束时间f 个结束时间fi,且si<fi 。 如果选择了活动i 则它在时间的半开半闭区间[s 如果选择了活动i,则它在时间的半开半闭区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交, 内占用资源。若区间[s 与区间[s 不相交, 则称活动i与活动j是相容的。也就是说, 则称活动i与活动j是相容的。也就是说,当si≥fj或 活动i与活动j相容。 sj≥fi时,活动i与活动j相容。
7
8
9
10
11
12
13
14
14
4.1 活动安排问题
计算过程如左图所示。 计算过程如左图所示。 图中每行相应于算法的一 次迭代。 次迭代。 阴影长条表示的活动已选 入集合,而空白长条表示 入集合, 当前正在检查相容性的活 动。 若被检查的活动i 若被检查的活动i的开始 时间S 时间Si小于最近选择的活 的结束时间f 动j的结束时间fi,则不选 择活动i 否则选择活动i 择活动i,否则选择活动i 加入集合A 加入集合A中。
7
4.1 活动安排问题
活动安排问题就是要在所给的活动集合中选出最 活动安排问题就是要在所给的活动集合中选出最 大的相容活动子集合, 大的相容活动子集合,是可以用贪心算法有效求解的 典型例子。 典型例子。 该问题要求高效地安排一系列争用某一公共资源 该问题要求高效地安排一系列争用某一公共资源 的活动。 的活动。 贪心算法提供了一个简单、 贪心算法提供了一个简单、漂亮的方法使得尽可 能多的活动能兼容地使用公共资源。 能多的活动能兼容地使用公共资源。
12
4.1 活动安排问题
算法GreedySelector的效率极高。 算法GreedySelector的效率极高。当输入 GreedySelector的效率极高 的活动已按结束时间的非减序排列时, 的活动已按结束时间的非减序排列时,算法 只需O(n)的时间安排n个活动, O(n)的时间安排 只需O(n)的时间安排n个活动,使最多的活 动能相容地使用公共资源。 动能相容地使用公共资源。 如果所给出的活动未按非减序排列, 如果所给出的活动未按非减序排列,可以 O(nlogn)的时间重排 的时间重排。 用O(nlogn)的时间重排。