算法第四章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Chapter
4
4.1.2 贪心算法的基本要素
一个贪心算法求解的问题必须具备以下两要素:
• 1.
贪心选择性质----证明方法(数学归纳法)
所谓贪心选择性质是指所求问题的整体最优
解可以通过一系列局部最优的选择,即贪心选择
来达到(只要贪心选择策略合理)。这是贪心算
法可行的第一个基本要素,也是贪心算法与动态
Chapter
4
4.1.5 贪心算法的例子---部分背包问题
例4-1:n=3,M=20,p=(25,24,15),w= (18,15,10)。 假设物品可分,故有可行解无数个,其中的四个可行解表所示。 表4-2 部分背包问题的四个可行解 (x0,x1,x2) ① ② ③ ④ (1/2,1/3,1/4) (1,2/15, 0) (0,2/3, 1) (0,1, 1/2) ∑w i xi 16.5 20 20 20 ∑pi xi 24.25 28.2 31 31.5
算法
设计与分析
算法设计与分析
第四章 贪心算法
主编 耿国华
Chapter
4
本章内容
4.1 贪心算法基础
• 4.1.1 • 4.1.2 • 4.1.3 • 4.1.4 • 4.1.5
贪心算法的基本思想
贪心算法的基本要素 贪心算法适合的问题 贪心算法的基本步骤 贪心算法实例——背包问题
4.2 汽车加油问题
Chapter
4
引言
上述找硬币的算法利用了硬币面值的特殊性.
如果硬币的面值改为一分,五分,一角一分3种,要找给顾客
的是一角五分钱.还用贪心算法,我们将找给顾客1个一角 一分的硬币和4个一分的硬币,然而3个5分的硬币显然是 最好的找法。由此可见贪心算法并不是总能得到最优解。
Chapter
4
4.1 贪心算法基础
此方法解非最优解。原因:只考虑当前收益最 大,而背包可用容量消耗过快.
Chapter
4
4.1.5 贪心算法的例子
• (2)选重量作为量度,使背包容量尽可能慢地被消耗.
按物品重量从小到大排序:2,1,0; 解为: 收益: (x0,x1,x2)=(0, 2/3, 1) 15+24*2/3=31
此方法解非最优解。原因:虽然容量消耗慢,但效 益没有很快的增加.
4.3 最优服务次序问题
4.4 区间相交问题
Chapter
4
引言
假设有四种硬币,它们的面值分别为二角、一角、五分 和一分。现在要找给某顾客五角三分钱,并且要找硬币数目 个数最少, 通过上章学习,我们可以用动态规划算法列出所有解, 然后找出其中硬币数目最少的解。我们也可以用一种更为简 便的贪心算法来求解问题。这种找硬币方法与其他的找法相 比,方法简便,效率高。我们会拿出 2个二角的硬币, 1个一 角的硬币和3个一分的硬币交给顾客。选择硬币时所采用的贪 心算法如下:为使找回的零钱的硬币数最小,从最大面值的 币种开始,按递减的顺序考虑各币种,先尽量用大面值的币 种,只当大面值币种的金额不足才会去考虑下一种较小面值 的币种。每一次都选择可选的面值最大的硬币。为确保解法 的可行性(即:所给的零钱等于要找的零钱数),所选择的 硬币不应使零钱总数超过最终所需的数目。
包问题的最优量度标准。
Chapter
4
4.1.5 贪心算法的例子 ——贪心选择性质
1)贪心选择性质
贪心选择性质是指所求问题的整体最优解可
以通过一系列局部最优的选择,即贪心选择来达
到(只要贪心选择策略合理)。
使用数学归纳法证明。
Chapter
4
4.1.5 贪心算法的例子 ——最优子结构性质
• 2)最优子结构性质
规划算法的主要区别。
Chapter
4
4.1.2 贪心算法的基本要素
•
在动态规划算法中,每步所作的选择往往依赖于相关子问 题的解。因而只有在解出相关子问题后,才能作出选择。而在 贪心算法中,仅在当前状态下作出最好选择,即局部最优选择。 然后再去解作出这个选择后产生的相应的子问题。贪心算法所
作的贪心选择可以依赖于以往所作过的选择,但决不依赖于将
Chapter
4
4.1.2 贪心算法的基本要素
贪心算法通过一系列的选择来得到一个问题的解。它所 作的每一个选择都是当前状态下某种意义的最好选择,即贪
心选择。希望通过每次所作的贪心选择导致最终结果是问题
的一个最优解。
•
对于一个具体的问题,我们怎么知道是否可用贪心算法来 解此问题,以及能否得到问题的一个最优解呢? 从许多可以 用贪心算法求解的问题中我们看到它们一般具有两个重要的 性质:贪心选择性质和最优子结构性质。
来所作的选择,也不依赖于子问题的解。正是由于这种差别, 动态规划算法通常以自底向上的方式解各子问题,而贪心算法 则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选 择,每作一次贪心选择就将所求问题简化为一个规模更小的子
问题。
Chapter
4
4.1.2 贪心算法的基本要素
表4-1 动态规划算法和贪心算法的区别
贪心选择物体1之后,问题转化为背包重量 为m-w1*x1,物体集为{物体2,物体3,…,物体n} 的背包问题。且该问题的最优解包含在初始问 题的最优解中(反证法证明)。 • 对于0/1背包问题,使用贪心法,并不一定 能求得最优解,因此,贪心法不能用来求解0/1 背包问题。
Chapter
4
4.1.5 贪心算法的例子
例4-2 n=3,M=25,p=(32,24,15),w= (16,15,10). 则p/w=(2,1.6,1.5)。选利润/重量为量度, 取最大值得到解:X=(0) ∑p=32, 背包剩余重量 C = M- w(0)=9. 不能放下任何物品, 显然: X=(0)不是最优解。最优解是(1,2),利润 为39。
贪心算法求最优解的一般过程
Greedy(C) //C是问题的输入集合即候选集合 { S={ }; //s是解集合,初始解集合为空集 while (not solution(S)) //解集合S没有构成问题的一个解 { x=select(C); //在候选集合C中做贪心选择 if feasible(S, x) // feasible为可行函数,判断集合S 中加入x后的解是否可行 S=S+{x}; //可行则加入到解集合中 C=C-{x}; //否则,将其从候选集合中排除; } return S; }
•
步骤:
(1) 选定合适的贪心选择的标准;
(2) 证明在此标准下该问题具有贪心选择性质(所求问 题的整体最优解可以通过一系列局部最优的选择,即 贪心选择来达到); (3) 证明该问题具有最优子结构性质; (4) 根据贪心选择的标准,写出贪心选择的算法,求 得最优解。
Chapter
4
4.1.4 贪心算法的基本步骤
优解的选择,局部最优选择(贪心选择)产生全局最
优解
Chapter
4
贪心算法的基本要素
一个贪心算法求解的问题必须具备以下两要素:
• 1.
贪心选择性质
所谓贪心选择性质是指所求问题的整体最优
解可以通过一系列局部最优的选择,即贪心选择
来达到(只要贪心选择策略合理)每做一次贪心
选择,既可以得到最优解的一部分。
• 算法4.1
Chapter
4
回顾:贪心算法的基本思想
贪心算法通过一系列的选择来得到一个问题的解。 它所作的每一个选择都是当前状态下某种意义的最好 选择,即贪心选择。希望通过每次所作的贪心选择导 致最终结果是问题的一个最优解。
其核心是根据题意选取一种量度标准(选择标
准),通过这个度量标准做一次次的能够产生局部最
基本思想 依赖子问 解问题的方 最优解 复杂程度 题的解 向 否 自顶向下 局部最 简单有效 优
整体最 较复杂 优
贪心选 贪心选择 择
动态规 递归定义 划 填表
是
自底向上
Chapter
4
4.1.2 贪心算法的基本要素
2、最优子结构性质-----反证法 当一个问题的最优解包含其子问题的最优解时, 称此问题具有最优子结构性质。 由于运用贪心策 略,保证了每一次选择是当前问题的最优解。问题 的最优子结构性质是该问题可用贪心算法或动态规 划算法求解的关键特征。
Chapter
ຫໍສະໝຸດ Baidu
4
4.1.1 贪心算法的基本思想
•
用贪婪法设计算法的特点是一步一步地进行,常 以当前情况(最原始的问题)为基础(开始),根据 某个优化测度作最优选择,而不考虑各种可能的整体 情况,它省去了为找最优解要穷尽所有可能而必须耗 费的大量时间,它采用自顶向下,以迭代的方法做出 相继的贪心选择,每做一次贪心选择就将所求问题简 化为一个规模更小的子问题,通过每一步贪心选择, 可得到当前子问题的一个最优解,虽然每一步上都要 保证能获得局部最优解,但由此产生的全局解有时不 一定是最优的,所以贪婪法不要回溯。
4.1.1 贪心算法的基本思想
4.1.2 贪心算法的基本要素
4.1.3 贪心算法适合的问题 4.1.4 贪心算法的基本步骤
4.1.5 贪心算法实例——背包问题
Chapter
4
4.1.1 贪心算法的基本思想
• 贪心算法
贪心算法(又称贪婪算法)是指,在对问题 求解时,总是做出在当前看来是最好的选择 。也就是说,不从整体最优上加以考虑,它 所做出的仅是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最 优解,但对范围相当广泛的许多问题他能产 生整体最优解或者是整体最优解的近似解。
Chapter
4
4.1.3 贪心算法适合的问题
贪心算法通常用来解决具有最大值或最小值
的优化问题。它是从某一个初始状态出发,根据
当前局部而非全局的最优决策,以满足约束方程
为条件,以使得目标函数的值增加最快或最慢为
准则,选择一个最快地达到要求的输入元素,以
便尽快地构成问题的可行解。
Chapter
4
4.1.4 贪心算法的基本步骤
Chapter
4
4.1.1 贪心算法的基本思想
•
贪婪算法实际上是一种改进了的分级处理方法。 其核心是根据题意选取一种量度标准(选择标准) 。然后将这多个输入(可选的解)排成这种量度标 准所要求的顺序,按这种顺序一次输入一个量。如 果这个输入和当前已构成在这种量度意义下的部分 最佳解(已经做过的那些贪心选择)合在一起不能 产生一个可行解,则不把此输入加到这部分解中, 再按照顺序考虑下一个可选输入。这种能够得到某 种量度意义下最优解的分级处理方法称为贪婪算法 。
Chapter
4
4.1.5 贪心算法的例子
• (3)选效益/重量为量度,使每一次装入的物品应使
它占用的每一单位容量获得当前最大的单位效益。 按物品的pi/wi重量从大到小排序:1,2,0; 解为: (x0,x1,x2)=(0, 1, 1/2)
收益:
24+15/2=31.5
此方法解为最优解。可见,可以把pi/wi 作为背
Chapter
4
4.1.5 贪心算法的例子 ——设计与实现
用贪心算法求解部分背包问题 void GreedyKnapsack(float *p, float *w, float M, int n, float* x) { //前臵条件:w[i]已按p[i]/w[i]的非增次序排列 float u=M; //u为背包剩余载重量,初始时为m for (int i=0; i<n; i++) x[i]=0; //对解向量x初始化 for (i=0; i<n; i++) //按最优量度标准选择解的分量 { if (w[i]>u) break; // 退出本次循环,即不全装入第i件物品 x[i]=1.0; u=uw[i]; //该物品整体放入背包,更新背包容量 } if (i<n) x[i]=u/w[i]; //物品部分装入背包,刚好是的背包装满; return; }
Chapter
4
4.1.1 贪心算法的基本思想
•
但是,在实际生活中,对于一个给定的问题,往 往可能有好几种量度标准。初看起来,这些量度标准 似乎都是可取的,但实际上,用其中的大多数量度标 准作贪婪处理所得到该量度意义下的最优解并不是问
题的最优解,而是次优解。因此,选择能产生问题最
优解的最优量度标准是使用贪婪算法的核心。
在这四个可行解中,第④个解的效益值最大。但这个 解是否是背包问题的最优解,尚无法确定,但有一点是可以 肯定的,即对于部分背包问题,其最优解显然必须装满背包。
Chapter
4
4.1.5 贪心算法的例子
• (1)”效益”优先。使每装入一件物品就使背包获
得最大可能的效益值增量. 按物品收益从大到小排序0,1,2 解为: 收益: (x0,x1,x2)=(1, 2/15, 0) 25+24*2/15=28.2