中科院陈玉福算法课件ch4ppt
合集下载
人工智能原理ch4andch5read
![人工智能原理ch4andch5read](https://img.taocdn.com/s3/m/260f49c31711cc7931b716d6.png)
度加1。 • 首先、扩展最深的节点的结果使得搜索沿着
状态空间某条单一的路径从起始节点向下进 行下去;只有当搜索到达一个没有后裔的状 态时,它才考虑另一条替代的路径。
PPT文档演模板
人工智能原理ch4andch5read
• 对于许多问题,其状态空间搜索树
的深度可能为无限深,或者可能至少
要比某个可接收的解答序列的已知深
•R2 R4(回溯)
• 宽度优先搜索方法能够保证在搜索树中找到一条通向目标节 点的最短途径。 •注:1、在OPEN表中已有的节点,新扩展有关节点不放OPEN 表中。 P•PT文档演2模板、CLOSED表中放数位置前后不重要。 人工智能原理ch4andch5read
PPT文档演模板
人工智能原理ch4andch5read
•
O
• 规则库
搜索树: R1 R2
•
A. B.
• R1: 如X/12为整,则X/6为整。 R2 R3 R1
R4
•
C. D. E. .
• R2: 如X/20为整,则X/10为 R3 R4 R2 R3 R4
S
•
F . . G . H.
• R3: 如X/6为整,则X/2为整。 R4 S R4 R4 S
• R4: 如X/10为整,则X/5为整。 S S S
PPT文档演模板
人工智能原理ch4andch5read
• 4.1.1 宽度优先搜索 • 如果搜索是以接近起始节点的程度依次
扩展节点的,那么这种搜索就叫做宽度优先 搜索。也就是说,这种搜索是逐层进行的。 在对下一层的任一节点进行搜索之前,必须 搜索完本层的所有节点。 • 宽度优先搜索算法(流程框图)如下: • (1)把起始节点放到OPEN表中(如果该 起始节点为目标节点,则求得一个解答)。
状态空间某条单一的路径从起始节点向下进 行下去;只有当搜索到达一个没有后裔的状 态时,它才考虑另一条替代的路径。
PPT文档演模板
人工智能原理ch4andch5read
• 对于许多问题,其状态空间搜索树
的深度可能为无限深,或者可能至少
要比某个可接收的解答序列的已知深
•R2 R4(回溯)
• 宽度优先搜索方法能够保证在搜索树中找到一条通向目标节 点的最短途径。 •注:1、在OPEN表中已有的节点,新扩展有关节点不放OPEN 表中。 P•PT文档演2模板、CLOSED表中放数位置前后不重要。 人工智能原理ch4andch5read
PPT文档演模板
人工智能原理ch4andch5read
•
O
• 规则库
搜索树: R1 R2
•
A. B.
• R1: 如X/12为整,则X/6为整。 R2 R3 R1
R4
•
C. D. E. .
• R2: 如X/20为整,则X/10为 R3 R4 R2 R3 R4
S
•
F . . G . H.
• R3: 如X/6为整,则X/2为整。 R4 S R4 R4 S
• R4: 如X/10为整,则X/5为整。 S S S
PPT文档演模板
人工智能原理ch4andch5read
• 4.1.1 宽度优先搜索 • 如果搜索是以接近起始节点的程度依次
扩展节点的,那么这种搜索就叫做宽度优先 搜索。也就是说,这种搜索是逐层进行的。 在对下一层的任一节点进行搜索之前,必须 搜索完本层的所有节点。 • 宽度优先搜索算法(流程框图)如下: • (1)把起始节点放到OPEN表中(如果该 起始节点为目标节点,则求得一个解答)。
中科院陈玉福算法课件ch8ppt
![中科院陈玉福算法课件ch8ppt](https://img.taocdn.com/s3/m/8fb9e819f18583d049645993.png)
判定问题及描述
算法复杂性与NPC问题
问题与算法的描述 图灵机与确定性算法 NP类问题 NP完全问题 证明问题为NP完全的方roblem):有待回答、通常含有几个取值还未确定的自 由变量的一般性提问(question)。 表示符号:Π 问题的构成: 1)对其关于参数的一般性描述; 2)对该问题的答案所应满足的某些特性的说明。 问题的实例:指定问题中所有参数的具体取值 。表示符号:Ι 旅行商问题: 参数描述:n个城市C1,C2,…,Cn,城市间距离d(Ci,Cj) 答案描述:城市的排序:Cπ(1) , Cπ(2) ,…, Cπ(n) ,最小化目标值: ∑1≤i≤n-1 d(Cπ(i) , Cπ(i+1) ) + d(Cπ(n) , Cπ(1) ) 旅行商问题实例: n=4, Cπ(1) , Cπ(2) , Cπ(3) , Cπ(4) , d(C1,C2)=10, d(C1,C3)=5, d(C1,C4)=9, d(C2,C3)=6, d(C2,C4)=9, d(C3,C4)=3 答案:C1, C3, C4,C2, 长度: 27
中科院陈玉福算法课件ch2ppt
![中科院陈玉福算法课件ch2ppt](https://img.taocdn.com/s3/m/8d91ae3e0b4c2e3f57276393.png)
A B D E F
C
A B C
B A A B B C C D
C D F H H H H E
0 E 0 G 0 0 0 0 F G 0 0
G
D E
H
F G
图G和它的邻接链表
1 A 2 B 4 D E H 5 6 F G C 7 3
H
1 A 2 B 3 D E H 5 6 F G C 8 7
8
4
图G的宽度优先搜索树
Vertex 1 Vertex 2
2 3 0
4 0 Vertices
Vertex 3 Empty list Edges Vertex 4 2 3 0
1 2 3 4 5 6 7 8 9
(c)
(d)
图的遍历算法
有根树
如果指定树的一个顶点为根,则这棵树称为有根树。在有 根树中,邻接根的顶点称为根的儿子,而根称为这些儿子 的父亲。对于不是根的顶点,除了它的父亲之外其它与之 邻接的顶点都称为该顶点的儿子,该顶点也自然称为它的 这些儿子的父亲。没有儿子的顶点称为叶顶点。 从根到每一个叶顶点都有一条唯一的路,这些路的最长者 的长度称为该树的高度;顶点的高度是以它为根的子树的 高度;顶点的深度是从根顶点到它的路的长度。深度相同 的顶点成为同层的。
⎡1 ⎢1 ⎢ ⎢0 ⎢ M = ⎢0 ⎢0 ⎢ ⎢0 ⎢0 ⎣ 0 1 0 0 0 0⎤ 1 0 0 0 0 0⎥ ⎥ 1 1 0 0 0 0⎥ ⎥ 0 0 1 0 0 0⎥ 0 0 1 1 1 0⎥ ⎥ 0 0 0 1 0 1⎥ 0 0 0 0 1 1⎥ ⎦
右边的图不是连通的,有两个连 通分支。它含有两个圈,不是 树。
算法BFS的复杂性分析
空间复杂度为 S (n, m) = O(n) ; 时间复杂度,当G用邻接矩阵表示时:T (m, m) = O(n 2 ); 当G由邻接链表表示时, T (n, m) = O(n + m) 。 除结点v外,只有当结点w满足Visited(w)=0时才被加到队列上, 然后,Visited(w)的值马上被修改增加1.因此每个结点有一次机 会被放到队列上。需要的队列空间至多是n-1,其余变量所用 的空间为O(1),S(n,m)=O(n)。 在极端情况下,v邻接于全部其 他n-1个结点,此时队列需要n-1的空间。又Visited需要Θ(n)的 空间,所以S(n,m)=Θ(n)。 如果使用邻接链表,语句4的for循环要做d(u)次,而语句3~11的 while循环需要做n次,因而整个循环做∑d(u)=2m次O(1)操 作,又Visited的赋值需要n次操作,因而T(n,m)=Θ(n+m)。 如果采用邻接矩阵,则语句3~11的while循环总共需要做n2次O(1) 操作,Visited赋值需要n操作,因而T(n,m)=Θ(n2)。
中科院陈玉福算法讲义ch4
![中科院陈玉福算法讲义ch4](https://img.taocdn.com/s3/m/22c768ce8bd63186bcebbc08.png)
背包问题 已知容量为 M 的背包和 n 件物品。第 i 件物品的重量为 wi ,价值
是 pi 。因而将物品 i 的一部分 xi 放进背包即获得 pi xi 的价值。问题是:怎样装包 使所获得的价值最大?即是如下的优化问题:
84
第四章 贪心算法
max ∑ pi xi 1≤ i ≤ n
(4.1.3)
∑ wi xi ≤ M
n=3, M=20, p=(25, 24, 15), w=(18,15,10) 如果以价值最大为贪心准则,则贪心算法的执行过程是:首先考虑将物品 1 装包, 此时获得效益值 25,包的剩余容量是 2。然后考虑将物品 2 装包,但物品 2 的重 量 15 超出包的剩余容量,只能装入该种物品的 2/15,此时获得的总效益值为
第四章 贪心算法
83
第四章 贪心算法
§1.贪心算法基本思想
找零钱 假如售货员需要找给小孩 67 美分的零钱。现在,售货员手中只有 25 美分、10 美分、5 美分和 1 美分的硬币。在小孩的催促下,售货员想尽快将 钱找给小孩。她的做法是:先找不大于 67 美分的最大硬币 25 美分硬币,再找不 大于 67-25=42 美分的最大硬币 25 美分硬币,再找不大于 42-25=17 美分的 最大硬币 10 美分硬币,再找不大于 17-10=7 美分的最大硬币 5 美分硬币,最 后售货员再找出两个 1 美分的硬币。至此,售货员共找给小孩 6 枚硬币。售货员 的原则是拿尽可能少的硬币找给小孩。
证明 设 x = (x1, x2 ,L, xn ) 是 GreedyKnapsack 所生成的解,但不是最优解。
第四章 贪心算法
85
因而必有某个 xi 不为 1。不妨设 x j 是第一个这样的分量。于是,当1 ≤ i < j 时,
数理统计CH4参数估计42ppt课件
![数理统计CH4参数估计42ppt课件](https://img.taocdn.com/s3/m/d46ea5d9e009581b6bd9eb58.png)
(5)区间估计的一般步骤
步骤2:设定置信度1-α,以此确定统计量Z的 1-α/2分位点和α/2分位点
z12z2 z2
步骤3:公式表达统计量Z在其1-α/2分位点和 α/2分位点之间取值的概率等于置信度1-α
P z2 Z z2 P z2X n z2 1
计算μ的0.95单侧置信区间的置信上限:
C U x 1 4 .9 5 0 .1 3 5 1 5 .0 8 5 m m
2019/11/9
王玉顺:数理统计04_参数估计
26
4.4.1 正态总体均值的区间估计
区间估计比较
(3)方差已知均值单侧区间估计
μ的0.95单侧置信区间:
2019/11/9
王玉顺:数理统计04_参数估计
13
4.4 区间估计
(6)区间估计的统计量
从区间估计的步骤里可看出,构造包含 待估参数θ的统计量Y是实现区间估计的关 键,一旦统计量Y构造成功,后续工作水到 渠成。核心思路:构造既能估计参数θ又能 利用已知分布的统计量,即构造出服从Z、 2、t和F四种分布之一的统计量。区间估计 的最终结果,是参数θ与统计量Y的分位点 等所构成的不等式区间。
计算μ的0.95双侧置信区间为:
xnz2,xnz2 1.7 4,1 9.1 51
2019/11/9
王玉顺:数理统计04_参数估计
22
4.4.1 正态总体均值的区间估计
案例与实践
(2)方差已知均值双侧区间估计
x
n
z
2,x
n
z
2
14.79,15.11
2019/11/9
步骤2:设定置信度1-α,以此确定统计量Z的 1-α/2分位点和α/2分位点
z12z2 z2
步骤3:公式表达统计量Z在其1-α/2分位点和 α/2分位点之间取值的概率等于置信度1-α
P z2 Z z2 P z2X n z2 1
计算μ的0.95单侧置信区间的置信上限:
C U x 1 4 .9 5 0 .1 3 5 1 5 .0 8 5 m m
2019/11/9
王玉顺:数理统计04_参数估计
26
4.4.1 正态总体均值的区间估计
区间估计比较
(3)方差已知均值单侧区间估计
μ的0.95单侧置信区间:
2019/11/9
王玉顺:数理统计04_参数估计
13
4.4 区间估计
(6)区间估计的统计量
从区间估计的步骤里可看出,构造包含 待估参数θ的统计量Y是实现区间估计的关 键,一旦统计量Y构造成功,后续工作水到 渠成。核心思路:构造既能估计参数θ又能 利用已知分布的统计量,即构造出服从Z、 2、t和F四种分布之一的统计量。区间估计 的最终结果,是参数θ与统计量Y的分位点 等所构成的不等式区间。
计算μ的0.95双侧置信区间为:
xnz2,xnz2 1.7 4,1 9.1 51
2019/11/9
王玉顺:数理统计04_参数估计
22
4.4.1 正态总体均值的区间估计
案例与实践
(2)方差已知均值双侧区间估计
x
n
z
2,x
n
z
2
14.79,15.11
2019/11/9
中科院陈玉福算法课件ch1ppt
![中科院陈玉福算法课件ch1ppt](https://img.taocdn.com/s3/m/ce5b31e281c758f5f61f6793.png)
计算机算法设计与分析 The Design and Analysis of Computer Algorithms
中国科学院研究生院 陈玉福
关于计算机算法
计算机科学 是一种创造性思维活动,其教育必须面向设计; 计算机算法 是任何定义好了的计算程式,它取某些值或值 的集合作为输入,并产生某些值或值的集合作为输出。 计算机算法的特征 – 数据输入与输出; – 确定性: 算法的每一步计算(包括判断)必须要有确切 的定义,即每一步计算动作必须是清楚的,无二义性。
空间复杂性
考虑空间复杂性的理由
在多用户系统中运行时,需指明分配给该程序的内存 大小; 想预先知道计算机系统是否有足够的内存来运行该程 序; 用空间复杂性来估计一个程序可能解决的问题的最大 规模; 一个问题可能有若干个不同的内存需求解决方案,从 中择优。
指令空间: 存储编译后的程序指令
指令空间的大小取决于如下因素: 把程序编译成机器代码的编译器,编译器不同,则产 生的机器代码的长度就会有差异; 编译时实际采用的编译器选项,如优化模式、覆盖模 式,选用优化模式可缩短代码长度,但会增加运行时 间; 目标计算机的配置,如带有浮点处理硬件的,每个浮 点操作转换为一条机器指令,否则,必须生成仿真的 浮点计算代码,使整个机器代码加长。 一般情况下,指令空间对于所解决的特定问题不够敏 感。
– 可实现性:每种计算至少在原理上能由人用纸和笔在有
限的时间内完成。 – 有穷性: 一个算法总是在执行了有穷步之后终止。
关于算法设计与分析
如何设计算法:问题的数学模型、经典算法、分析改进。 如何表示算法:输入数据结构、描述算法的语言、算法 流程、逻辑结构。C++ 或 ALGEN(伪代码)。 如何分析算法:发现算法特性、估计对各种应用的适合 程度、相同应用中与其它算法的比较。确定输入数 据模型、确定每项基本操作所用时间及出现频率、 统计数据、分析推求。 如何测试算法:正确性、有穷性;白盒法、黑盒法。
中国科学院研究生院 陈玉福
关于计算机算法
计算机科学 是一种创造性思维活动,其教育必须面向设计; 计算机算法 是任何定义好了的计算程式,它取某些值或值 的集合作为输入,并产生某些值或值的集合作为输出。 计算机算法的特征 – 数据输入与输出; – 确定性: 算法的每一步计算(包括判断)必须要有确切 的定义,即每一步计算动作必须是清楚的,无二义性。
空间复杂性
考虑空间复杂性的理由
在多用户系统中运行时,需指明分配给该程序的内存 大小; 想预先知道计算机系统是否有足够的内存来运行该程 序; 用空间复杂性来估计一个程序可能解决的问题的最大 规模; 一个问题可能有若干个不同的内存需求解决方案,从 中择优。
指令空间: 存储编译后的程序指令
指令空间的大小取决于如下因素: 把程序编译成机器代码的编译器,编译器不同,则产 生的机器代码的长度就会有差异; 编译时实际采用的编译器选项,如优化模式、覆盖模 式,选用优化模式可缩短代码长度,但会增加运行时 间; 目标计算机的配置,如带有浮点处理硬件的,每个浮 点操作转换为一条机器指令,否则,必须生成仿真的 浮点计算代码,使整个机器代码加长。 一般情况下,指令空间对于所解决的特定问题不够敏 感。
– 可实现性:每种计算至少在原理上能由人用纸和笔在有
限的时间内完成。 – 有穷性: 一个算法总是在执行了有穷步之后终止。
关于算法设计与分析
如何设计算法:问题的数学模型、经典算法、分析改进。 如何表示算法:输入数据结构、描述算法的语言、算法 流程、逻辑结构。C++ 或 ALGEN(伪代码)。 如何分析算法:发现算法特性、估计对各种应用的适合 程度、相同应用中与其它算法的比较。确定输入数 据模型、确定每项基本操作所用时间及出现频率、 统计数据、分析推求。 如何测试算法:正确性、有穷性;白盒法、黑盒法。
中科院陈玉福算法课件ch3ppt
![中科院陈玉福算法课件ch3ppt](https://img.taocdn.com/s3/m/28a9bce1856a561252d36f93.png)
MaxMin复杂性分析
• T(n)来表示MaxMin所用的元素比较数,则上述递归算法导出 一个递归关系式
n =1 ⎧0 ⎪ T (n) = ⎨1 n=2 ⎪ T( n/2 ) +T( n/2 ) + 2 n > 2 ⎤ ⎣ ⎦ ⎩ ⎡
• 当n是2的方幂时,设 n = 2 k ,有
•
• • •
T (n) = 2T (n / 2) + 2 = 2(2T (n / 4) + 2) + 2 L = 2k −1T (2) + = 3n / 2 − 2
以比较为基础的排序时间下界
每两个元素A[i]和A[j]的比较只 有两种可能: A[i]<A[j]或A[j]<A[i], 形成二叉树。当A[i]<A[j]时进入 左分支,当A[i]>A[j] 进入右分 支。各个叶结点表示算法终止。 从根到叶结点的每一条路径与一 种唯一的排列相对应。由于n个 不同元素的不同排列共有n!个 因此比较树有n!个外部结点 。 比较树中最长路径的长度(其是 比较树的高)即是算法在最坏情 况下所做的比较次数。要求出所 有以比较为基础的排序算法在最 坏情况下的时间下界,只需求出 这些算法所对应的比较树的高度 的最小值。
k: 0, 1, 2, 3, 4, 5, 6, 7, 8 LINK : 2, 8, 5, 4, 7, 3, 0, 1, 6
使用链接表的归并排序程序
proc MergeSortL(low, high, p) // Link是全程数组A[low..high] //的下标表, p指示这个表的开始处。利用Link将A按非降 //顺序排列。 global A[low..high]; Link[low..high]; if high-low+1<16 then //设定子问题的最小规模Small InSort(A,Link, low,high,p); else mid:=⎣(low+high)/2⎦; MergeSortL(low,mid,q); //返回q表 MergeSortL(mid+1,high,r); //返回r表 MergeL(q,r,p); 将表q和r合并成表p end{if} end{MergeSortL}
CH4 遥感图像处理.ppt
![CH4 遥感图像处理.ppt](https://img.taocdn.com/s3/m/16a5037e0b4c2e3f56276306.png)
x 0,1,2, ,M 1; y 0,1,2, , N 1.
9
光学原理:
➢颜色视觉
✓亮度对比:视场中对象与背景的亮度差与背景亮度之比。 ✓颜色对比:相邻区域的不同颜色的相互影响叫颜色对比。 ✓颜色的性质:
• 明度:人眼对光源或物体明亮程度的感觉。 • 色调:是色彩彼此相互区分的特性。 • 饱和度:是色彩纯洁的程度。 !黑白色只用明度描述 ✓颜色立体(孟赛尔颜色立体)
——图像数字化
➢ D/A转换(Analog/Digital)
✓ 显示终端显示
✓ 打印输出
4
采样孔径 扫描装置
数字化过程
数字化仪
亮度传感器
量化装置
输出存储介质
采样将空间上连续的图像变换成离散点的操作。
参数: ➢ 采样间隔: x,y 如行、列采样间隔,大小取决于图像的频谱 ➢ 采样孔径的形状和大小
量化图像灰度的数字化。 G 2g , (g的值一般取1,2,6,8,10等)
量化等级越多,所得图像层次越丰富,灰度分辨率越 高,质量越好,但数据量大;量化等级越少,图像层次 欠丰富,灰度分辨率低,质量变差,但数据量小。
6图像Βιβλιοθήκη 频谱表示7傅立叶变换:实现图像空间域和频谱域表示的有力工具。
傅立叶变换(空间域 频谱域)
连续函数
F(vx , vy ) { f (x, y)}
17
图像处理的有力工具——直方图
----反映了一幅图像中灰度级与其出现概率之间的关系。
Pi
mi M
2n 1
M mi i0
图像累积直方图
j
Fj Pi i0
18
19
连续函数
f (x, y) 1{F(vx,vy )}
中科院陈玉福算法课件ch5ppt
![中科院陈玉福算法课件ch5ppt](https://img.taocdn.com/s3/m/5b06c9da33d4b14e85246893.png)
i
i
m[i][j]
s[i][j]
回溯过程
void Traceback(int i, int j, int * * s) { if (i= = j) return; Traceback(i, s[i][j], s); Traceback(s[i][j]+1, j, s); cout << “Multiply A” << i << “,” << s[i][j]; cout << “and A” <<(s[i][j] +1) << “,” << j << endl; } • 以s[i][j]为元素的2维数 组却给出了加括号的全部 的信息。因为s[i][j]=k说 明,计算连乘积A[i..j]的 最佳方式应该在矩阵Ak和 Ak+1之间断开,即最优加 括号方式为 (A[i..k])(A[k+1..j])。 可以从 s[1][n]开始,逐步 深入找出分点的位置,进 而得到所有括号。
V1 9 9 7 1 2 3 3 7 3 7 4
11
V2 2 2 4
V3 6 2 9
11
V4 9 4 13 3 5
10 14
V5
6 5
7
4 2 5
s
1
t
12 16
11
8
2 5
8
10
6
16
11
矩阵连乘积问题
• 给定n个数字矩阵A1,A2,…,An,其中Ai与Ai+1是可乘的, 设Ai是pi-1×pi矩阵, i=1,2,…,n。 • 求矩阵连乘A1A2⋅⋅⋅An的加括号方法,使得所用的数乘次数最少 • 三个矩阵连乘:(A1A2)A3和A1(A2A3) ,乘法次数分别为 p0p1p2+p0p2p3和p0p1p3+p1p2p3 • 例子:p0=10, p1=100, p2=5, p3=50, 两种方法:7500 和 75000 • 最优子结构性质:(A1…Ak)(Ak+1…An) m(1,n)=m(1,k) + m(k+1,n)+p0pkpn • 目标值递推关系式
中科院陈玉福算法课件ch7ppt
![中科院陈玉福算法课件ch7ppt](https://img.taocdn.com/s3/m/a0e207b11a37f111f1855b93.png)
!! !! !! 6 7
b 8 9 7 8 8
• 方格位置的类Position:私有成员 row, col;如a=(3,2),b=(4,6) • 平移offset:右(0)、下(1)、左(2)、上(3),如向右平移一步表示 为:offset[0].row=0 and offset[0].col=1。 • 方格状态: grid[i][j]=0可以通过, grid[i][j]=1禁止通过。
蓝色表示该节点的费用 红色表示该结点成为扩展节点的序号 粉色表示相应周游的费用
4 3 2 4 K 10 2 2 >25 30 C 3 1 B 1 3 6 4 40 G 6 3 60 M 11 4 21 N 25 2 H 4 26 2 36 O >25 D 3 4 1 I 7 4 3 19 P 25 4 4 2 J 5 E A
计算当前状态下的可能取得最大效益值的上、下界
LUBound(P,W,cap,cv,N,k,Pvl,Pvu) // k为当前节点的级(level),cap是背包当前 • //的剩余容量,cv是当前背包中物品的总价值,还有物品k,…,N要考虑 • Real rw; //随时记录本函数执行过程中是背包的剩余容量 • Pvl:=cv; rw:=cap; • for i from k to N do • if rw<W[i] then Pvu:=Pvl+rw*P[i]/W[i]; • // 从第k件到第N件至少有一件物品不能装进背包的情形出现 • for j from i+1 to N do • if rw≥W[j] then • rw:=rw-W[j]; Pvl:=Pvl+P[j]; • end{if} • end{for} • return //此时Pvl < Pvu • end{if} • rw:=rw-W[i]; Pvl:=Pvl+P[i]; • end{for} • Pvu:=Pvl; // 从第k件物品到第N件物品都能装进背包的情形出现, end{LUBound}
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章 贪心算法
算法基本思想 调度问题 最小生成树问题 单点源最小路径问题 Huffman编码
贪心算法的基本思想
找零钱:给孩子找回87分硬币,现有硬币规格50分、10分、 5分、2分、1分。 50+3*10+5+2=87 一般方法:尽量找面值大的硬币。 装箱问题:有物品n件,重量分别是 w1,…,wn ; 有箱子m个: B1,…,Bm,每个的容量都是C(C≥wi)。设计装箱方法,使得 所用箱子最少。 1. NF(Next Fit)方法:前面的箱子不能再装了,才开始装下一 个箱子。 2. FF(First Fit)方法:每个物品都选择装进第一个可装的箱子 贪心算法的基本思想: 在每一步决策中总是作出在当前看来是最好的选择 贪心准则,局部最优。
=1≤iΒιβλιοθήκη ≤n∑ pyi i
贪心算法抽象控制流程
proc Greedy(A, n) // A[1:n]代表输入 solution={}; //解初始化为空集 for i to n do x:=Select(A); if Feasible(solution, x) then solution:=Union(solution, x); end{if} end{for} return(solution); end{Greedy} Select(A)是按照贪心 准则选取A中的输入 项; Feasible(solution, x)是 判断已知的解的部分 solution与新选取的x 的结合是否是可行 解。 Union(solution, x)x与 已经选到的部分 solution结合成解的更 大部分
GreedyJob获得最优解
假设贪心算法所选择的作业集J不是最优解,则一定有相容作 业集I,其产生更大的效益值。假定I是具有最大效益值的相容作 业集中使得|I∩J|最大者,往证 I=J。 反证法:若I=J 不成立,则这两个作业集合之间没有包含关 系。这是因为算法GreedyJob的特性和假定I 产生的效益值比J的 效益值更大。假设a是J\I中具有最大效益的作业,即J中比a具有 更大效益的作业(如果有的话)都应该在 I 中。如果作业 b∈I\J 且 pb>pa,那么由算法中对J中作业的选取办法(相容性要求),J中 至少有 fb个效益值≥pb的作业,其期限值≤ fb。这些作业一定在 I 中,因而 I 中至少有个fb+1作业,其期限值≤ fb ,这与 I 的相容性 矛盾。所以,I\J中事件的效益值均不超过pa。 称区间[k-1,k]为时间片k,相容作业集 I 的一个调度表就是指定 I 中各个作业的加工时间片。如果 I 有一个调度表 S 将时刻 fa前 的时间片均安排给I∩J中的作业,且I\J中最早被安排的是作业b, 在时间片k上,则k>fa。
单机作业调度问题的贪心算法
proc GreedyJob(D,J,n,k) //D(1),…,D(n)是期限值,作业已按p1 ≥ p2 ≥ … ≥ pn排序。J(i)是最 //优解中的第i个作业。终止时,D(J(i))≤ D(J(i+1)),1≤i≤k integer D[0..n],J[0..n],i,k,n,r D(0):=0; J(0):=0; //初始化 k:=1; J(1):=1; //计入作业1,k 表示当前选择的作业个数 for i from 2 to n do //按p的非增次序考虑作业,找i的位置,并检查插入的可能性 r:= k; while D(J(r))>D(i) and D(J(r))< > r do r:= r-1; end{while}; //期限不晚于D(i)的作业个数小于D(i)时 if D(J(r)) ≤ D(i) and D(i) > r then for j from k to r+1 by –1 do //给作业i腾出位置 J(j+1):=J(j); end{for}; J(r+1):=i; k:=k+1; end{if}; end{for}; end{GreedyJob}
多机作业调度问题
有n项独立的作业{1,2,…, n},由m台相同的机器加工处理。作业 i 所需要的处理时间为ti。约定:任何一项作业可在任何一台机器 上处理,但未完工前不准中断处理;任何作业不能拆分更小的子 作业分段处理。多机调度问题要求给出一种调度方案,使所给的 n个作业在尽可能短的时间内由m台机器处理完。 贪心准则:将加工时间长的作业优先安排给空闲早的机器。 例子:三台机器,七项作业,所需加工时间分别 2,14,4,16,6,5,3 将作业按照所需加工时间由长到短排序:4,2,5,6,3,7,1 机器M1 机器M2 机器M3
时间复杂度
程序GreedyJob的关键操作是比较,即是如何判断 “J ∪ {i} 中 的作业是相容的”。如果每选入一个作业i的期限为t,J中至少有t 个作业的期限不晚于t,则J ∪ {i}一定是不相容的。反之,若J 中 期限不晚于t的作业少于t个,则作业i可插入到作业集J中,即J ∪ {i}一定是相容的。因而,J ∪ {i}的相容性判断最坏情况下需要做 |J|次比较。最坏情况下的时间复杂度为 O(n2)。 例子 设n=7, (p1, p2,… , pn)=(35,30,25,20,15,10,5), (d1, d2,… ,dn)=(4,2,4,3,4,8,3), 算法GreedyJob的执行过程。 d1 ; d2, d1;d2, d1, d3;d2, d4, d1, d3; d2, d4, d1,d3, d6; 4; 2, 4; 2,4, 4; 2, 3, 4, 4; 2, 3, 4, 4, 8;
调度问题
活动安排问题 已知n个活动 E={1, 2, … ,n},要求使用同一 资源,第k个活动要求的 开始和结束时间为sk, fk, 其中sk <fk,k=1, 2, … , n . 活动k与活动j称为相 容的如果sk >fj或者 sj >fk。活动安排问题就 是要在所给的活动集合 中选出最大(活动个数最 多)的相容活动子集。 proc GreedyAction(s, f,n) //s[1..n]、f[1..n]分别代表n项活动 //的起始时间和结束时间, 并且满 //足f[1]≤ f[2]≤…≤ f[n] j:=1; solution:={1}; //解向量初始化 for i from 2 to n do if si≥fj then // 将j加入解中 solution:=solution ∪ {j}; j:=i; end{if} end{for} return(solution); end{GreedyAction}
前k-1个时间片上安排的都是I∩J中的作业,这些作业的集A1 再添上作业 a 得到 J 中k个作业。由作业集的相容性, A1中至少 有一个作业其期限值≥k。将这个作业与作业b交换安排的时间 片,得到新的调度表S1。如果在调度表S1中作业 b 安排在时间 片 k1,且k1>fa , 则同理,可以将作业 b 再向前移,得到新的调 度表S2。如此做下去,必得到 I 的调度表S′,其在时刻 fa 前的时 间片安排有 I\J 中作业 b 。令 I′=(I\{b})∪{a},则 I′ 也是相容的 作业集。而且,由于pb≤pa, I′ 的效益总值不小于 I 的效益总 值,因而 I′ 具有最大的效益总值,但| I′ ∩J|>|I∩J|,与 I 的选取 相悖。因而,I=J,J 是最优解。 证毕
背包问题
背包容量为M ,物品件数 n。重量wi , 价值pi 变量 xi , 0≤xi≤1 数学模型 max∑pixi s.t. ∑wixi ≤M 贪心准则: 1. 价值大的物品优先装包; 2. 重量轻的物品优先装包; 3. 单位价值大的物品优先装包。 例子 n=3, M=20, p=(25, 24, 15), w=(18,15,10) 结论:以“单位价值最大的物品优先装包”为贪心准则的贪 心算法获得的效益值最大。
背包问题的贪心算法
proc GreedyKnapsack (p, w, M, x, n) //价值数组p[1..n]、重量数 //组w[1..n],它们元素的排列顺序满足p[i]/w[i]≥p[i+1]/w[i+1] //M是背包容量,x[1..n]是解向量 float p[1..n], w[1..n], x[1..n], M, rc; integer i, n; x:= 0; // 将解向量初始化为零 rc:= M; // 背包的剩余容量初始化为M for i to n do if w[i] ≤ rc then x[i]:=1; rc:=rc-w[i]; else break; end{if} end{for} if i≤n then x[i]:=rc/w[i]; end{if} end{GreedyKnapsack}
这样取的向量是 ∑n pi zi = 1∑n pi yi + ( zk − yk )wk pk / wk − k +∑≤n ( yi − zi )wi pi / wi 1≤i ≤ ≤i ≤ 1≤i 可行解,而且, ⎛ ⎞ ≥ ∑ pi yi + ⎜ ( zk − yk )wk − ∑ ( yi − zi )wi ⎟ pk / wk 总价值为: k +1≤i ≤n 1≤i ≤n ⎝ ⎠ 与 x相同分量的个数增1
i i
y1 = x1 ,L , yk −1 = xk −1 , yk < xk 及
∑wy
=M
∑w y
i
n
i
≥ wk ( x k − y k ) > 0
0 ≤ z k +1 ≤ y k +1 , L ,0 ≤ z n ≤ y n
k +1≤ i ≤ n
∑ wi ( yi − zi ) = wk ( zk − yk )
带期限的单机作业安排问题
已知n项作业 E={1, 2, … ,n} 要求使用同台机器完成(该 台机器在同一时刻至多进行 一个作业),而且每项作业 需要的时间都是1。第k项作 业要求在时刻dk之前完成, 而且完成这项作业将获得效 益pk,k=1, 2, … , n 。 作业集E的子集称为相容的 如果其中的作业可以被安排 由一台机器完成。带限期单 机作业安排问题就是要在所 给的作业集合中选出总效益 值最大的相容子集。 proc GreedyJob(d, p, n) //d[1..n]和p[1..n]分别代表各项 //作业的限期和效益值,而且n //项作业的排序满足: //p1 ≥ p2 ≥ … ≥ pn local J; J:={1}; //初始化解集 for i from 2 to n do if J ∪ {i} 中的作业是相容的 then //此步验证需要认真设计 J:= J ∪ {i}; // 将i加入解中 end{if} end{for} end{GreedyJob}
算法基本思想 调度问题 最小生成树问题 单点源最小路径问题 Huffman编码
贪心算法的基本思想
找零钱:给孩子找回87分硬币,现有硬币规格50分、10分、 5分、2分、1分。 50+3*10+5+2=87 一般方法:尽量找面值大的硬币。 装箱问题:有物品n件,重量分别是 w1,…,wn ; 有箱子m个: B1,…,Bm,每个的容量都是C(C≥wi)。设计装箱方法,使得 所用箱子最少。 1. NF(Next Fit)方法:前面的箱子不能再装了,才开始装下一 个箱子。 2. FF(First Fit)方法:每个物品都选择装进第一个可装的箱子 贪心算法的基本思想: 在每一步决策中总是作出在当前看来是最好的选择 贪心准则,局部最优。
=1≤iΒιβλιοθήκη ≤n∑ pyi i
贪心算法抽象控制流程
proc Greedy(A, n) // A[1:n]代表输入 solution={}; //解初始化为空集 for i to n do x:=Select(A); if Feasible(solution, x) then solution:=Union(solution, x); end{if} end{for} return(solution); end{Greedy} Select(A)是按照贪心 准则选取A中的输入 项; Feasible(solution, x)是 判断已知的解的部分 solution与新选取的x 的结合是否是可行 解。 Union(solution, x)x与 已经选到的部分 solution结合成解的更 大部分
GreedyJob获得最优解
假设贪心算法所选择的作业集J不是最优解,则一定有相容作 业集I,其产生更大的效益值。假定I是具有最大效益值的相容作 业集中使得|I∩J|最大者,往证 I=J。 反证法:若I=J 不成立,则这两个作业集合之间没有包含关 系。这是因为算法GreedyJob的特性和假定I 产生的效益值比J的 效益值更大。假设a是J\I中具有最大效益的作业,即J中比a具有 更大效益的作业(如果有的话)都应该在 I 中。如果作业 b∈I\J 且 pb>pa,那么由算法中对J中作业的选取办法(相容性要求),J中 至少有 fb个效益值≥pb的作业,其期限值≤ fb。这些作业一定在 I 中,因而 I 中至少有个fb+1作业,其期限值≤ fb ,这与 I 的相容性 矛盾。所以,I\J中事件的效益值均不超过pa。 称区间[k-1,k]为时间片k,相容作业集 I 的一个调度表就是指定 I 中各个作业的加工时间片。如果 I 有一个调度表 S 将时刻 fa前 的时间片均安排给I∩J中的作业,且I\J中最早被安排的是作业b, 在时间片k上,则k>fa。
单机作业调度问题的贪心算法
proc GreedyJob(D,J,n,k) //D(1),…,D(n)是期限值,作业已按p1 ≥ p2 ≥ … ≥ pn排序。J(i)是最 //优解中的第i个作业。终止时,D(J(i))≤ D(J(i+1)),1≤i≤k integer D[0..n],J[0..n],i,k,n,r D(0):=0; J(0):=0; //初始化 k:=1; J(1):=1; //计入作业1,k 表示当前选择的作业个数 for i from 2 to n do //按p的非增次序考虑作业,找i的位置,并检查插入的可能性 r:= k; while D(J(r))>D(i) and D(J(r))< > r do r:= r-1; end{while}; //期限不晚于D(i)的作业个数小于D(i)时 if D(J(r)) ≤ D(i) and D(i) > r then for j from k to r+1 by –1 do //给作业i腾出位置 J(j+1):=J(j); end{for}; J(r+1):=i; k:=k+1; end{if}; end{for}; end{GreedyJob}
多机作业调度问题
有n项独立的作业{1,2,…, n},由m台相同的机器加工处理。作业 i 所需要的处理时间为ti。约定:任何一项作业可在任何一台机器 上处理,但未完工前不准中断处理;任何作业不能拆分更小的子 作业分段处理。多机调度问题要求给出一种调度方案,使所给的 n个作业在尽可能短的时间内由m台机器处理完。 贪心准则:将加工时间长的作业优先安排给空闲早的机器。 例子:三台机器,七项作业,所需加工时间分别 2,14,4,16,6,5,3 将作业按照所需加工时间由长到短排序:4,2,5,6,3,7,1 机器M1 机器M2 机器M3
时间复杂度
程序GreedyJob的关键操作是比较,即是如何判断 “J ∪ {i} 中 的作业是相容的”。如果每选入一个作业i的期限为t,J中至少有t 个作业的期限不晚于t,则J ∪ {i}一定是不相容的。反之,若J 中 期限不晚于t的作业少于t个,则作业i可插入到作业集J中,即J ∪ {i}一定是相容的。因而,J ∪ {i}的相容性判断最坏情况下需要做 |J|次比较。最坏情况下的时间复杂度为 O(n2)。 例子 设n=7, (p1, p2,… , pn)=(35,30,25,20,15,10,5), (d1, d2,… ,dn)=(4,2,4,3,4,8,3), 算法GreedyJob的执行过程。 d1 ; d2, d1;d2, d1, d3;d2, d4, d1, d3; d2, d4, d1,d3, d6; 4; 2, 4; 2,4, 4; 2, 3, 4, 4; 2, 3, 4, 4, 8;
调度问题
活动安排问题 已知n个活动 E={1, 2, … ,n},要求使用同一 资源,第k个活动要求的 开始和结束时间为sk, fk, 其中sk <fk,k=1, 2, … , n . 活动k与活动j称为相 容的如果sk >fj或者 sj >fk。活动安排问题就 是要在所给的活动集合 中选出最大(活动个数最 多)的相容活动子集。 proc GreedyAction(s, f,n) //s[1..n]、f[1..n]分别代表n项活动 //的起始时间和结束时间, 并且满 //足f[1]≤ f[2]≤…≤ f[n] j:=1; solution:={1}; //解向量初始化 for i from 2 to n do if si≥fj then // 将j加入解中 solution:=solution ∪ {j}; j:=i; end{if} end{for} return(solution); end{GreedyAction}
前k-1个时间片上安排的都是I∩J中的作业,这些作业的集A1 再添上作业 a 得到 J 中k个作业。由作业集的相容性, A1中至少 有一个作业其期限值≥k。将这个作业与作业b交换安排的时间 片,得到新的调度表S1。如果在调度表S1中作业 b 安排在时间 片 k1,且k1>fa , 则同理,可以将作业 b 再向前移,得到新的调 度表S2。如此做下去,必得到 I 的调度表S′,其在时刻 fa 前的时 间片安排有 I\J 中作业 b 。令 I′=(I\{b})∪{a},则 I′ 也是相容的 作业集。而且,由于pb≤pa, I′ 的效益总值不小于 I 的效益总 值,因而 I′ 具有最大的效益总值,但| I′ ∩J|>|I∩J|,与 I 的选取 相悖。因而,I=J,J 是最优解。 证毕
背包问题
背包容量为M ,物品件数 n。重量wi , 价值pi 变量 xi , 0≤xi≤1 数学模型 max∑pixi s.t. ∑wixi ≤M 贪心准则: 1. 价值大的物品优先装包; 2. 重量轻的物品优先装包; 3. 单位价值大的物品优先装包。 例子 n=3, M=20, p=(25, 24, 15), w=(18,15,10) 结论:以“单位价值最大的物品优先装包”为贪心准则的贪 心算法获得的效益值最大。
背包问题的贪心算法
proc GreedyKnapsack (p, w, M, x, n) //价值数组p[1..n]、重量数 //组w[1..n],它们元素的排列顺序满足p[i]/w[i]≥p[i+1]/w[i+1] //M是背包容量,x[1..n]是解向量 float p[1..n], w[1..n], x[1..n], M, rc; integer i, n; x:= 0; // 将解向量初始化为零 rc:= M; // 背包的剩余容量初始化为M for i to n do if w[i] ≤ rc then x[i]:=1; rc:=rc-w[i]; else break; end{if} end{for} if i≤n then x[i]:=rc/w[i]; end{if} end{GreedyKnapsack}
这样取的向量是 ∑n pi zi = 1∑n pi yi + ( zk − yk )wk pk / wk − k +∑≤n ( yi − zi )wi pi / wi 1≤i ≤ ≤i ≤ 1≤i 可行解,而且, ⎛ ⎞ ≥ ∑ pi yi + ⎜ ( zk − yk )wk − ∑ ( yi − zi )wi ⎟ pk / wk 总价值为: k +1≤i ≤n 1≤i ≤n ⎝ ⎠ 与 x相同分量的个数增1
i i
y1 = x1 ,L , yk −1 = xk −1 , yk < xk 及
∑wy
=M
∑w y
i
n
i
≥ wk ( x k − y k ) > 0
0 ≤ z k +1 ≤ y k +1 , L ,0 ≤ z n ≤ y n
k +1≤ i ≤ n
∑ wi ( yi − zi ) = wk ( zk − yk )
带期限的单机作业安排问题
已知n项作业 E={1, 2, … ,n} 要求使用同台机器完成(该 台机器在同一时刻至多进行 一个作业),而且每项作业 需要的时间都是1。第k项作 业要求在时刻dk之前完成, 而且完成这项作业将获得效 益pk,k=1, 2, … , n 。 作业集E的子集称为相容的 如果其中的作业可以被安排 由一台机器完成。带限期单 机作业安排问题就是要在所 给的作业集合中选出总效益 值最大的相容子集。 proc GreedyJob(d, p, n) //d[1..n]和p[1..n]分别代表各项 //作业的限期和效益值,而且n //项作业的排序满足: //p1 ≥ p2 ≥ … ≥ pn local J; J:={1}; //初始化解集 for i from 2 to n do if J ∪ {i} 中的作业是相容的 then //此步验证需要认真设计 J:= J ∪ {i}; // 将i加入解中 end{if} end{for} end{GreedyJob}