设计备忘录解矩阵链(动态规划法)的一些思考

动态规划法求解问题的时候,空间换时间的时候,怎么去记,应该记什么。空间计算值得过程可以有效的理解备忘录,备忘录实际上就是一张表格,帮助我们求解子问题。

一、操作过程:

现在有五个矩阵,有六个数来表示,每个矩阵的行号、列号都是已知的,就是从里面挑出相邻的两个值,六个数表示五个矩阵的项矩阵链,接下来记录子问题。

1、输入

P = < 30, 35, 15, 5, 10, 20 >, n = 5

2、矩阵链

A1A2A3A4A5,其中A1:30×35,A2:35×15,A3:15×5,A4:5×10,A5:10×20

3、备忘录

存储所有子问题的最小乘法次数及得到这个值的划分位置.

(1)r表示长度

首先是长度为1的,把r=1这一行先写好,这一行刚好有5列,每一列的值都是0。这个m表示最少的次数。

r=2长度为2这一行的计算要借助第一行来计算

(2)例:

例如m[2,5]的计算,k的位置可以有很多种选择,第1种选择,左边界2和2所构成的子链,右边是3→5所构成的另一个子链,m[2,2]和m[3,5]的结果,因为是逐层计算的,所以已知m[2,2]和m[3,5]的结果进行计算。

m[2,5] = min{ 0 +2800+35x15x20,2625+1000+35x5x20,4735+0+35x10x200 }=7125

把左边的结果加上右边的结果,第2个矩阵的规模是35x15,第3到第5构成的子链规模是15x20,所以最后乘到最后,一定是以第5个矩阵结束的列号作为最终的列号。综合求解过程:子问题1、子问题2、综合的过程。计算出来
过程

(3) 过程

①r=1
m[1][1]= m[2][2] = m[3][3] = m[4][4] =m[5][5]=0
②r=2
m[1][2] = 30x35x15 = 15750
m[2][3] = 35x15x5 = 2625
m[3][4] = 15x5x10 = 750
m[4][5] = 5x10x20 = 1000
③r=3
m[1][3] =min(m[1][1]+m[2][3]+A1(A2A3),m[1,2]+m[3,3]+ (A1A2)A3
=min(m[1][1]+m[2][3]+P0P1P3,m[1,2]+m[3,3]+P0P2P3
=min(0+2625+30x35x5,15750+0+30x15x5)
=min(7875,18000)=36,s[1][3]=1
m[2][4]=min(m[2][2]+m[3][4]+A2(A3A4),m[2][3]+m[4][4]+(A2A3)A4
=4375,s[2][4]=3
m[3][5]==min(m[3][3]+m[4][5]+A3(A4A5),m[3][4]+m[5][5]+(A3A4)A5
=2500,s[3][5]=3
④r=4
m[1][4]=min(m[1][1]+m[2][4]+ A1(A2A3A4)+m[1][2]+m[3][4] + (A1A2)(A3A4), m[1][3]+m[4][4]+ (A1A2A3)A4
=9375,s[1][4]=3
m[2][5]=min(m[2][2]+m[3][5]+ A2(A3A4A5),m[2][3]+m[4][5] + (A2A3)(A4A5), m[2][4]+m[5][5]+ (A2A3A4)A5
=7125,s[2][5]=3
⑤r=5
m[1][5]=min(m[1][1]+m[2][5]+ A1(A2A3A4A5),m[1][2]+m[3][5] + (A1A2)(A3A4A5) ,m[1][3]+m[4][5]+(A1A2A3)(A4A5)
=11875,s[1][5]=3

备忘录

r=1 m[1][1]=0 m[2][2]=0 m[3][3]=0 m[4][4]=0 m[5][5]=0
r=2 m[1][2]=15750 m[2][3]=2625 m[3][4]=750 m[4][5]=1000
r=3 m[1][3]=7875 m[2][4]=4375 m[3][5]=2500
r=4 m[1][4]=9375 m[2][5]=7125
r=5 m[1][5]=11875

(4)标记函数s[i,j]

r=2 s[1][2]=1 m[2][3]=2 m[3][4]=3 m[4][5]=4
r=3 m[1][3]=1 m[2][4]=3 m[3][5]=3
r=4 m[1][4]=3 m[2][5]=3
r=5 m[1][5]=3

解的追踪:s[1,5]=3⇒(A1A2A3)(A4A5)
s[1,3]=1⇒A1(A2A3)

输出
计算顺序: (A1(A2A3))(A4A5)
最少的乘法次数:m[1,5]=11875

二、递推方程

其实比较难想到的,比较难进行的就是递推方程,要想到问题如何分解,为什么会有这样的关系,这些是难于想到的,尤其是在一个问题在做一个新的问题的时候,可能不是那么明显能看出来。

m[i,j] :得到 Ai…j 的最少的相乘次数
在这里插入图片描述

三、动态规划算法

1、子问题划分

Ai…j :矩阵链 Ai Ai+1 … Aj,边界i, j
输入向量: < Pi-1, Pi, … , Pj >
其最好划分的运算次数: m[i, j]

2、子问题的依赖关系

最优划分最后一次相乘发生在矩阵k 的位置,即
Ai…j = A~i …k~ Ak+1…j
Ai…j 最优运算次数依赖于 Ai…k 与 Ak+1…j 的最优运算次数

猜你喜欢

转载自blog.csdn.net/Prototype___/article/details/125196764