lecture4-08

动态规划
动态规划 (Dynamic Programming) ? 基本思想和使用条件 ? 动态规划算法的设计步骤 ? 应用实例 ? 小结
1

基本思想和使用条件
例1 求从始点到终点的最短路径
d,15 S1 u,13
S2
d,11 6 4 7 5 4 d9 d,9
A1
3 4 3
B1 u,5
B2
9 3 6
u,2 2 C1 d,3 4 C2 u,7 7
C3
T1 5 T2 3 T3 7 T4 6 T5
2
u,8 8
A2
d,10 S3
d,6
2 u,7 4 B3 3 2 1 d,5 B4 5 u,4 B5 1 4 3
A3 d,11 9 S4 4 u,7 u,10 S5 3
A4
2
u,1 C4
1

基本思想
解 判断序列 解:判断序列
F (C l ) = min{C l Tm )
m l
F ( Bk ) = min{ Bk C l + F (C l )} F ( A j ) = min{ A j Bk + F ( Bk )}
k
F ( S i ) = min{ S i A j + F ( A j )}
j
任何最短路径的子路径都是相对于子路径的始 点和终点的最短路径 为找一条最短路径只需从 为找 条最短路径只需从Tj开始进行多步判断
3

使用条件:优化原则
一个最优决策序列的任何子序列本身一定是相对于 子序列的初始和结束状态的最优的决策序列 例2 求总长模10的最小路径 d,1 2 S 5 5 5 5 u,6 2 u,4 2 u,2 2 T
最优解:下、下、下、下 最优解 下 下 下 下 动态规划求解:下、上、上、上 不满足优化原则 不能使用动态规划设计技术 不满足优化原则,不能使用动态规划设计技术
4

算法设计步骤
例3 矩阵乘法: 设A1,A2,…,An为矩阵序列,Ai为Pi-1×Pi阶 矩阵,i = 1,2,…,n. 确定乘法顺序使得元素相乘的总 次数最少. 输入:向量P = 实例: P = <10, 100, 5, 50> A1: 10 × 100, 100 A2: 100 × 5, 5 A3: 5 × 50, 50 乘法次序 (A1 A2)A3: 10 × 100 × 5 + 10 ×5 × 50 = 7500 A1(A2 A3): 10 × 100 × 50 + 100 × 5 × 50 = 75000
5

