第七章 动态规划法1(算法分析与设计课件)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
k]
0 m[k 1,
j]
pi1
pk
pj}
i j i j
k 的位置只有 j i 种可能
7.3 矩阵连乘
自底向上计算最优解的值
由于在计算 m[i][ j]时,要求所有的 m[i][k]和m[k 1][ j]都需要已经计算 出来,即 m[i][i],m[i 1][ j],m[i][i 1],m[i 2][ j]...m[i][ j 1],m[ j][ j已] 经计算
矩阵连乘的运算量与矩阵的计算次序有关 例:四个矩阵连乘积ABCD,它们的维数分别:A:5X2 , B:2X4,C:4X3,D:3X5
由于矩阵乘法满足结合律,故矩阵连乘可有许多不同的计算次序,如 (AB)C)D的次数: 5X2X4+5X4X3+5X3X5=175 (A(BC))D的次数: 2X4X3+5X2X3+5X3X5=129
}
7.3 矩阵连乘
穷举法 动态规划法
分析最优解的结构 递归定义最优解的值 自底向上计算最优解的值
对于1≤i≤j≤n不同的有序对(i,j)对应于不同的子问题。因此,不同
子 在递问归题计的算个时数,最许多多只有子问题n2被 重n 复 计(n算2)。多次。这也是该问题可用动
m…[..1][3]=mmmin[[21{]][[mm23]][[==11]]mm[[12[[]21]++]][[mm12]][[++23]]mm[[33[[]23]++]][[PP3211]]PP++23PPPP4412==PP2373PP55340*==+1315355*5**5*15=15*52*1*60512==0527=65}2206525 m[3][5]=mmin[3{]m[4[]3=]m[3[]3+]m[3[]4+]m[5[]4+]P[43P]+4PP63=P54P*51=05**2100=*12000=01000
for (int k = i+1; k < j; k++) {
int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
if (t < m[i][j]) { m[i][j] = t; s[i][j] = k;}
}
}
}
7.3 矩阵连乘
穷举法 动态规划法
备忘录Fra Baidu bibliotek法
7.3 矩阵连乘
问题描述
给定n个矩阵 {A0 , A1,..., An1} ,其中 Ai 与 Ai1 是可乘的, 其中 i 0,1,2,...,n 1.考察这n个矩阵的连乘积 A0 A1... An1 矩阵连乘问题:是确定计算矩阵连乘积的计算次序,使得 依此次序计算矩阵连乘积,需要的数乘次数最少。
矩阵连乘的计算次序可以用完全加括号的形式来表示
7.3 矩阵连乘
相关知识回顾
矩阵相乘的运算量(数乘次数) 矩阵连乘的运算量与矩阵的计算次序有关 完全加括号的递归定义
单个矩阵是完全加括号的 矩阵连乘积A是完全加括号的,则A可表示为两个完全加 括号的矩阵连乘积B和C的乘积并加括号,即A=(BC)
最优化原理: 一个最优策略具有这样的性质:不论过去状态和决策如 何,对前面的决策所形成的状态而言,其余决策都必须 相对于初始决策所产生的状态构成一个最优决策序列.
第七章 动态规划法
如:修大学课程 对于一个多阶段过程问题,上述最优决策序列是否存
在,依赖于该问题的解是否具有最优子结构性质,而能否 采用动态规划法,还要看该问题的子问题是否具有重叠性质. 基本要素 最优子结构特性:
m[0][2]=mmin[{0][m0[]0=]0[,0…]+.m[51][52]=+0P;0sP[10P]3[=02]=6205…+s3[50]*[355]*=55=7875
m[0][m1][=0]m[1[0]+][m0][+2]m[2[1]+][P10]P+2PP30=P11P527=5300+*3305**1155*=51=517850000 }
算法总体思想
如果能够保存已解决的子问题的答案,而在需要时再 找出已求得的答案,就可以避免大量重复计算,从而 得到多项式时间算法。
=n T(n)
n/2
n/2
n/2
n/2
T(n/4) T(n/4)
T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4)
例7-5:求A0A1A2A3A4A5的积,其中A0:30*35, A1:35*
15 ,A2:15*5 ,A3:5*10 ,A4:10*20 ,A5:20*25
解:P:
m[i, j] m[i, k] m[k 1, j] pi pk1 p j1
30 35 15 5 10 20 25
原问题的最优解中包含了子问题的最优解
子问题的重叠性质:
每次产生的子问题并不总是新的子问题,有些子问题被反复计算 多次
第七章 动态规划法
例1.最短路径问题:
思考:是否可用贪心法求解此问题? 分析
具有最优子结构特性 对于最短路径问题,一个阶段的决策与后面所要求的子问题相关,
所以,不能在某个阶段直接做出决策
再看一例:
最优子结构:
如果ABEG是A 到G的最短路径,那 么ABE也是A到E的 最短路径。
第七章 动态规划法
例2.数塔问题:设有一个三角形数塔,求一自塔顶到塔底的 路径,且该路径上结点的值的和最大.
9 12 15
分析(自顶向下)
从结点9出发,到底选择12方向还是选择 15方向,取决于分别从12和15出发的两 条子路径上的最大路径值,设他们分别
0 5000
0
0 00 2 22 11 2 22
22 22 s=
334 44 5
用动态规划法求最优解
void MatrixChain(int *p,int n,int **m,int **s)
算法复杂度分析:
{
for (int i = 1; i <= n; i++) m[i][i] = 0; for (int r = 2; r <= n; r++)
m[4][m5][=3]m[4[4]+][m4][+5]m[5[5]+][5P]3+P5PP46P=5P56*=1100**2200=*12050=05}000
m=
0 15750 7875 9735 11875 15125
0 2625 4375 712510500
0 750 2500 5375 0 1000 3500
动态规划基本步骤
找出最优解的性质,并刻划其结构特征。 递归地定义最优值。 以自底向上的方式计算出最优值。 根据计算最优值时得到的信息,构造最
优解。
7.3 矩阵连乘
相关知识回顾
矩阵相乘的运算量(数乘次数) 设有矩阵Amxn 和Bnxp,则A和B是可乘的,乘积矩阵 Dmxp=Amxn XBnxp. 它的元素
for (int i = 1; i <= n - r+1; i++) { int j=i+r-1; m[i][j] = m[i+1][j]+ p[i-1]*p[i]*p[j]; s[i][j] = i;
算法matrixChain的主要计算量 取决于算法中对r,i和k的3重循 环。循环体内的计算量为O(1), 而3重循环的总次数为O(n3)。因 此算法的计算时间上界为O(n3)。 算法所占用的空间显然为O(n2)。
A[i:j]的计算量=A[i:k]的计算量+A[k+1:j]的计算量 +A[i:k]和A[k+1:j]相乘的计算量。 分析最优解的结构
特征:计算A[i:j]的最优次序所包含的计算矩阵子链 A[i:k]和A[k+1:j]的次序也是最优的。
7.3 矩阵连乘
递归定义最优解的值
设计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数 m[i,j],则原问题的最优值为m[1,n] 。
穷举法:
列举出所有可能的计算次序,并计算出每一种计算次序相 应需要的数乘次数,从中找出一种数乘次数最少的计算次序。
7.3 矩阵连乘
穷举法:
算法复杂度分析: 对于n个矩阵的连乘积,设其不同的计算次序为P(n)。
由于每种加括号方式都可以分解为两个子矩阵的加括号问 题:(A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式 如下:
态规划算法求解的又一显著特征。
用动态规划算法解此问题,可依据其递归式以自底向上的方式进行 计算。在计算过程中,保存已解决的子问题答案。每个子问题只计 算一次,而在后面需要时只要简单查一下,从而避免大量的重复计 算,最终得到多项式时间的算法。
7.4 最长公共子序列
T(n)
=n
T(n/2)
T(n/2)
T(n/2)
T(n/2)
算法总体思想
但是经分解得到的子问题往往不是互相独立的。不同子 问题的数目常常只有多项式量级。在用分治法求解时, 有些子问题被重复计算了许多次。
T(n)
=
n
n/2
n/2
n/2
n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4)
10 6 8
为x和y,
若x>y 9->12 最大路径为9+x
2 18 9 5
否则,9->15 最大路径为9+y
若9->12,则使用类似方法讨论10和6
19 7 10 4 16
当讨论进行到倒数第2层时,直接进行 选择
求解(自底向上)
算法总体思想
动态规划算法与分治法类似,其基本思想也是将待求解 问题分解成若干个子问题
当i=j时,A[i:j]=Ai,因此,m[i,i]=0,i=1,2,…,n 当i<j时,假设在Ak 和Ak+1之间分开,则
m[i, j] m[i, k] m[k 1, j] pi pk1 p j1
这里 Ai 的维数为 pi1 pi
m[i,
j]
mikin j{m[i,
计算顺序:
令m数组的主对角线上的元素m[i][i]=0, s[i][j]=i(0<=i<n) 然后从主对角线上一条次对角线开始,依次计算m的n-2条对角线元素,
并在s[i][j]中记录使得下式取得最小值的k.
m[i, j] m[i, k] m[k 1, j] pi pk1 p j1
int MatrixChain::LookupChain(int i, int j)
{
if (m[i][j]>0) return m[i][j];//子问题已经求解,直接引用
if(i==j) return 0;
//单一矩阵无须计算
int u=LookupChain(i+1, j)+p[i]*p[i+1]*p[j+1];//按式(7-9)求最小值
第七章 动态规划法
计算机科学与技术学院
通过应用范例学习动态规划算法设计策略。
(1)矩阵连乘问题; (2)最长公共子序列; (3)0/1背包问题; (4)流水作业调度;
第七章 动态规划法
是另一种求解最优化问题的算法设计策略 适合求解的问题(多阶段决策问题):
问题的活动过程可以分成若干个阶段,每个阶段包含一 个或多个状态,在任一阶段的决策仅依赖与该阶段的状 态,与该阶段之前的过程如何达到这种状态的方式无关, 这类问题的解决是多阶段的决策过程.
P(n)
n 1
P(k
1 )P(n
k
)
k 1
n 1 P(n) (4n / n3/ 2 ) n 1
7.3 矩阵连乘
动态规划法
将矩阵连乘积 Ai Ai1... Aj 简记为A[i:j] ,这里i≤j 考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵 Ak和Ak+1之间将矩阵链断开,i≤k<j,则其相应完全加括号方 式为 ( Ai Ai1... Ak )( Ak1Ak2... Aj ) 计算量:
s[i][j]=i;
for (int k=i+1; k<j; k++)
{ int t=LookupChain(i, k)+LookupChain(k+1, j)+p[i]*p[k+1]*p[j+1];
if (t<u)
{ u=t; s[i][j]=k; }
}
m[i][j]=u; return u;
//保存并返回子最优解值