动态规划-(矩阵连乘)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} return m[0][n-1]; }
12
4、构造最优解
void MatrixChain::Traceback(int i, int j) {
if(i==j) { cout<<'A'<<i; return;} if (i<s[i][j]) cout<<'('; Traceback(i, s[i][j]); if (i<s[i][j])cout<<')'; if(s[i][j]+1<j)cout<<'('; Traceback(s[i][j]+1, j); if(s[i][j]+1<j) cout<<')'; } void MatrixChain::Traceback() { cout<<'('; Traceback(0, n-1); cout<<')'; cout<<endl; }
②当i=j时,A[i:j]=Ai,因此,m[i][i]=0,i=1,2,…,n ③当i<j时,m [ i ] j ] [ m [ i ] k ] [ m [ k 1 ] j ] [ p i 1 p k p j
这里 A i 的维数为 pi1pi
∴可以递归地定义m[i][j]为:
m [i]j] [ m i k j{ m [i]n k [ ] m [k 0 1 ]j] [ p i 1 p kp j}i i j j
根据MatrixChain动态规划算法: ②计算m[i][j]数乘次数
m[2][5]=min m[2][2]+m[3][5]+p1p2p5=13000
m[2][3]+m[4][5]+p1p3p5=7125
m[2][4]+m[5][5]+p1p4p5=11375
最小值为7125,断点的位置为3 A2 (A3 A4 A5)中的两种情况: 1. A2(A3(A4A5)):
13
(A((BC)D))(A(B(CD))) ((AB)(CD))((A( B)C)D) ((A(BC))D)
16000, 10500,
36000, 87500, 34500
5
矩阵连乘问题
将矩阵连乘积 AiAi1..A. j简记为A[i:j] ,这里i≤j
考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵 Ak和Ak+1之间将矩阵链断开,i≤k<j,则其相应完全
A1 p0p1 3035
A2 p1p2 3515
A3 p2p3 155
A4 p3p4 510
A5 p4p5 1020
A6 p5p6 2025
根据MatrixChain动态规划算法: ③计算s[i][j](断点K的位置) m[2][5]=min m[2][2]+m[3][5]+p1p2p5=13000
k(断点)的位置只有 ji种可能
7
3、计算最优值
矩阵 数组p 维数值
A1 p0p1 3035
A2 p1p2 3515
A3 p2p3 155
A4 p3p4 510
A5 p4p5 1020
A6 p5p6 2025
根据MatrixChain动态规划算法: ①计算次序(如图)
8
3、计算最优值
矩阵 数组p 假设:给定n个矩阵{A1,A2,.,..A其,n中} 与 A是i 可乘Ai1
的, i1 ,2,.。n .考 .1 察,这n个矩阵的连乘积
A1A2...An
矩阵乘法满足结合律,计算矩阵的连乘可以有许多不同的计 算次序,这种计算次序可以用加括号的方式来确定
若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已 完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算 法计算出矩阵连乘积
m[2][3]+m[4][5]+p1p3p5=7125
m[2][4]+m[5][5]+p1p4p5=11375
最小值为7125,断点的位置为3
11
3、计算最优值
int MatrixChain::MChain() { //求A[0:n-1]的最优解值
for (int i=0;i<n; i++) m[i][i]=0; for (int r=2; r<=n; r++)
加括号方式为 (A iA i 1 .A .k.)A (k 1 A k 2 .A .j.)
计算量:A[i:k]的计算量加上A[k+1:j]的计算量,再加上 A[i:k]和A[k+1:j]相乘的计算量
6
2、建立递归关系
①设计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数m[i][j],
则原问题的最优值为m[1][n]
m[2][5]=m[2][2]+m[3][3]+m[4][5]+p2p3p5+p1p2p5
2. A2 ((A3 A4) A5)
m[2][5]=m[2][2]+m[3][4]+m[5][5]+p2p4p5+p1p2p5
(A2 A3)(A4 A5) (A2 A3A4) A5
10
3、计算最优值
矩阵 数组p 维数值
9
3、计算最优值 m [i]j] [ m i k j{ m [i]n k [ ] m [k 0 1 ]j] [ p i 1 p kp j}ii jj
矩阵 A1
A2
A3 A4 A5
A6
数组p p0p1 p1p2 p2p3 p3p4 p4p5 p5p6 维数值 3035 3515 155 510 1020 2025
3
矩阵连乘
完全加括号的矩阵连乘积可递归定义为:
① 单个矩阵是完全加括号的 ② 矩阵连乘积A是完全加括号的,则A可表示为2个完
全加括号的矩阵连乘积B和C的乘积并加括号,即 A=(BC)
4
矩阵连乘
例如:表格中有四个矩阵及相应维数
矩阵 A
B
C
D
维数 50×10 10×40 40×30 30×5
总共有五种完全加括号的方式
for (int i=0; i<=n-r; i++) {
int j=i+r-1; m[i][j]=m[i+1][j]+p[i]*p[i+1]*p[j+1]; //m[i][j] 的初值 s[i][j]=i; for (int k=i+1; k<j; k++)
{ int t=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1]; if (t<m[i][j]) {m[i][j]=t; s[i][j]=k;} }
实验三 动态规划算法
——矩阵连乘问题
1
动态规划的应用:矩阵连乘
问题:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,
2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵 连乘积需要的数乘次数最少。
例:A1A2相乘,设这2个矩阵的维数分别为10*5,5*3运 算次数10*5*3=150。
A1 p0p1 3035
A2 p1p2 3515
A3 p2p3 155
A4 p3p4 510
A5 p4p5 1020
A6 p5p6 2025
根据MatrixChain动态规划算法: ②计算m[i][j]数乘次数 Ⅰ计算A1、A2、A3、A4、A5、A6 Ⅱ计算(A1A2)(A2A3)(A3A4)(A4A5)(A5A6) Ⅲ计算(A1A2A3)(A2A3A4)(A3A4A5)(A4A5A6) Ⅳ计算(A1A2A3A4)(A2A3A4A5)(A3A4A5A6) Ⅴ计算(A1A2A3A4A5)(A2A3A4A5A6) Ⅵ计算(A1A2A3A4A5A6)
12
4、构造最优解
void MatrixChain::Traceback(int i, int j) {
if(i==j) { cout<<'A'<<i; return;} if (i<s[i][j]) cout<<'('; Traceback(i, s[i][j]); if (i<s[i][j])cout<<')'; if(s[i][j]+1<j)cout<<'('; Traceback(s[i][j]+1, j); if(s[i][j]+1<j) cout<<')'; } void MatrixChain::Traceback() { cout<<'('; Traceback(0, n-1); cout<<')'; cout<<endl; }
②当i=j时,A[i:j]=Ai,因此,m[i][i]=0,i=1,2,…,n ③当i<j时,m [ i ] j ] [ m [ i ] k ] [ m [ k 1 ] j ] [ p i 1 p k p j
这里 A i 的维数为 pi1pi
∴可以递归地定义m[i][j]为:
m [i]j] [ m i k j{ m [i]n k [ ] m [k 0 1 ]j] [ p i 1 p kp j}i i j j
根据MatrixChain动态规划算法: ②计算m[i][j]数乘次数
m[2][5]=min m[2][2]+m[3][5]+p1p2p5=13000
m[2][3]+m[4][5]+p1p3p5=7125
m[2][4]+m[5][5]+p1p4p5=11375
最小值为7125,断点的位置为3 A2 (A3 A4 A5)中的两种情况: 1. A2(A3(A4A5)):
13
(A((BC)D))(A(B(CD))) ((AB)(CD))((A( B)C)D) ((A(BC))D)
16000, 10500,
36000, 87500, 34500
5
矩阵连乘问题
将矩阵连乘积 AiAi1..A. j简记为A[i:j] ,这里i≤j
考察计算A[i:j]的最优计算次序。设这个计算次序在矩阵 Ak和Ak+1之间将矩阵链断开,i≤k<j,则其相应完全
A1 p0p1 3035
A2 p1p2 3515
A3 p2p3 155
A4 p3p4 510
A5 p4p5 1020
A6 p5p6 2025
根据MatrixChain动态规划算法: ③计算s[i][j](断点K的位置) m[2][5]=min m[2][2]+m[3][5]+p1p2p5=13000
k(断点)的位置只有 ji种可能
7
3、计算最优值
矩阵 数组p 维数值
A1 p0p1 3035
A2 p1p2 3515
A3 p2p3 155
A4 p3p4 510
A5 p4p5 1020
A6 p5p6 2025
根据MatrixChain动态规划算法: ①计算次序(如图)
8
3、计算最优值
矩阵 数组p 假设:给定n个矩阵{A1,A2,.,..A其,n中} 与 A是i 可乘Ai1
的, i1 ,2,.。n .考 .1 察,这n个矩阵的连乘积
A1A2...An
矩阵乘法满足结合律,计算矩阵的连乘可以有许多不同的计 算次序,这种计算次序可以用加括号的方式来确定
若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已 完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算 法计算出矩阵连乘积
m[2][3]+m[4][5]+p1p3p5=7125
m[2][4]+m[5][5]+p1p4p5=11375
最小值为7125,断点的位置为3
11
3、计算最优值
int MatrixChain::MChain() { //求A[0:n-1]的最优解值
for (int i=0;i<n; i++) m[i][i]=0; for (int r=2; r<=n; r++)
加括号方式为 (A iA i 1 .A .k.)A (k 1 A k 2 .A .j.)
计算量:A[i:k]的计算量加上A[k+1:j]的计算量,再加上 A[i:k]和A[k+1:j]相乘的计算量
6
2、建立递归关系
①设计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数m[i][j],
则原问题的最优值为m[1][n]
m[2][5]=m[2][2]+m[3][3]+m[4][5]+p2p3p5+p1p2p5
2. A2 ((A3 A4) A5)
m[2][5]=m[2][2]+m[3][4]+m[5][5]+p2p4p5+p1p2p5
(A2 A3)(A4 A5) (A2 A3A4) A5
10
3、计算最优值
矩阵 数组p 维数值
9
3、计算最优值 m [i]j] [ m i k j{ m [i]n k [ ] m [k 0 1 ]j] [ p i 1 p kp j}ii jj
矩阵 A1
A2
A3 A4 A5
A6
数组p p0p1 p1p2 p2p3 p3p4 p4p5 p5p6 维数值 3035 3515 155 510 1020 2025
3
矩阵连乘
完全加括号的矩阵连乘积可递归定义为:
① 单个矩阵是完全加括号的 ② 矩阵连乘积A是完全加括号的,则A可表示为2个完
全加括号的矩阵连乘积B和C的乘积并加括号,即 A=(BC)
4
矩阵连乘
例如:表格中有四个矩阵及相应维数
矩阵 A
B
C
D
维数 50×10 10×40 40×30 30×5
总共有五种完全加括号的方式
for (int i=0; i<=n-r; i++) {
int j=i+r-1; m[i][j]=m[i+1][j]+p[i]*p[i+1]*p[j+1]; //m[i][j] 的初值 s[i][j]=i; for (int k=i+1; k<j; k++)
{ int t=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1]; if (t<m[i][j]) {m[i][j]=t; s[i][j]=k;} }
实验三 动态规划算法
——矩阵连乘问题
1
动态规划的应用:矩阵连乘
问题:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,
2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵 连乘积需要的数乘次数最少。
例:A1A2相乘,设这2个矩阵的维数分别为10*5,5*3运 算次数10*5*3=150。
A1 p0p1 3035
A2 p1p2 3515
A3 p2p3 155
A4 p3p4 510
A5 p4p5 1020
A6 p5p6 2025
根据MatrixChain动态规划算法: ②计算m[i][j]数乘次数 Ⅰ计算A1、A2、A3、A4、A5、A6 Ⅱ计算(A1A2)(A2A3)(A3A4)(A4A5)(A5A6) Ⅲ计算(A1A2A3)(A2A3A4)(A3A4A5)(A4A5A6) Ⅳ计算(A1A2A3A4)(A2A3A4A5)(A3A4A5A6) Ⅴ计算(A1A2A3A4A5)(A2A3A4A5A6) Ⅵ计算(A1A2A3A4A5A6)