搜索空间的规模
1 ? 2n ? ? ? 一般算法:加括号的方法有 种, ? ? n +1? n ?
Catalan数
2n 2n 2π 2n ( ) 1 1 ( 2n)! e W ( n) = Ω( ) ) = Ω( n + 1 n! n! n + 1 2πn ( n )n 2πn ( n )n e e 1 n 22n n2ne ne n 2n 2 = Ω( ) = Ω ( 2 / n ) 1 1 n + 1 2n 2 n 2 n e nnnn
6
1 2
3

动态规划算法
输入P=< P0, P1, …, Pn> , Ai..j 表示乘积AiAi+1…Aj 的结果, 的结果 其最后一次相乘是 Ai..j = Ai..k Ak+1..j , m[i,j] 表示得到 Ai..jj 的最少的相乘次数 递推方程
i= j ? ?0 m[ i , j ] = ? min { m[i , k ] + m[k + 1, j ] + P P P } i < j i ?1 k j ? i ≤ k < j ?
为了确定加括号的次序,设计表 s[i,j],记录求得最优时 最后一次运算的位置 最后 次运算的位置
7

算法1:递归实现 递归实现
算法1 RecurMatrixChain(P,i,j) 1. m[i,j]←∞ 2. s[i,j]←i 3. for k←i to j?1 do 4 4. q ← RecurMatrixChain( R M t i Ch i (P,i,k P i k) + RecurMatrixChain(P,k+1,j) + pi?1 pk pj 5 5. if q8

递归实现的复杂性
复杂性满足递推关系
? O (1 ) ? T ( n ) ≥ ? n ?1 ∑ (T ( k ) + T ( n ? k ) + O (1 )) ? ? k =1
n?1 n?1 k =1 k =1
n=1 n>1
n?1
T (n) ≥ O (n) + ∑ T (k ) + ∑ T (n ? k ) = O (n) + 2 ∑ T (k )
k =1
数学归纳法证明 T(n)≥2n?1 n=2,显然为真 =2 显然为真 假设对于任何小于n 的 k 命题为真, 则
T ( n ) ≥ O ( n ) + 2 ∑ T ( k ) ≥ O ( n ) + 2 ∑ 2 k ?1
k =1 k =1 n ?1 n ?1
= O ( n) + 2( 2 n?1 ? 1) ≥ 2 n ?1
9

复杂性高的原因
原因:子问题重复程度高
10

算法2:迭代实现
算法2 MatrixChain(P,n) 1.令所有的 令所有的 m[i,j]初值为0 2.for r ←2 to n do // r为计算的矩阵链长度// 3. for i ←1 to n?r+1 do //n-r+1为最后r链的始位置// 4. j ←i+r?1 // 计算链i—j // // Ai(Ai+1..Aj) )// 5. m[i,j] ← m[i+1,j] + pi?1*pi*pj 6. s[i,j] ← i //记录分割位置// 7. for k ←i+1 to j?1 do 8 8. t ←m[i,k]+m[k+1, +1 j]+ pi?1*pk*pj //(Ai..Ak)(Ak+1..Aj)// 9. if t11

迭代过程的 个实例 迭代过程的一个实例
A1
r=2 2 r=3 r=4 r=5 5 r=6 r=7 r=8
12
A2
A3
A4
A5
A6
A7
A8

两种算法的比较
递归算法:复杂性高 归算法 复杂性高 非递归算法:复杂性较低 原因 ? 递归动态规划算法的子问题被多次重复计算 ? 子问题计算次数呈指数增长 ? 非递归动态规划算法每个子问题只计算一次 ? 子问题的计算随问题规模成多项式增长
13

动态规划算法设计步骤
?
将问题表示成多步判断 确定子问题的边界 将问题表示成多步判断,确定子问题的边界
? ?
整个判断序列就对应问题的最优解 每步判断对应一个子问题 子问题类型与原问题一样 每步判断对应一个子问题,子问题类型与原问题一样
? ? ? ? ? ? ?
确定优化函数,以函数的极大(或极小)作为判断的依据 确定是否满足优化原则-----动态规划算法的必要条件 确定子问题的重叠性 列出关于优化函数的递推方程(或不等式)和边界条件 自底向上计算子问题的优化函数值 备忘录方法(表格)存储中间结果 设立标记函数s[i,j]求解问题的解
14

投资问题
m 元钱, 元钱 n 项投资, 项投资 fi (x): ) 将 x 元投入第 i 项项目的效益 目标函数 max {f1(x1) + f2(x2) + … + fn(xn) } 约束条件 x1 + x2 + … + xn = m,xi ∈ N 实例:5万元钱,4个项目,效益函数如下表所示
x 0 1 2 3 4 5 f1(x) 0 11 12 13 14 15 f2(x) 0 0 5 10 15 20 f3(x) 0 2 10 30 32 40 f4(x) 0 20 21 22 23 24
15

算法设计
设Fk(x) 表示 x元钱投给前k 个项目的最大效益 多步判断 假设知道 p 元钱(p ≤ x)投给前 k?1个项目的最大效 益,决定 x 元钱投给前 k 个项目的分配方案 递推方程和边界条件
Fk ( x ) = max { fk ( xk ) + Fk ?1 ( x ? xk )} k > 1
0≤ xk ≤ x
F1 ( x ) = f1 ( x )
16

算法设计
x 1 2 3 4 5 F1(x) x1(x) 11 12 13 14 15 1 2 3 4 5 F2(x) x2(x) 11 12 16 21 26 0 0 2 3 4 F3(x) x3(x) 11 13 30 41 43 0 1 3 3 4 F4(x) x4(x) 20 31 33 50 61 1 1 1 1 1
解 x1 =1, 1 x2 =0, 0 x3=3, 3 x4 =1 1 F4(5) = 61
17

算法的复杂度分析
表中有 m 行 n 列, 共计 mn 项
Fk ( x ) = max { fk ( xk ) + Fk ?1 ( x ? xk )} k > 1
0≤ xk ≤ x
F1 ( x ) = f1 ( x )
对第Fk(x)项 (2≤k≤n,1≤x≤ m) 需要 x+1次加法, x 次比较
加法次数 比较次数
1 ( x + 1) = ( n ? 1)m ( m + 3) ∑∑ 2 k = 2 x =1 1 x = ( n ? 1)m ( m + 1) ∑∑ 2 k = 2 x =1 W ( n) = O( nm 2 )
18
n
m
n
m

背包问题 (Knapsack Problem)
一个旅行者准备随身携带一个背包 个旅行者准备随身携带 个背包. 可以放入背包的物品 有n 种, 每种物品的重量和价值分别为 wj , vj . 如果背包的 最大重量限制是 b, 怎样选择放入背包的物品以使得背包 的价值最大?
目标函数 约束条件 max
∑v
j=1
n
j
xj

n
j=1
w j x j ≤ b,
线性规划问题 由线性条件约束的线性函数取最大或最小的问题 整数规划问题 线性规划问题的变量 xj 都是非负整数
xj∈ N
19

算法设计
设 Fk(y) 表示只允许装前 k 种物品,背包总重不超过 y 时 背包的最大价值 递推方程与边界条件
Fk ( y ) = max{ {Fk ?1 ( y ), ) Fk ( y ? wk ) + vk } F0 ( y ) = 0, 0 ≤ y ≤ b Fk ( 0) = 0, 0 ≤ k ≤ n ? y? F1 ( y ) = ? ? v1 ? w1 ? Fk ( y ) = ?∞ ∞ y<0
20

相关主题
相关文档
最新文档