贪心法(The Greedy Method)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
20-25美分之间:选2个10美分最好. 25-30美分之间选一个25最好; 30美分:一个25加一个5美分等等.
硬币面值之间有倍数关系;否则没解:例如,面值14,12,5 和1;
则17=12+5,用2枚硬币,而贪心法为14加3个1,共4枚硬币.
例13.5 [机器调度]
现有n 个任务和足够多台处理这些任务的机器。
∑w x ≤ c
i=1 i=1 n i i
n
∑x
i =1
i
n
max∑ xi
i =1
例13.3 [最小成本通信网络]
城市之间的通信网络应是以这些城市为顶点的 连通图,图的每条边代表一条通信线路.给每条 边赋予一个权值,等于建设这条通信线路所要 花费的成本,最小成本通信网络问题就是找这 样一个连通图,其总成本最小. , . 设所有的权值都非负,则最小成本通信网络问 题的可行解可限制为连接这些城市的生成树, 而最优解是其中具有最小成本的生成树.
例13.1[Thirsty Baby]
有一个聪明的婴儿,她可能得到的饮料包括一 桶水、一桶牛奶、多罐不同种类的果汁、许多 不同的装在瓶子或罐子中的苏打水。假定婴儿 可得到n 种不同的饮料。根据以前关于这n 种 饮料的不同体验,婴儿知道其中那些饮料更合 自己的胃口。因此,婴儿为每一种饮料赋予一 个满意度值si:饮用1盎司第i 种饮料,满意 度s i 。 设第i种饮料有ai盎司,婴儿共需喝t盎司饮料
一艘船准备用来装载货物,所有货物都放在集 装箱中。设第i 个集装箱的重量为wi (1≤i≤n),船的最大载重量为c,试设计一 装载方法使得装入的集装箱数目最多。
例13.2 [Loading Problem]
用n维布尔向量代表一种 装箱方案 约束条件 目标函数 极大化目标函数
( x 1 , ⋯ , x n ) x i ∈ { 0 ,1}
实现问题:
使用min-堆存放每台旧机器的可用时间,即此时间以 后可安排新任务 算法的时间复杂度为Θ(nlogn)
例题13.6(最短路算法)
选择“最近”的且不在路径上的下一节点 贪心解不是优化解:
13.3应用
货箱装船问题(Container Loading) 背包问题(Knapsack Problem) 拓扑排序问题(Topological Sorting ) 最短路径问题(Shortest Path) 最小代价生成树(Minimum Spanning Tree)
k=0,1时获得的最优解为[1,0,0,1],获得的价值为19 。
n=4, c=11,w=[2,4,6,7], p=[6,10,12,13]
例13.9(续2)
若k=2,除了考虑k<2的子集,还必需考虑子 集{1,2} , {1,3} , {1,4} , {2,3} , {2,4}和{3,4}。
对于{1,2} ,可行解为[1,1,0,0] ,最优值为16 对于{1,3} ,可行解为[ 1,0,1,0],最优值为18 对于{1,4} ,可行解为[ 1,0,0,1],最优值为19 对于{2,3} ,可行解为[ 0,1,1,0],最优值为22 对于{2,4} ,可行解为[ 1,0,0,1],最优值为23 {3,4}是不可行的
2-优化解即为[0,1,0,1],值为23
n=4, c=11,w=[2,4,6,7], p=[6,10,12,13]
例13.9结论
k-优化方法(k>0)得到的解误差不超过 优化方法( 优化方法 得到的解误差不超过 (100/(k+1))% % 以内,即如优化值为 当k=1时,为50%以内 即如优化值为 时为 以内 即如优化值为100,贪心法 贪心法 算出的值不低于50;当 以内. 算出的值不低于 当k=2时,为33.33%以内 时为 以内 算法的时间复杂度随k 的增大而增加,需要测试 算法的时间复杂度随 的增大而增加 需要测试 的子集数目为O(nk ),每一个子集所需时间为 的子集数目为 每一个子集所需时间为 O(n),因此当 >0时总的时间开销为 因此当k 时总的时间开销为 时总的时间开销为O(nk+1 )。 因此当
(续)
贪心策略2:从尚未装入的物品中选择重量最 小的物品。
虽然这一贪心法对于上述例子能产生最优解,但在 一般情况下不一定能得到最优解 n=2,c=25,w=[10,20],p=[5,100]
贪心策略3:按密度pi/wi,从剩余物品中选择 可装入背包的密度值最大的物品,这种策略也 不能保证得到最优解:
当k=0时,同于前述源自文库密度贪心法。因此解为 x=[1,1,0,0],效益值为16。
例13.9(续1)
k =1时。初始子集为{1} , {2} , {3} , {4}。
子集{1} , {2}产生与k=0时相同的结果:x=[1,1,0,0],效益 值为16。 考虑子集{3},置x3 为1。此时还剩5个单位的容量,按价值 密度非递增顺序来考虑如何利用这5个单位的容量。首先考 虑物品1,它适合,因此取x1为1,这时仅剩下3个单位容量 了,且剩余物品没有能够加入背包中的物品。通过子集{3}开 始求解得结果为x=[1,0,1,0],获得的价值为18。 若从子集{4}开始,产生的解为x=[1,0,0,1],获得的价值为19。
(续)
贪心法往往不能得到精确解,贪心解与最优解 的误差用以下比值的百分比来度量: (优化值-贪心解值)/优化值 n=2,c=y, w=[1,y],p=[10,9y]
贪心解值=10; 当y>10/9时,优化值=9y.
误差为(9y-10)/9y. 对任意大的y误差可近似达到百分之百.
例13.9 k-优化算法
每个任务的开始时间为si,完成时间为fi( si<fi ) [si,fi] 为处理任务i 的时间区间。 两个任务i,j 重叠是指两个任务的时间区间有重叠。例如: 区间[1,4]与区间[2,5]重叠,而与区间[4,7]不重叠。
可行的任务分配
分配中不会将重叠的任务分配给同一台机器。 每台机器在任何时刻最多只处理一个任务。
最优分配指占用机器数最少的可行分配。
图13-1 任务及三台机器的调度 a) 7个任务 b)调度
例13.5(续)
贪心算法:
步骤:按任务起始时间排序并安排任务 贪心准则:尽可能使用旧机器,即以前使用过的机 器
上述贪心法产生优化解,因为:
任何可行解使用的机器数不少于最大重迭任务数 贪心解使用的机器数不超过最大重迭任务数
例13.1[Thirsty Baby]
设xi 为第i种饮料的饮用 量,假定满意程度是可 加的,则最满意的选择 是极大化 该优化问题可表示如下
n
n

