关闭

[置顶] 矩阵链乘 动态规划

2533人阅读 评论(0) 收藏 举报
分类:

1.分析优化解的结构
两个记号:
Aij=Ai×Ai+1×...×Aj
cost(Aij)=计算Aij的代价
(2)优化解的结构
证明:若计算A1n的优化顺序在k处断开矩阵链,那么在计算A1k时,应该直接使用cost(A1k),假设cost(A1k)不是最优结果,则存在另一个结果优于它,那么带入A1n后解比最优解要好,矛盾。

2.子问题重叠性: 计算(A1)×(A2×A3×A4)(A1×A2)×(A3×A4)都需要计算A3×A4

3.递归定义最优解代价
用子问题的最优解递归定义原问题的最优解
m[i,j]表示计算矩阵Ai,j所需标量乘法次数的最小值,那么原问题的最优解-计算A1...n所需的最低代价就是m[1,n]。
m[i,j]=0 if i=j
m[i,j]=min(i<=k<j)m[i,k]+m[k,j]+pi1pkpj if i < j
其中pi1pkpj为计算Aik+Ak+1j所需乘法次数

4.递归划分子问题
一个i×j行矩阵,想要计算m[i,j]的递归方程,需要先计算出第i行的m[i,i],m[i,i+1]…m[i,j-1]和第j列的m[j,j],m[j-1,j]…m[i+1,j]

5.自底向上计算优化解的代价
以m[1,5]为例:

m[1,1] m[1,2] m[1,3] m[1,4] m[1,5]
       m[2,2] m[2,3] m[2,4] m[2,5]
              m[3,3] m[3,4] m[3,5]
                     m[4,4] m[4,5]
                            m[5,5]

想要计算m[1,5],需要计算m[1,1] m[1,2] m[1,3] m[1,4]和m[2,5],m[3,5], m[4,5],m[5,5]。
要计算m[1,4],需要计算m[1,1] m[1,2] m[1,3]和[2,4],m[3,4], m[4,4]
要计算m[2,5],需要计算m[2,2] m[2,3] m[2,4]和m[3,5], m[4,5],m[5,5]
……..

所以最需要先计算的是对角线的上元素m[1,1],m[2,2],m[3,3],m[4,4],m[5,5],它们的结果都是0
接下来就可以计算m[1,2],m[2,3],m[3,4],m[4,5]了
之后计算m[1,3],m[2,4],m[3,5]
……
最后计算出m[1,5]

每次均计算出对角线上的一组元素,且是自底向上的

6.算法思想
1.先对第一层对角线值给初值0(m[i,i]=0)
2.对于有n个矩阵的输入来说,为计算m[1,n],需要n-1个对角线(第一层对角线已经计算过了)
3.对于自底向上的第i层对角线来说,共需要计算i个不同的m值
4.对于每一个m值,通过m[i,j]=min(i<=k<j)m[i,k]+m[k,j]+pi1pkpj if i < j计算,s[i,j]记录断开位置

所以总共需要3层循环。

Matrix-Chain-Order(n)
For i=1 To n Do
m[i,i]=0
For l=2 To n Do
For i=1 To nl+1 Do
j=i+l1
m[i,j]=;
For k=i To j=1 Do
q=m[i,k]+m[k+1,j]+pi1pkpj;
IFq<m[i,j]THENm[i,j]=q;s[i,j]=k;

其中s[i,j]记录ij的断开位置

构造最优解的过程如下:
PrintOptionalParens(s,i,j)
IF j=i
THEN Print “A”i;
ELSE
Print “(”
PrintOptionalParens(s,i,s[i,j])
PrintOptionalParens(s,s[i,j]+1,j)
Print “)”

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:81472次
    • 积分:1532
    • 等级:
    • 排名:千里之外
    • 原创:72篇
    • 转载:2篇
    • 译文:0篇
    • 评论:8条
    博客专栏
    最新评论