第6章 贪心法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6 5 2
1 3
3 2 5 3 2
1 2 3 4
4
3
(b) 城市1→城市4 1 2
3 2 (c) 城市4→城市3 1 3 2 5 2
5 5 4 2
2
2 7 3
5 5 4 2
2
2
2 5
3
4
2
3
(d) 城市3→城市5
(e) 城市5→城市2
(f) 城市2→城市1
最近邻点贪心策略求Baidu NhomakorabeaTSP问题的过程
设图G有n个顶点,边上的代价存储在二维数组w[n][n] 中,集合V存储图的顶点,集合P存储经过的边,最近邻点 策略求解TSP问题的算法如下:
(2)最短链接策略:每次在整个图的范围内选择 最短边加入到解集合中,但是,要保证加入解集合 中的边最终形成一个哈密顿回路。因此,当从剩余 边集E'中选择一条边(u, v)加入解集合S中,应满足 以下条件: ① 边(u, v)是边集E'中代价最小的边; ② 边(u, v)加入解集合S后,S中不产生回路; ③ 边(u, v) 加入解集合S后,S中不产生分枝;
对于一个具体的问题,怎么知道是否可以用贪心法求解, 以及能否得到问题的最优解?这个问题很难给予肯定的回 答。但是,从许多可以用贪心法求解的问题中看到,这类 问题一般具有两个重要的性质:最优子结构性质 (Optimal SubstructureProperty)和贪心选择性质 (Greedy Selection Property)。
34 A 46 C 19
B 26 F 25
12 E 38 A 46
34 19
B 26 F 25 D 17
12 E 38 A 46
6.1.2 贪心法的求解过程
用贪心法求解问题应该考虑如下几个方面: (1)候选集合C:为了构造问题的解决方案,有一 个候选集合C作为问题的可能解,即问题的最终解 均取自于候选集合C。例如,在付款问题中,各种 面值的货币构成候选集合。 (2)解集合S:随着贪心选择的进行,解集合S不 断扩展,直到构成一个满足问题的完整解。例如, 在付款问题中,已付出的货币构成解集合。
第6章
6.1 6.2 6.3 概 述
贪心法
图问题中的贪心法 组合问题中的贪心法
6.1
概
述
6.1.1 6.1.2
贪心法的设计思想 贪心法的求解过程
6.1.1
贪心法的设计思想
贪心法在解决问题的策略上目光短浅,只根据 当前已有的信息就做出选择,而且一旦做出了选 择,不管将来有什么结果,这个选择都不会改变。 换言之,贪心法并不是从整体最优考虑,它所做出 的选择只是在某种意义上的局部最优。 这种局部最优选择并不总能获得整体最优解 (Optimal Solution),但通常能获得近似最优解 (Near-Optimal Solution)。
C=
∞ 3 3 ∞ 3 7 2 3 6 2
3 2 6 7 3 2 ∞ 2 5 2 ∞ 3 5 3 ∞
1 5 2 2 2 3 5
1 2 2
4
(a) 5城市的代价矩阵 1 5 2 2 2
(b) 城市1→城市4 1 2 5 2 5 2
3 4 (c) 城市5→城市2 1 2 5 2 5 3 2 (f) 城市2回到出发城市1 4 3 2
在付款问题每一步的贪心选择中,在不 超过应付款金额的条件下,只选择面值最大的货 币,而不去考虑在后面看来这种选择是否合理, 而且它还不会改变决定:一旦选出了一张货币, 就永远选定。付款问题的贪心选择策略是尽可能 使付出的货币最快地满足支付要求,其目的是使 付出的货币张数最慢地增加,这正体现了贪心法 的设计思想。
算法6.1——最近邻点策略求解TSP问题
1. P={ }; 2. V=V-{u0}; u=u0; //从顶点u0出发 3. 循环直到集合P中包含n-1条边 3.1 查找与顶点u邻接的最小代价边(u, v)并且v属于集合V; 3.2 P=P+{(u, v)}; 3.3 V=V-{v}; 3.4 u=v; //从顶点v出发继续求解
双向图只用两种颜色就可以完成着色,例 如,可以将奇数顶点全部着成颜色1,将偶数顶 点全部着成颜色2。如果贪心法以1, 3, … , 2n-1, 2, 4, … , 2n的顺序为双向图着色,则算法可以 得到这个最优解,但是如果贪心法以1,2, … , n 的自然顺序为双向图着色,则算法找到的是一 个需要n种颜色的解。
贪心策略:选择一种颜色,以任意顶点作为开始顶点,依次 考察图中的未被着色的每个顶点,如果一个顶点可以用颜色1 着色,换言之,该顶点的邻接点都还未被着色,则用颜色1为 该顶点着色,当没有顶点能以这种颜色着色时,选择颜色2和 一个未被着色的顶点作为开始顶点,用第二种颜色为尽可能 多的顶点着色,如果还有未着色的顶点,则选取颜色3并为尽 可能多的顶点着色,依此类推。 3 1 2 4 5 3 1 2 4 5
(3)解决函数solution:检查解集合S是否构成 问题的完整解。例如,在付款问题中,解决函数是 已付出的货币金额恰好等于应付款。 (4)选择函数select:即贪心策略,这是贪心法 的关键,它指出哪个候选对象最有希望构成问题的 解,选择函数通常和目标函数有关。例如,在付款 问题中,贪心策略就是在候选集合中选择面值最大 的货币。 (5)可行函数feasible:检查解集合中加入一个 候选对象是否可行,即解集合扩展后是否满足约束 条件。例如,在付款问题中,可行函数是每一步选 择的货币和已付出的货币相加不超过应付款。
6.2.2
图着色问题
给定无向连通图 G=(V, E),求图 G 的最小色数 k ,使得用 k 种颜色对 G 中的顶点着色,可使任意两 个相邻顶点着色不同。
例如,所示的图可以只用两种颜色着色,将顶点1、 3和4着成一种颜色,将顶点2和顶点5着成另外一种 颜色。为简单起见,下面假定k个颜色的集合为{颜色 1, 颜色2, …, 颜色k}。 3 1 2 4 5
6.2
图问题中的贪心法
TSP问题 图着色问题 最小生成树问题
6.2.1 6.2.2 6.2.3
6.2.1
TSP问题
求解TSP问题至少有两种贪心策略是合理的: (1)最近邻点策略:从任意城市出发,每次 在没有到过的城市中选择最近的一个,直到 经过了所有的城市,最后回到出发城市。
C=
∞ 3 3 2 6 3 ∞ 7 3 2 3 7 ∞ 2 5 2 3 2 ∞ 3 6 2 5 3 ∞ (a) 5城市的代价矩阵 1 2
对于一个具体问题,要确定它是否具有贪心 选择性质,必须证明每一步所作的贪心选择最 终导致问题的整体最优解。通常先考察问题的 一个整体最优解,并证明可修改这个最优解, 使其从贪心选择开始。做出贪心选择后,原问 题简化为规模较小的类似子问题,然后,用数 学归纳法证明,通过每一步的贪心选择,最终 可得到问题的整体最优解。 设计贪心算法的困难在于证明得到的解确实 是问题的整体最优解。
贪心法求解的问题的特征:
(1)最优子结构性质 当一个问题的最优解包含其子问题的最优解时,称 此问题具有最优子结构性质,也称此问题满足最优性原理。 问题的最优子结构性质是该问题可以用动态规划法或贪心法 求解的关键特征。 在分析问题是否具有最优子结构性质时,通常先假设由问题 的最优解导出的子问题的解不是最优的,然后证明在这个假 设下可以构造出比原问题的最优解更好的解,从而导致矛盾。
(2)贪心选择性质 所谓贪心选择性质是指问题的整体最优解可以通 过一系列局部最优的选择,即贪心选择来得到,这是 贪心法和动态规划法的主要区别。在动态规划法中, 每步所做出的选择(决策)往往依赖于相关子问题的 解,因而只有在求出相关子问题的解后,才能做出选 择。而贪心法仅在当前状态下做出最好选择,即局部 最优选择,然后再去求解做出这个选择后产生的相应 子问题的解。正是由于这种差别,动态规划法通常以 自底向上的方式求解各个子问题,而贪心法则通常以 自顶向下的方式做出一系列的贪心选,每作一次贪心 选择就将问题简化为规模更小的子问题。
考虑一个具有2n个顶点的无向图,顶点的编号从1 到2n,当i是奇数时,顶点i与除了顶点i+1之外的其 他所有编号为偶数的顶点邻接,当i是偶数时,顶点 i与除了顶点i-1之外的其他所有编号为奇数的顶点 邻接,这样的图称为双向图(Bipartite)。
1 3 5 7
2
4
6
8
图7.4 具有8个顶点的双向图
例:用贪心法求解付款问题。 假设有面值为5元、2元、1元、5角、2角、1角的货 币,需要找给顾客4元6角现金,为使付出的货币的 数量最少,首先选出1张面值不超过4元6角的最大 面值的货币,即2元,再选出1张面值不超过2元6角 的最大面值的货币,即2元,再选出1张面值不超过 6角的最大面值的货币,即5角,再选出1张面值不 超过1角的最大面值的货币,即1角,总共付出4张 货币。
4
2
3
(d) 城市4→城市3
3 2 (e) 城市3→城市5 4
最短链接贪心策略求解TSP问题的过程
设图G有n个顶点,边上的代价存储在二维数组w[n][n] 中,集合E'是候选集合即存储所有未选取的边,集合P存储经 过的边,最短链接策略求解TSP问题的算法如下:
算法6.2——最短链接策略求解TSP问题 1.P={ }; 2.E'=E; //候选集合,初始时为图中所有边 3.循环直到集合P中包含n-1条边 3.1 在E'中选取最短边(u, v); 3.2 E'=E'-{(u, v)}; 3.3 如果 (顶点u和v在P中不连通 and 不产生分枝) 则P=P+{(u, v)};
6.2.3 最小生成树问题
设G=(V,E)是一个无向连通网,生成树上各 边的权值之和称为该生成树的代价,在G的所有 生成树中,代价最小的生成树称为最小生成树 (Minimal Spanning Trees)。
最小生成树问题至少有两种合理的贪心策略: (1)最近顶点策略:任选一个顶点,并以此建立 起生成树,每一步的贪心选择是简单地把不在生 成树中的最近顶点添加到生成树中。 Prim算法就应用了这个贪心策略,它使生成 树以一种自然的方式生长,即从任意顶点开始, 每一步为这棵树添加一个分枝,直到生成树中包 含全部顶点。
设数组color[n]表示顶点的着色情况,贪心法求解图 着色问题的算法如下:
算法6.3——图着色问题 1.color[1]=1; //顶点1着颜色1 2.for (i=2; i<=n; i++) //其他所有顶点置未着色状态 color[i]=0; 3.k=0; 4.循环直到所有顶点均着色 4.1 k++; //取下一个颜色 4.2 for (i=2; i<=n; i++) //用颜色k为尽量多的顶点着色 4.2.1 若顶点i已着色,则转步骤4.2,考虑下一个顶点; 4.2.2 若图中与顶点i邻接的顶点着色与顶点i着颜色k不冲突, 则color[i]=k; 5.输出k;
在算法6.2中,如果操作“在E'中选取最短边 (u, v)”用顺序查找,则算法6.2的时间性能是 O(n2),如果采用堆排序的方法将集合E'中的边 建立堆,则选取最短边的操作可以是O(log2n), 对于两个顶点是否连通以及是否会产生分枝,可 以用并查集的操作将其时间性能提高到O(n),此 时算法6.2的时间性能为O(nlog2n)。
贪心法的一般过程 Greedy(C) //C是问题的输入集合即候选集合 { S={ }; //初始解集合为空集 while (not solution(S)) //集合S没有构成问题的一个解 { x=select(C); //在候选集合C中做贪心选择 if feasible(S, x) //判断集合S中加入x后的解是否可行 S=S+{x}; C=C-{x}; } return S; }
算法6.1的时间性能为 O(n2),因为共进行n-1次贪 心选择,每一次选择都需要查找满足贪心条件的最短边。 用最近邻点贪心策略求解TSP问题所得的结果不一定是 最优解,图6.1(a)中从城市1出发的最优解是 1→2→5→4→3→1,总代价只有13。当图中顶点个数较多 并且各边的代价值分布比较均匀时,最近邻点策略可以给 出较好的近似解,不过,这个近似解以何种程度近似于最 优解,却难以保证。例如,在图6.1中,如果增大边(2, 1) 的代价,则总代价只好随之增加,没有选择的余地。