第三章 贪心算法
Dde+Dab+Dbc+Def+[Ddf];(形成小回路,舍弃) Dde+Dab+Dbc+Def+[Dbe];(b顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+[Dbd];(b顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd; Dde+Dab+Dbc+Def+Dcd+[Dbf];(b顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dce];(c、e顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dae];(e顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dae];(e顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dad];(d顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+Daf;得到1条回路
2021/2/22
5
如果问题改成:砝码的种类分别为11克、5克和1克, 待称的物体是15克。用贪婪算法应先选一个11克的,然 后选四个1克的,共用五个砝码。这不是最优结果,只 要用三个5克的砝码就够了。
贪婪算法虽不能保证得到最优结果,但对于一些除
了“穷举”方法外没有有效算法的问题,用贪婪算法往
往能很快地得出较好的结果,如果此较好结果与最优结 果相差不是很多的话,此方法还是很实用的。
2021/2/22
9
当n不太大时,适当的取k值,此改进方法常常可以得到 最优解,但不能因此就说一般背包问题有多项式算法。 当n增大时,k不能随着n不断的加大,如k随n增大而同 时加大,其复杂性就是指数型而不是多项式型的了,而 如k取值较小,又不能保证得出最优解。
2021/2/22
10
例3.巡回推销员问题
(下标中5出现了3次,顶点5有三条边相连,d45(6)放弃) d24(1)+d13(2)+d15(2)+d25(3)+[d35(9)];
(下标中5出现了3次,顶点5有三条边相连,d35(9)放弃) d24(1)+d13(2)+d15(2)+d25(3)+d34(9)。
得到一条回路:
v1→v3→v4→v2→v5→v1
同由分枝限解方法得到的路径相同,因此是最佳 的回路。
2021/2/22
13
例4 设有六个城市,其坐标分别为a(0,0), b:(4,3), c:(1,7), d:(15,7), e(15,4), f:(18,0)。如下图所示:
2021/2/22
14
6座城市间的距离矩阵为:
5 7.07 16.55 15.52 18
(1)使任一城市的度数(连线数)超过2的连线必须 舍弃;
(2)在得到经过所有点的回路前就形成小回路的连 线必须舍弃。
距离按从小到大的次序排列:
Dde(3),
Def(5), Dbe(11.01), Dbf(14.32), Dad(16.55),
Dab(5),
Dbc(5),
Dac(7.07), Ddf(7.62),
当n>m时,我们首先将n个作业依其所需的处理时间 从大到小排序。然后依此顺序将作业分配给空闲的处理 机。
2021/2/22
21
例如,设7个独立作业{1,2,3,4,5,6,7}由3台机器 M1,M2,和M3来加工处理。各作业所需的处理时间分别为 {2,14,4,16,6,5,3}。按贪婪算法产生的作业调度如图4-13 所示,所需的加工时间为17。
5
5 11.7 11.01 14.32
7.07 5 D16.55 11.7 14
14 14.32 18.38
3 7.62
15.52 11.01 14.32 3 5
18 14.32 18.38 7.62 5
2021/2/22
15
用贪婪算法,先将任两城市间的连线距离按从小到 大的次序排列,然后从中逐个选择。但有两种情况的 连线应舍弃:
多机调度问题要求给出一种作业调度方案,使所 给的n个作业在尽可能短的时间内由m台机器加工处 理完成。
2021/2/22
20
这个问题是一个NP完全问题,到目前为止还没有一个 有效的解法。对于这一类问题,用贪婪选择策略有时可 以设计出较好的近似算法。采用最长处理时间作业优先 的贪婪选择策略可以设计出解多机调度问题的较好的近 似算法。按此策略,当n≤m时,我们只要将机器i的[0,ti] 时间区间分配给作业i即可。
2021/2/22
17
最后得到的回路如图(a)的结果,总长度为50。
2021/2/22
18
不过,这不是此问题的最优解,此问题的最优解为下图 所示的路径(可以用分枝限界等方法求得),总长度为 48.39。用贪婪方法得到的结果同最优解相比只多了3.3%。
2021/2/22
19
例5: 多机调度问题
设有n个独立的作业{1,2,…,n},由m台相同的 机器进行加工处理。作业i所需的处理时间为ti。现 约定,任何作业可以在任何一台机器上加工处理, 但未完工前不允许中断处理。任何作业不能拆分成 更小的子作业。
网络的最小生成树在实际中有广泛应用。例如,在设计 通信网络时,用图的顶点表示城市,用边(v,w)的权c[v][w] 表示建立城市v和城市w之间的通信线路所需的费用,则最 小生成树就给出了建立通信网络的最经济的方案。
2021/2/22
23
Kruskal最小生成树算法
Kruskal 在1956年提出了1个最小生成树算法, 它的思路很容易理解。设G=(V,E)是一个连通带权 图,V={1,2,…,n}。将图中的边按其权值由小到大 排序,然后作如下的贪婪选择,由小到大顺序选取 各条边,若选某边后不形成回路,则将其保留作为 树的一条边;若选某边后形成回路,则将其舍弃, 以后也不再考虑。如此依次进行,到选够(n-1) 条边即得到最小生成树。
2021/2/22
7
C
如果对上述算法作一些改进,可得到更好的结果。先从 n个物体中试着取j个总体积不超过C的装入背包,剩下 的(n-j)个物体则利用贪婪算法尽量往里装。此j值从零 开始逐渐增加,反复进行试探,直至j达到某预先给定 的常数k(0<k<n),最后从这些结果中取其最好的一个。 如果在试探中能得到一个完全装满的方案,则此过程就 可提前结束。因为从n个物体中取出j个共有 C n种j 方案, 此值随着j的增加而增加较快,但可以证明此改进算法 的复杂性为O(knk+1),因k是常数,故仍为多项式界的 算法。
第三章 贪心算法
2021/2/22
1
算法设计与分析
——贪婪算法
2021/2/22
2
贪婪算法(greedy algorithms,也叫登山法)
我们来看一个找硬币的例子。假设有四种硬币, 它们的面值分别为二角五分、一角、五分和一分。现 在要找给某顾客六角三分钱。这时,我们会不假思索 地拿出2个二角五分的硬币,1个一角的硬币和3个一 分的硬币交给顾客。这种找硬币方法与其他的找法相 比,所拿出的硬币个数是最少的。这里,我们下意识 地使用了这样的找硬币算法:首先选出一个面值不超 过六角三分的最大硬币,即二角五分;然后从六角三 分中减去二角五分,剩下三角八分;再选出一个面值 不超过三角八分的最大硬币,即又一个二角五分,如 此一直做下去。这个找硬币的方法实际上就是贪婪算 法。
d34=5 d23=5 d12=6 d35=6 d56=6
2021/2/22
26
Prim最小生成树算法
Prim在1957年提出另一种算法,这种算法特别适 用于边数相对较多,即比较接近于完全图的图。此算 法是按逐个将顶点连通的步骤进行的,它只需采用一 个顶点集合。这个集合开始时是空集,以后将已连通 的顶点陆续加入到集合中去,到全部顶点都加入到集 合中了,就得到所需的生成树。
设G=(V,E)是一个连通带权图,V={1,2,…,n}。构造 G的一棵最小生成树的Prim算法的过程是:首先从图 的任一顶点起进行,将它加入集合S中置,S={1},然 后作如下的贪婪选择,从与之相关联的边中选出权值 c[i][j]最小的一条作为生成树的一条边,此时满足条件 iS,jV-S,并将该j加入集合中,表示连两个顶点已 被所选出的边连通了。
Dbd(11.7), Dcd(14),
Dce(14.32), Dae(15.52),
Daf(18), Def(18.38)
2021/2/22
16
按贪婪算法原则,其选择过程如下:
Dde; Dde+Dab; Dde+Dab+Dbc; Dde+Dab+Dbc+Def;
Dde+Dab+Dbc+Def+[Dac];(形成小回路,舍弃)
当n>m时,因此算法所需的计算时间复杂度为O(nlogn)。
2021/2/22
22
例6: 最小生成树
一般情况下,用贪婪算法得到的是近似解,而不能保
证得到最优解。但用贪婪方法计算最小生成树,却可以设 计出保证得到最优解的算法。
设G=(V,E)是一个无向连通带权图,即一个网络。E中 每条边(v,w)的权为c[v][w]。如果G的一个子图G’是一棵包 含G的所有顶点的树,则称G’为G的生成树。生成树上各边 权的总和称为该生成树的费用。在G的所有生成树中,费用 最小的生成树称为G的最小生成树。
由于是5个城市,环绕一圈为5条边,贪婪方法 求解此问题的过程是从最小边开始,依此从小到大 取边加入到回路边集中,但在将1条边加入时不能使 1顶点的度数超过3,也不能形成小回路。