算法设计与分析 第4章

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

– 贪心:每个阶段产生的都是局部最优解
• 第i阶段的“局部”:问题空间为按照贪心策略中的优先级排 好序的第i个输入ai ith • 第i阶段的“局部最优解”: ai
ith a1 , … , ai , ai+1, … , an
a1

ai
, ai+1, … , an
sorted
贪心算法 vs. 动态规划
价值贪心策略:优先选择价值最大的物品。
• • 如果所选择的物品重量很大,使得背包载重的消耗速度太快 不能保证目标函数的值快速增加
重量贪心策略:优先选择重量最小的物品。 价值重量比策略:将物品按单位重量价值降序排序, 从第一项开始装背包,然后是第二项,依次类推,尽 可能的多放,直到装满背包。
• 优先选择既使目标函数的值增加最快,又使背包载重的消耗 较慢的物品
• 设E={e1,e2…en}是按结束时间排序的活动集合,则 e1具有最早的结束时间。 • 证明:每次选择结束时间最早的活动能够得到整 体最优解,即该问题具有贪心选择性质。
– 首先,证明该问题有一个最优解以贪心选择开始,即 该最优解中包含e1。
• 设A是所给活动安排问题的一个最优解,且A中活动也按结束时 间非减序排列,A中的第一个活动是ek。 • 若k=1,则A就是一个以贪心选择开始的最优解。 • 若k>1,则我们设B=A-{ek}∪{e1}。由于f1≤fk,且A中活动是互为 相容的,故B中的活动也是互为相容的。又由于B中活动个数与 A中活动个数相同,且A是最优的,故B也是最优的(最大相容 子集合)。
最优装载
• 有一批集装箱要装上一艘载重为c的轮船。 其中集装箱i的重量为wi。最优装载问题要 求确定,在装载体积不受限制的情况下, 应如何装载才能将尽可能多的集装箱装上 轮船。 • 形式化描述为: xi ∈ {0,1}, 1 ≤ i ≤ n 解向量
max ∑ xi
i =1 n
目标函数 约束条件
∑w x
设u为最近加入S的顶点,L(w)表示当前发现的从v0到w的最短距 离,c(u,w)表示u到w的边的长度,则L(w)需要依照以下公式更新: L(w)=min(L(w), L(u)+c(u,w)) S v0 v0, v1 v0,v1,v2 v0,v1,v2,v4 v0,v1,v2,v4,v3 u v1 v2 v4 v3 L(v1) 10 10 10 10 10 L(v2) 30 25 25 25 25 L(v3) L(v4)
各活动的起始时间 和结束时间存储于 数组s和f中且按结束 时间的非减序排列
例题
设待安排的11个活动按结束时间的非减序排列如下:
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
8 8
9 8
10 11 2 12
10 11 12 13 14
• 算法分析
– 算法的效率很高。当输入的活动已按结束时间 非减序排列时,算法只需O(n)的时间安排n个活 动,使最多的活动能相容地使用公共资源。如 果所给出的活动未按非减序排列,可以用 O(nlogn)的时间预排序(pre-sorting)。
GreedySelector(n, s[], f[], A[]) A[1] = true //最优解以e1开始 j = 1 //标记新加入的活动 for i = 2 to n do //扫描剩余活动 if s[i] ≥ f[j] //是否可行 若活动i的开始时间 小于新加入的活动j A[i] = true 的结束时间,则不选 择活动i,否则选择 j = i //更新 新加入的活动 活动i加入集合A中 else A[i] = false //扫描下一个活动
i =1
n
i i
≤c
• 贪心选择策略
– 重量最轻者先装
• 证明采用重量最轻者先装能够得到整体最优解,即 该问题具有贪心选择性质。
– 设集装箱已按其重量从小到大排序,且(x1,x2,…,xn)是最优 装载问题的一个最优解。
设k = min{i | xi = 1}
1≤i ≤ n
x1 0
– 当k=1时,(x1,x2,…,xn)是一个满足贪心选择性质的最优解 – 当k>1时 yi=xi y1 yi=xi yk xk … All 0 1 … 1 … All 0 0 …
• 在动态规划算法中,每步所做的选择往往依赖于 相关子问题的解,因而只有在解出相关子问题后, 才能做出选择。
根据子问题的解进行选择
Leabharlann Baidu
• 而在贪心算法中,仅在当前状态下做出最好选择, 即局部最优选择,然后再去解做出这个选择后产 生的相应的子问题。
先选择,再得到子问题的解
动态规划的解题框架
贪心算法的解题框架
贪心选择性质
• 对于一个具体问题,要确定它是否具有贪心选择 性质,我们必须证明每一步所做的贪心选择最终 导致问题的一个整体最优解。
– 数学归纳法 • 证明最优解以贪心选择开始(即第一步)。首先考 察问题的一个整体最优解,并证明可修改这个最优 解,使其以贪心选择开始。 • 假设第i步贪心选择能够得到整体最优解,那么证明 第i+1步贪心选择也能得到整体最优解。
活动安排问题
• 要求高效地安排一系列争用某一公共资源(例如 会议室)的活动(使尽可能多的活动能兼容使用 公共资源)。
– 设有n个活动的集合E={e1,e2…en},其中每个活动都要求 使用同一资源,而在同一时间内只有一个活动能使用 这一资源。每个活动i都有一个要求使用该资源的起始 时间si和一个结束时间fi,且si<fi。如果选择了活动i,则 它在半开时间区间[si,fi)内占用资源。 – 若区间[si,fi)与区间[sj,fj)不相交,则称ei和ej是相容的。 也就是说,当si≥fj或sj≥fi时,活动i和活动j相容。 • 活动安排问题就是要在所给的活动集合中选出最大的相容 活动子集合。
A(1) A(2) … A(n)
贪心选择策略下的部分最优解
贪心算法的基本思想
• 贪心算法的特点是每个阶段所作的选择都是局部 最优的,它期望通过所作的局部最优选择产生出 一个全局最优解。
– 动态规划:每个阶段产生的都是全局最优解
• 第i阶段的“全局”: 问题空间为(a1, … , ai) • 第i阶段的“全局最优解”:问题空间为 (a1, … , ai)时的最优解
贪心算法的基本思路
• 根据题意,选取一种贪心选择策略,然后按这种策略对n 个输入排序,按顺序一次输入一个值。如果这个输入和当 前已构成的部分最优解加在一起不能产生一个可行解,则 不把此输入加到这部分解中。
贪心选择策略 原 问 题 的 n 个 输 入 排 序 后 的 n 个 输 入 A’(j) A’(1) A’(2) … A’(n) S(1) S(2) …
20
– 每次从V-S中选择具有最短特殊路径长度的顶点 u,从而确定从源到u的最短路径长度。
v0 10 v1
30 15 20
v2 10 v3
4 v4 10
初始,S={v0}。 v0的相邻顶点为v1和v2,L(v1)=10, L(v2)=30, 所以v1是v0的最近顶点,S={v0,v1}。 下一步,只有v2和v3与S相邻。 L(v2)=min{L(v2), L(v1)+c[v1,v2]} =min{30, 10+15} =25
v0 10 v1 30 15 20 v2 10 v3 10 4 v4
应用:OSPF(Open Shortest Path First)IP 路由协议,通过该算法可以得到有关网 络节点的最短路径树,然后由最短路径 优先树得到路由表。
• Dijkstra’s algorithm
– It is a graph search algorithm that solves the single-source shortest path problem for a graph with non-negative edge path costs, producing a shortest path tree. – Shortest paths from v0 to all of the other vertices are found one by one. 30 15 20
• 因此,最优装载问题具有贪心选择性质和 最优子结构性质,采用“重量最轻者先装” 的贪心选择策略能够得到整体最优解。
单源最短路径 (The single-source shortest path)
• 给定一个带权(weight)有向图G=(V,E),每条边的权 是一个非负实数。另外,还给定V中的一个顶点, 称为源。我们要计算从源到所有其他顶点的最短 路径长度。这里路的长度是指路上各边权之和。

