码迷,mamicode.com
首页 > 其他好文 > 详细

矩阵链乘 动态规划

时间:2016-06-02 14:45:32      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

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

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]+pi?1pkpj if i < j
其中pi?1pkpj为计算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]+pi?1pkpj 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 n?l+1 Do
j=i+l?1
m[i,j]=;
For k=i To j=1 Do
q=m[i,k]+m[k+1,j]+pi?1pkpj;
IFq<m[i,j]THENm[i,j]=q;s[i,j]=k;

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

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

矩阵链乘 动态规划

标签:

原文地址:http://blog.csdn.net/niujiabinbin/article/details/51537583

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!