算法分析与设计PPT教学课件 Algorithms Chapter 8 动态规划
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算二项式系数
二项式系数(Binomial Coefficient )
是n元素集合中k个元素组合的数量(0≤k ≤n),记作 C(n.k)或者Cnk,来源于二项式公式:
(a+b)n=Cn0an+…+Cnian-ibi+…+Cnnbn
Cn0=Cnn=1
递推关系式:
当n>k>0时,Cnk=Cn-1k-1+Cn-1k
10
标准动态规划的基本框架 1. 2. 3. 4. 5. 6. 7. 对fn+1(xn+1)初始化; {边界条件} for k:=n downto 1 do for 每一个xk∈Xk do for 每一个uk∈Uk(xk) do begin fk(xk):=一个极值; xk+1:=Tk(xk,uk); t:=φ(fk+1(xk+1),vk(xk,uk)); {∞或-∞} {状态转移方程} {基本方程(9)式}
15
多段图
multistage graph problem
s
v2 v3
vk-1
t
Forward approach Backward approach
证最佳原理成立
多段图(multistage graph problem)
V1 9 V2 V3 1 V4 6 5 3 5 4 V5
2
2
7 3
s 1
2
3
算法分析与设计
动态规划
Dynamic programming
动态规划的定义
动态规划(Dynamic programming)是一种算法设计技术, 是用来解决一种多段决策过程最优的通用方法。 多段决策过程最优
V1 9
V2
V3
1 2 2
V4
6
V5
2
7 3
s 1
2
3
4 5
6 7
8
7 11 11
5
3 5
4
设原问题的规模为n,容易看出,当子问题树中的子问题总数是n的 超多项式函数,而不同的子问题数只是n的多项式函数时,动态规 划法显得特别有意义,此时动态规划法具有线性时间复杂性。所以, 能够用动态规划解决的问题还有一个显著特征:子问题的重叠性。 这个性质并不是动态规划适用的必要条件,但是如果该性质无法满 足,动态规划算法同其他算法相比就不具备优势。
9 10
4
2 5
12 t
multistage graph problem
8
6
11
多阶段决策过程,是指这样的一类特殊的活动过程,问题可以按时间顺序分解成若干相互联系的阶段
,在每一个阶段都要做出决策,全部过程的决策是一个决策序列。要使整个活动的总体效果达到最优 的问题,称为多阶段决策问题。 2
动态规划解决问题的思想
8. 优值}
if end;
t比fk(xk)更优 then fk(xk):=t; {计算fk(xk)的最 {∞或-∞}
{按照10式求出最
9. t:=一个极值; 10. for 每一个x1∈X1 do
11. if f1(x1)比t更优 then t:=f1(x1); 优指标} 12. 输出t;
但是,实际应用当中经常不显式地按 步骤(1)--(3)是动态规划算法 照上面步骤设计动态规划,而是按以 的基本步骤。在只需要求出 最优值的情形,步骤(4)可以 下几个步骤进行: 省略, 1. 分析最优解的性质,并刻划其结构 若需要求出问题的一个最优 特征。 解,则必须执行步骤(4)。此 时,在步骤(3)中计算最优值 2. 递归地定义最优值。 3. 以自底向上的方式或自顶向下的记 时,通常需记录更多的信息, 以便在步骤(4)中,根据所记 忆化方法(备忘录法)计算出最优值。 录的信息,快速地构造出一 4. 根据计算最优值时得到的信息, 个最优解。 构造一个最优解。 (类似:合并排序,P97)
动态规划算法的基本步骤
划分阶段:
按照问题的时间或空间特征,把问题分为若干个阶段。
选择状态:
将问题发展到各个阶段时所处于的各种客观情况用不同的 状态表示出来。
确定决策并写出状态转移方程:
状态转移就是根据上一阶段的状态和决策来导出本阶段的 状态。
写出规划方程(包括边界条件):
动态规划的基本方程是规划方程的通用形式化表达式。
for(i0;i<=n;i++) for(j0;j<=min(i,k);j++) if(j=0 || j=k) C[i,j]=1; else C[i,j]C[i-1,j-1]+C[i-1,j]; Return C[n,k];
思考:利用公式 1、C(n,k)=n!/k!(n-k)! 2、C(n,k)=n(n-1)…(nk+1)/k! 与动态规划计算比较, 那一个的效率高?
R(0),…, R(k-1), R(k),…, R(n)
vi,每个节点编号都不大于k的中间节点集,vj
24
Warshall算法思想
确定递推关系式
对于路径: vi,每个节点编号都不大于k的中间节点集C,vj 情况1:k∈C,那么中间节点集合的节点编号定不 会大于k-1,因此有: rij(k)=rij(k-1) , k∈C 情况2: k∈C ,则有路径:
( j , r )E
7 4 2
3 4 5
cost ( j ) min {c( j, r ) cost (r )}
(n e)
D(j)=r Repeat P(1)=1;p(k)=n For j=2 to k-1 do P(j)=D(P(j-1)) repeat
( k )
多段图的向后处理算法
B cost (i, j ) min {B cost (i 1, l ) c(l , j )}
lVi1 ( l , j )E
计算有向图的传递闭包
22
有向图的传递闭包
一个n顶点有向图的传递闭包可以定义为一个n阶 布尔矩阵T={tij},如果顶点i到顶点j存在一条有效 路径,则tij=1,否则tij=0。
5
2.无后向性
将各阶段按照一定的次序排列好之后,对于某个给定 的阶段状态,它以前各阶段的状态无法直接影响它未来 的决策,而只能通过当前的这个状态。换句话说,每个 状态都是过去历史的一个完整总结。这就是无后向性, 又称为无后效性。
3.子问题的重叠性
动态规划将原来具有指数级复杂度的搜索算法改进成了具有多项 式时间的算法,其中的关键在于解决冗余,这是动态规划算法的根 本目的。动态规划实质上是一种以空间换时间的技术,它在实现的 过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度 要大于其它的算法。
26
Warshall算法实例
27
Warshall算法
算法 Warshall(A[1..n,1..n]) //实现计算传递闭包的Warshall算法 //输入:包括n个节点有向图的邻接矩阵 //输出:该有向图的传递闭包 R(0)A for(k1;k<=n;k++)
Warshall算法的时 间效率是Θ(n3)
vi,编号≤k-1的节点集,k,编号≤k-1的节点集, vj 此时节点i到节点j是否有路径,取决于两部分“编号≤k-1
的节点集”,因此有:
rij(k)=rik(k-1) 和 rkj(k-1) , k∈C
25
Warshall算法思想
递推关系式
rij(k)=
rij(k-1) , k∈C rik(k-1) 和 rkj(k-1) , k∈C
2
6
7 11 11
9
4 2 5
4
7
8
10
12 t
8 6 11 5 多段图G=(V,E)是—个有向图。它具有如下特性:
图中的结点被划分成k≥ 2个不相交的集合Vi ,1≤i≤k,其中V1和Vk分 别只有一个结点s(源点)和t(汇点)。 图中所有的边<u,v>均具有如下性质:若u∈Vi ,则v ∈ Vi+1 ,1≤i≤k, 且每条边<u,v>均附有成本c(u,v)。 从s到t的一条路径成本是这条路径上边的成本和。 多段图问题(multistage graph problem)是求由s到t的最小成本路径。
如果问题是由交叠的子问题构成,我们就可以用动 态规划技术来解决。 一般来说这样的子问题出现在给定问题求解的递推 关系中,这个递推关系中包含了相同类型的更小的 子问题。 动态规划的解决该类问题的思想:
对较小的子问题进行一次求解,并把结果记录下来,然后 利用较小问题的解,求解出较大问题的解,直到求解出最 大问题的解。
动态规划的实质是分治思想和解 决冗余,因此,动态规划是一种 将问题实例分解为更小的、相似 的子问题,并存储子问题的解而 避免计算重复的子问题,以解决 最优化问题的算法策略。
动态规划法与分治法和贪心法
它们都是将问题实例归纳为更小的、相似的子问题,并通过 求解子问题产生一个全局最优解。 贪心法的当前选择可能要依赖已经作出的所有选择,但不依 赖于有待于做出的选择和子问题。因此贪心法自顶向下,一 步一步地作出贪心选择;而分治法中的各个子问题是独立的 (即不包含公共的子子问题),因此一旦递归地求出各子问题 的解后,便可自下而上地将子问题的解合并成问题的解。 但不足的是,如果当前选择可能要依赖子问题的解时,则难 以通过局部的贪心策略达到全局最优解;如果各子问题是不 独立的,则分治法要做许多不必要的工作,重复地解公共的 子问题。 解决上述问题的办法是利用动态规划。
18
例
V1 V2 V3 4 2 2 7 1 11 11 8 V4 6 5 4 3 5 V5
2
9
6 7 8
9
4 10 2 1 11 12
1
7 4 2
3 4 5
6
V1
V2
V3 4 2 2 7 1 11 11 8
V4
V5
2
9
6 7 8
算法 6 9
5 4 3 5 6 11 4 10 2 1 12
1
Cost(n)=0 For j=n-1 to 1 by –1 do
17
多段图向前处理的算法
设P(i,j)是一条从Vi中的节点j到汇点t的最小成 本路径,COST(i,j)表示这条路径的成本,根 据向前处理方法有:
j l
t
vi Vi+1 首先对于所有j∈Vi,计算COST(i-1,j),然后对所有 的l∈Vi+1,计算计算COST(i,l)等等,最后计算出计 算COST(1,s)
2 …
k …
1
1
2
1
1
n-1
n
1
1
C(n-1,k-1) C(n-1,k)
C(n,k)
C(n,k)=C(n-1,k-1)+C(n-1,k),n>k>0 C(n,0)=C(n,n)=1
帕斯卡三角形
14
二项式系数算法
算法 Binomial(n,k)
//用动态规划算法计算C(n,k) //输入:一对非负整数n≥k ≥0 //输出:C(n,k)的值
无论过程的初始状态和初始决策是什么,其余的 决策都必须相对于初始决策所产生的状态构成一 个最优决策序列。 原理告诉我们,一个最优问题的任何实例的最优 解是由该实例的子实例的最优解组成的。 一般来说,如果所求解问题对于最优性原理成立, 则说明用动态规划方法有可能解决该问题。而解 决问题的关键在于获取各阶段间的递推关系式。
如果使用邻接链表 来表示图,用图的 for(i1;i<=n;i++) 遍历的效率要比 for(j1;j<=n;j++) Warshall好 R(k)[i,j]R(k-1)[i,j] or R(k-1)[i,k] ak)=C(n-1,k-1)+C(n-1,k),n>k>0 C(n,0)=C(n,n)=1 如:C(2,1)=C(1,0)+C(1,1)=1+1=2 C(3,1)=C(2,0)+C(2,1)=1+2=3 …
13
二项式系数 (Binomial Coefficient )
C(n,k) 0 1 0 1 1 1 1 2 … k-1 k
可以采用深度优先或广度优先来遍历有向图生成传递闭包。
23
Warshall算法思想
划分阶段
用n阶布尔矩阵R(k)(0≤k ≤n)来表示有向图中任 意一对节点是否有有向路径的信息。 具体来说,当且仅当,从节点i到节点j存在一 条有向路径,且该路径上的每一个中间节点的 编号都不大于k时,矩阵R(k)的第i行第j列的元 素rij(k)=1。 因此,可将原问题划分为如下的决策阶段:
Fibonacci sequence: 0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , … Fi = i if i 1 Fi = Fi-1 + Fi-2 if i 2
3
动态规划的适用条件
1.最优化原理(最优子结构性质) 2.无后向性 3.子问题的重叠性
最优性原理(Principle of Optimality) 最优性原理(Principle of Optimality)