30 30 30 30
∞ ∞
贪心算法的基本要素
• 贪心选择性质:所求问题的全局最优解可 以通过一系列局部最优的选择(即贪心选 择)来达到。
– 这是贪心算法与动态规划算法的主要区别。
• 最优子结构性质:当原问题的最优解包含 子问题的最优解时,称此问题具有最优子 结构性质。
– 最优子结构性质是该问题可用动态规划算法或 贪心算法求解的关键特征。
• knapsack_greedy算法:选择物品单位重量的价值 (价值重量比)作为物品装入的优先级
Θ(n) 1. 计算每种物品单位重量的价值vi/wi 2. 将尽可能多的单位重量价值最高的物品装入背包 3. 若将这种物品全部装入背包后,背包内物品的总重量 未超过背包的载重M,则选择单位重量价值次高的物品 并尽可能多地装入 Knapsack_greedy(n, M, v[], w[], x[]) Θ(nlogn) Sort(n,v,w) for i = 1 to n do x[i] = 0 c=M for i = 1 to n do Θ(n) if w[i] > c break x[i] = 1 c = c - w[i] if i ≤ n x[i] = c/w[i]
– 因此,(y1,y2,…,yn)是一个满足贪心选择性质的最优解。
• 证明原问题的最优解包含了子问题的最优 解,即该问题具有最优子结构性质。
– 设(x1,x2,…,xn)是最优装载问题的一个满足贪心选 择性质的最优解,则x1=1,(x2,…,xn)是轮船载重 为c-w1且待装船集装箱为{2,3,…,n}时相应最优装 载问题的一个最优解。
– 然后,假设第i步贪心选择能够得到整体最优解,那么 证明第i+1步贪心选择也能得到整体最优解。
• 证明:原问题的最优解包含子问题的最优解,即 该问题具有最优子结构性质。
– 在贪心选择了e1后,原问题就简化为对E中所有与e1相 容的活动进行活动安排的子问题。即若A是原问题的一 个最优解,则A’=A-{e1}是活动安排问题E’={i∈E: si≥f1}的 一个最优解。 – 如若不然,假设我们找到E’的一个解B’,它包含比A’更 多的活动,则将e1加入到B’中将产生E的一个解B,它包 含比A更多的活动。这与A的最优性矛盾。
v0 10 v1
v2 10 v3
4 v4 10
v0 10 v1 15 20
v2
4 v4
v3
v0 10
30 15
v2 10 v3
4 v4 10
• 贪心选择策略
v1
– 设置一个顶点集合S并不断地作贪心选择来扩充 这个集合。一个顶点属于集合S当且仅当从源到 该顶点的最短路径长度已知。
• 设u是G的某一个顶点,我们把从源到u且中间只经 过S中顶点的路称为从源到u的特殊路径。
• 贪心选择策略
– – – – – 选择具有最早开始时间的活动? 选择具有最早结束时间的活动? 选择具有最少占用时间的活动? 选择覆盖未选择活动最少的活动? ……
• 直观上,每次选择具有最早结束时间的相容活动,使剩余 的可安排时间段极大化,以便安排尽可能多的相容活动。 • 对于活动安排问题,每次选择具有最早结束时间的活动能 够得到整体最优解,即它最终所确定的相容活动集合A的 规模最大。
第四章 贪心算法
(Greedy)
背包问题
• 在选择物品i装入背包时,可以选择物品i的 一部分,而不一定要全部装入。
约束条件
∑w x
i =1
n
i i
=c
n
装满背包
目标函数 解向量
d = max ∑ vi xi
i =1
X = {x1 , x2 ,..., xn }
Xi ∈[0,1]

– – –
如何选择物品装入的优先级(贪心策略)?
相关文档
最新文档