四、贪心算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
易 见 F1(y)=G1(y). 不 难 验 证 x2 的 值 越 大 则 F2(y) 的 值 就 越 小 , 从 而 有 F2(y)=G2(y).下面定理给出了当 k>2 时贪心法是否得到最优解的条件,可以用这 个条件判断对哪些输入贪心法能够得到最优解。 定理 2 假定 Gk(y) = Fk (y), v k+1 > vk 且 v k+1 = p vk-δ, 0 ≤ δ < vk, p∈ Z+, 则以 下命题等价.
贪心法 组合优化 多步判断 优化原则 有贪心选择性质下得到最优解 否则为近似解 贪心选择性质的证明 先选择然后构成子问题 自顶向下 无特殊要求 不高 不高
2.贪心算法的正确性证明 不是所有优化问题都具有贪心选择性质,证明贪心选择性质的方法---数学 归纳法,可以对算法步数或问题规模进行归纳。 例 2 部分装入背包问题 (Fractional Knapsack Problem) 一个旅行者准备随身携带一个背包. 可以放入背包的物品有 n 个, 每个物品 的重量和价值分别为 wj, vj. j=1, 2, …, n, 旅行者可以选择物品 i 的全部,也可以 0≤xi≤1。 如果背包的最大重量限制是 c, 怎样选择放入背包 选择物品 i 的 xi 部分, 的物品以使得背包的价值最大? 输入:c>0, wi>0, vi>0, i=1,…n.
装载问题是 0-1 背包问题的特例,即 vi=1, i=1, 2, …,n. 该问题是 O(nlogn)时 间可解的,但 0-1 背包问题是 NP 难(NP-hard)的。 3.对于得不到最优解的贪心法的分析工作 讨论对于哪些输入贪心选择能够得到最优解---例 4 讨论贪心法的解最坏情况下与最优解的误差---例 5 例 4 找零钱问题 设有 n 种零钱, 其重量分别为 w1, w2, ... , wn, 价值分别为 v1=1, v2, ... , vn. 若要付的总钱数是 y, 如何付钱使得所付钱的总重最轻? min ∑ wi xi
i =1 n n
∑v x
i =1 i
i
=y
xi ∈ N 实际上是整数规划问题, 使用动态规划算法可以求得最优解。Greedy 算法如下: 为了描述的方便, 假设
w w1 w2 ≥ ≥ ... ≥ n v1 v2 vn
在使用前 k 种零钱总钱数为 y 时求得最优解的算法的总重为 Fk(y), 贪心法的总重 为 Gk(y),则有如下递推方程。 动态规划算法
i =1 n
∑w x
i =1 i
n
i
≤c
xi = 0,1, i = 1,2,..., n 例 3 最优装载 n 个集装箱 1, 2, …, n 装上轮船, 集装箱 i 的重量 wi, 轮船装载重量限制为 c, 无体积限制。问如何装使得上船的集装箱最多?不妨设 wi≤c. max ∑ xi
i =1 n
2.3 贪心法 (Greedy Approach) 一、基本思想 适用问题:组合优化问题,适合优化原则。 设计方法:多步判断。在每步判断时在满足约束条件的情况下根据某个局部 的优化测度(可能是目标函数,也可能不是)考虑部分解中一个变量的选择。 使用贪心法要解决的问题: 是否可以得到最优解? 不能得到最优解, 解与 最优解的误差估计。 例 1 活动选择问题 活 S ={1, 2, …, n}为 n 项活动的集合。 si, fi 分别为活动 i 的开始和结束时间。 动 i 与 j 相容当且仅当 si ≥ fj, 或 fi ≥ sj , 求最大的两两相容的活动集。 解:按照结束时间的递增顺序将活动排列为 1, 2, …, n, 使得 f1 ≤ f2 ≤… ≤ fn 算法 Greedy Select 1. n ← length[S]; 2. A←{1}; 3. j ← 1; 4. for i ← 2 to n 5. do if si ≥ fj 6. then A ← A∪{i}; 7. j ← i; 8. return A. 最后完成时间为 max {fk : k ∈A}. 例如下述输入 I si fi 1 1 4 2 3 5 3 0 6 t=14 4 5 7 5 3 8 6 5 9 7 6 10 8 8 11 9 8 12 10 2 13 11 12 14
(1) Gk +1 ( y ) ≤ Gk ( y ) (2) Gk +1 ( y ) = Fk +1 ( y ) (3) Gk +1 ( pv k ) = Fk +1 ( pv k ) (4) wk +1 + Gk (δ ) ≤ pwk 该定理给出验证 G k+1(y) = F k+1(y)是否成立的条件。计算 Gk(y)的复杂性是 O(k), 与 y 无关。利用条件(4), 只需 O(k)时间就可以作出验证。如果需要对所有 n 种零钱的系统作出验证, 可在 O(n2)时间内完成. 例如零钱系统 wi = 1, i = 1, 2, 3, 4. v1 = 1, v2 = 5, v3 = 14, v4 = 18, 对一切 y 有 G1(y) = F1 (y), G2(y) = F2 (y). v3 = 14 = 3 v2-1, 即 p =3, δ = 1. w3 + G2 (δ) = 1 + G2 (1) = 1 + 1 = 2 p w2 = 3×1 = 3 由(4)式, 有 G3(y) = F3 (y). v4 = 18 = 2 v3-10, 即 p = 2, δ = 10. w4 + G3 (δ) = 1 + G3 (10) = 1 + 2 = 3 p w3 = 2×1 = 2 由(4)式, G4(y) 不是最优解. G4 (p v3) > F4(p v3). 即 G4 (28) = 28 / 18 + 10 / 5 = 1 + 2 = 3 F4 (28) = 28 / 14 = 2. 不难验证对国际上使用的钱币系统通常用 Greedy 算法都可以得到最优解. 例 5 装箱问题 有 n 个物体, 长度分别为 a1, a2, ... , an. ai≤1, i=1, 2, …, n. 要把它们装入长为 1 的箱子, 如果只考虑长度的限制, 问至少需要多少只箱子?
r ( NF ) = lim [ max
k →∞ L*= k
NF ( L) ] L*
表示 NF 算法相对于最优算法的误差. 下面计算 r(NF)的上界. 由于任两个相邻箱子的装入量>1, 因此必有
C(B1) + C(B2) + ... + C(Bm) >
m-1 2
m-1 m-1 这说明物体总体积大于 2 , 因此最优的算法满足 L* > 2 . 从而有 NF(L) = m < 2L* + 1, 令 L*→ ∞得 r(NF) ≤ 2. 另一方面, 可以设计某个输入使得 NF 算法所用的箱子数恰好就是最优算法 所用箱子数的 2 倍. 令
输出:<x1, x2, …, xn> max ∑ vi xi
i =1 n
∑w x
i =1 i
n
i
≤c
0 ≤ xi ≤ 1 i = 1,2,..., n 设计贪心法如下:按照单位重量的价值从高到低对物品排序,尽量装入单位 重量价值最高的物品,直到不能装入一个整物品为止,最后根据背包重量极限装 入部分物品。 通过对步数归纳可以证明部分装入背包问题满足贪心选择性质,且时间为 T(n)=O(nlogn)。一般背包问题不具有贪心选择性质,不能使用贪心法,因为对 于某些输入不能得到最优解。0-1 背包问题也不具有贪心选择性质。下面是 0-1 背包问题的描述。 max ∑ vi xi
Fk +1 ( y ) =
y 0≤ xk +1 ≤ vk +1
min
{Fk ( y − vk +1 xk +1 ) + wk +1 xk +1}
y F1 ( y ) = w1 = w1 y v1
贪心法
y Gk +1 ( y ) = wk +1 + Gk ( y mod vk +1 ) v k +1 y G1 ( y ) = w1 = w1 y v1
解为 A = {1, 4, 8, 11}
下面证明贪心法得到最优解。 定理 1 算法 Select 执行到第 k 步, 选择 k 项活动 i1= 1, i2, …, ik, 那么存在最 优解 A 包含 i1= 1, i2, …, ik 证明:对 k 归纳。 k=1, 设 S = {1, 2, …, n}是活动集,活动按截止时间递增顺序排序,则存在最 优解含有活动 1。任取最优解 A, A 中的活动按照截止时间递增的顺序排列。如 果 A 的第一个活动为 j,j ≠ 1, 令 A’= (A−{j})∪{1}, 由于 f1 ≤ fj, A’也是最优解,且含有 1. 假设命题对 k 为真。算法执行到第 k 步, 选择了活动 i1= 1, i2, …, ik, 根据归 纳假设存在最优解 A 包含 i1= 1, i2, …, ik, A 中剩下的活动选自集合 S’ = {i | i ∈ S,
∑w x
i =1 i
n
i
≤c
xi = 0,1 i = 1,2,..., n 贪心法设计:将集装箱按照从轻到重排序,轻者先装。 正确性证明:对于任何输入规模 n, 贪心算法得到装载问题的最优解。 设贪心法的解为 I 1.n=1, 只有一个集装箱,I={1}就是最优解。 2.假设对于 n-1 个集装箱的输入,贪心法都可以得到最优解。考虑 n 个集 对于 N’={2, 装箱的输入 N={1, 2, …, n}, 其中 w1≤w2≤…≤wn, 由归纳假设, 3, …, n-1},c’=c-w1, 贪心法得到最优解 I’. 令 I={1}∪I’,则 I 是关于 N 的最优解。若不然,存在包含 1 的关于 N 的最优解 I*(如果 I*中没有 1, 用 1 替换 I*中的第一个元素得到的解也是最优解) , 且|I*|>|I|; 那么 I*-{1} 是 N’的解且 |I*-{1}|>|I-{1}|=|I’| 与 I’的最优性矛盾。 复杂性 T(n)=O(nlogn)
si ≥ fk}。且 B=A-{ i1, i2, …, ik}是 S’的最优解。若不然,S’的最优解为 B’,B’的 活动比 B 多,那么 B’∪{1, i2, …, ik}是 S 的最优解,且比 A 的活动多,与 A 的最 优性矛盾。 根据归纳基础,存在 S’的最优解 B 含有 S’中的第一个活动,设为 ik+1, 则 {i1 , i2 ,..., ik } ∪ B = {i1 , i2 ,...ik , ik +1 } ∪ ( B − {ik +1 }) 包含了算法 k+1 步的选择,也是原问题的最优解,命题对 k+1 为真。 二、贪心算法的设计: 1. 贪心算法的设计要素 适用于满足优化原则的组合优化问题,将问题表示成多步判断。整个判 断序列对应问题的最优解;而它的子序列对应子问题的最优解。 确定一个优化测度(不考虑以前各步的选择,只与当前状态有关) ,以优 化测度的极大(或极小)作为贪心选择的依据 确定是否满足贪心选择性质——每步贪心选择都导致最优解。一般采用 归纳法加以证明 自顶向下计算,通过贪心选择,将原问题规约为子问题。 动态规划和贪心法比较: 性质 动态规划 适用问题 组合优化 求解过程 多步判断 使用条件 优化原则 解的性质 最优解 求解关键 子问题形成 求解顺序 数据结构 时间复杂性 空间复杂性 列递推方程 先解子问题然后选择 自底向上 数值表记录优化函数值 标记表记录子问题划分 依赖子问题重叠程度 高
min m
Leabharlann Baidu

i =1
n
ai =
∑ C(B
j =1
m
j ),
C ( B j ) ≤ 1, j = 1,2,..., m
其中 C(Bj)称为箱子 Bj 的装入量,1—C(Bj)称为箱子 Bj 的空隙。 算法 1 下次适合法 NF 贪心法设计:初始箱子号 j=1, 物体号 i=1, 将物体 i 装入箱子 j, 如果下一个 物体能够装入 j,就装,否则装入 j+1 号箱子。 误差估计: 设输入为 L, L*是最优算法得到的箱子数, NF(L)是 NF 算法得到 的箱子数.
相关文档
最新文档