i =1
si xi
约束条件 目标函数

i =1
xi = t
0 ≤ xi ≤ ai
n
f ( xi …, xn ) = ∑si xi
i =1
例13.2[loading Problem]
n=3,c=30,w=[20,15,15],p=[40,25,25]
贪心解为[1,0,0],但优化解为[0,1,1]
(续)
密度贪心法的伪代码: (1)将物品按密度从大到小排序 (2)for (i=1;i<n;i++) if (物品i 可装入到背包内) xi=1(装入) else xi=0(舍弃); 例如:c=11,w=(2,4,6,5),p=(6,10,12,9) x=(1,1,0,1).恰是优化解 算法的时间复杂度为O(nlogn)
上述贪心法产生的解是优化解:
优化解(y1,…,yn)可经有限次替换得到贪心解,而且每 次替换箱子数不变. 如该优化解不会箱子1,将其替换其中一个箱子,仍是 优化解.(必须替换,否则不是优化解)反复替换将得到 一个优化解,它就是贪心法得到的解.
13.2.2 0/1背包问题
0/1背包问题:设有容量c的背包,和n件物品, 物品i的重量为wi,假定装入物品i获得的效益 值为pi,试给出一装入物品的方法,使得获得的 总效益值最大。 集装箱装载问题是0/1背包问题的特例。 0/1背包问题是NP-难度问题。所以贪心法产 生的解是近似解。
基本要素
贪心选择性质:所求问题的整体最优解可以通过一系列局部 最优选择(贪心选择)来达到 最优子结构性质:问题的最优解包含其子问题的最优解
例13.4[找零钱]
一个小孩买了价值少于1美元的糖,并将1美元的钱放 入取款机。取款机要用数目最少的硬币将零钱找给小 孩。假设取款机内有任意多的面值为25美分、10美分、 5美分、及1美分的硬币。 贪心策略为:每次给出不超过应找钱数的面值最大的 硬币。 贪心策略得到优化解:
13.3.1 Container loading
问题
目标函数:装载的集装箱数目 极大化目标函数
贪心策略
船可以分步装载,每步装一个集装箱,且需要考虑 装载哪一个集装箱。 贪心标准:在剩下的集装箱中选择有最小重量的集 装箱
实现
算法首先按重量对物品排序 按贪心策略装箱
程序13.1
程序13.1(续)
定理13.1
13.2 贪心法
贪心法指每步(stage)按所谓的“贪心标准(策略)”选择 (元组的)一个分量,逐步构造出问题解的方法。 贪心法的主要特点是:
分阶段完成:按一定的步骤,每步决定一个分量(自顶向下 自顶向下) 自顶向下 不回溯:选定一个分量后,不重试其它可能 贪心标准:指每次选择一个分量时使用的“优化”策略。所 选策略可能导致优化解,但更多情形是得到近似解,特别是 对NP-难度问题。不同的人可能有不同的“优化”策略。 常常采纳使目标函数有最大增量的策略为贪心策略。
例13.3 [最小成本通讯网络]
n-1 条边的元组 约束条件:这些边构成生成树 目标函数:边权之和 原则上所有上述问题需在很大的范围内搜索 优化解;但这常常导致指数复杂度的算法; 优化解;但这常常导致指数复杂度的算法; 是计算上不可接受的。 是计算上不可接受的。贪心法退而求其次求 所谓的“次优” 所谓的“次优”解。
贪心策略1:从未装入的物品中,选出效益值最 大的物品装入
利用这种规则,效益值最大的物品首先被装入(假设 有足够容量),然后是下一个效益值最大的物品,如 此继续下去。 这种策略不能保证得到最优解 n=3,c=105,w=[100,10,10],p=[20,15,15] 贪心解为:[1,0,0],效益值为:20 优化解为:[0,1,1],效益值为30
13.2.2 0/1背包问题
可行解元组表示
背包中, xi =0 表示物品i 不装 入背包。
xi ∈{0,1}(1 ≤ i ≤ n)
xi = 1表示物品i 装入
问题
目标函数:装入物品效 益值 约束条件:
n
∑p x
i =1 n i =1 i
i i
∑w x
i
≤c
求解:极大化目标函 数,计算xi的值
0/1背包问题
贪心法(The Greedy Method)
宫秀军 天津大学计算机科学与技术学院 gongxj@tju.edu.cn http://ibm.tju.edu.cn/~gongxj/course/algorithm
提纲
最优化问题(Optimization problem) 贪心算法基本原理(The principle of greedy method) 贪心算法应用
k-优化算法是上述密度贪心算法的改进,改进 后其误差可控值在100/(k+1)%之内. k-优化算法:
预先将不超过k种物品的子集装入背包,对其余物 品用密度贪心法。 对所有k物品子集执行上述过程,并从中找到有最 大效益值的解。
考虑n=4, w=[2,4,6,7], p=[6,10,12,13], c=11。k=2:
问题的解可表示为一复杂的结构, ( x1 , x2 ,⋯ , xn ) xi ∈ si 例如元组形式 约束条件(结构性的约束条件 B ( x1 ,…, xn )
使约束条件为true的元组称为可 行解(feasible solution)
目标函数
f ( xi … , x n )
优化解即指使目标函数极大化(或 极小化)的可行解,对应的目标函 数值称为优化值。 很多优化问题是NP-难度问题, 迄今找不到它们的多项式算法。 所以计算上可行的方法就是求其 近似解。贪心法是求近似算法的 主要途径之一。
货箱装船问题(Container Loading) 背包问题(Knapsack Problem) 拓扑排序问题(Topological Sorting ) 最短路径问题(Shortest Path) 最小代价生成树(Minimum Spanning Tree)
本章小结
13.1优化问题
一个优化问题可以描述如下:
相关文档
最新文档