动态规划案例-矩阵连乘(含表格填写过程、问题理解、实例分析)

如果你对其他算法或者案例感兴趣,请考虑阅读我的以下文章。

递归案例-正整数划分.
递归案例-汉诺塔.
递归案例-全排列.
动态规划案例-最长公共子序列(含表格填写、内容理解、问题分析、实例讲解、例题答案).
递归案例-电路布线(含表格填写等超详细,纯人话讲解).

问题


给定n个矩阵{A1, A2, …,An},其中,Ai与Ai+1是可乘的,计算这n个矩阵的连乘积。从中找出一种乘次数最少的计算次序。

问题分析

 什么是矩阵连乘

  学过线性代数的肯定懂得什么是矩阵连乘,但是在这里我还是要说一下(因为我学过线代,但是当时看见题目还是懵逼的一批)。

  举个例子:
  一个A矩阵:2×2和一个B矩阵:2×1再和一个C矩阵:1×3的矩阵连乘:
∣ 2 2 1 3 ∣ × ∣ 1 2 ∣ × ∣ 3 2 1 ∣ \begin{vmatrix} 2 & 2 \\ 1 & 3\\ \end{vmatrix} × \begin{vmatrix} 1\\ 2\\ \end{vmatrix} × \begin{vmatrix} 3&2&1 \end{vmatrix} 2123 × 12 × 321
  这就是矩阵连乘了。

 为什么会出现乘次数不一样的情况

  由于矩阵相乘满足乘法结合律,即A×B×C=(A×B)×C=A×(B×C),我们从实际例子上来看一下。

  1. 假如我们计算(A×B)×C,先算(A×B),此时乘法次数为2×2×1=4次
∣ 2 2 1 3 ∣ × ∣ 1 2 ∣ = ∣ 6 7 ∣ \begin{vmatrix} 2 & 2 \\ 1 & 3\\ \end{vmatrix} × \begin{vmatrix} 1\\ 2\\ \end{vmatrix}= \begin{vmatrix} 6\\ 7 \end{vmatrix} 2123 × 12 = 67
  2.我们再乘C矩阵,乘法次数为4+2×1×3=10
∣ 6 7 ∣ × ∣ 3 2 1 ∣ = ∣ 18 12 6 21 14 7 ∣ \begin{vmatrix} 6\\ 7 \end{vmatrix} × \begin{vmatrix} 3&2&1 \end{vmatrix}= \begin{vmatrix} 18&12&6\\ 21&14&7 \end{vmatrix} 67 × 321 = 1821121467
  1. 现在我们计算A×(B×C),先算(B×C),此时乘法次数为2×1×3=6次
∣ 1 2 ∣ × ∣ 3 2 1 ∣ = ∣ 3 2 1 6 4 2 ∣ \begin{vmatrix} 1\\ 2 \end{vmatrix} × \begin{vmatrix} 3&2&1 \end{vmatrix}= \begin{vmatrix} 3&2&1\\ 6&4&2 \end{vmatrix} 12 × 321 = 362412
  2.我们再用A矩阵乘以刚才的结果,乘法次数为6+2×2×3=18
∣ 2 2 1 3 ∣ × ∣ 3 2 1 6 4 2 ∣ = ∣ 18 12 6 21 14 7 ∣ \begin{vmatrix} 2 & 2 \\ 1 & 3\\ \end{vmatrix} × \begin{vmatrix} 3&2&1\\ 6&4&2 \end{vmatrix}= \begin{vmatrix} 18&12&6\\ 21&14&7 \end{vmatrix} 2123 × 362412 = 1821121467
  通过上面的两次运算,我们可以发现,在每次结合不同的矩阵,就能导致不同的乘法次数。

 为什么要用动态规划算法

  1.首先,这个问题符合最优子结构性质:问题的最优解包含子问题的最优解。举个简单的例子来理解这句话:一个国家里面最厉害的兵,
  肯定是他所在的军营里面最厉害的兵;各个军营里面最厉害的兵,经过选拔(武举考试?)就可以有人脱颖而出,成为这个国家最厉害的
  兵。
  2.其次就是,重叠子问题性质:子问题之间不独立的同时(这是区分分治算法的关键),少量子问题被重复解决了。说白了就是子问题之间有联系的同时有些计算重复了,我们可以在计算第一次的时候将结果记录下来,以后再用到的时候,直接取值,不用再去花时间计算了。
  记录下来,以后再用到的时候,直接取值,不用再去花时间计算了。

 如何用动态规划算法求解

  以A1:50×10 A2:10×40 A3:40×30 A4:30×5 为例,计算最少的乘法次数
  1.我们规定m[i,j]表示第i个矩阵到第j个矩阵之间的连乘(Ai×…×Aj)的最少乘法次数,那么我们的问题就变成了求解m[1,n]。
  2.我们数组p[i-1]×p[i]来表示维数矩阵的维数(也就是多少行,多少列),比如A矩阵是50行、10列,那么矩阵A就可以表示为:
  (p[0]=50)×(p[1]=10)。因此可以列出下表。

p[0]p[1]p[2]p[3]p[4]
501040305

  当我们准备好之后,就可以得到这么一个式子:
m [ i , j ] = { 0 i = = j m i n ( m [ i , k ] + m [ k + 1 , j ] + p [ i − 1 ] p [ k ] p [ j ] ) i < j } m[i,j]= \begin {Bmatrix} 0 &&&&& i ==j\\ min(m[i,k]+m[k+1,j]+p[i-1]p[k]p[j])&&&&&i<j \end{Bmatrix} m[i,j]={0min(m[i,k]+m[k+1,j]+p[i1]p[k]p[j])i==ji<j}
  我们来理解这个式子:
  1.当i==j的时候,m[i,j]表示的就是一个矩阵的乘法次数,也就是0。
  2.当i<j的时候,此时的m[i,j]表示多个矩阵的连乘,将i~j个矩阵从第k个位置切开,也就
  是给第i ~ k个矩阵加括号,给k ~ j个矩阵加括号,那么 矩阵连乘的次数 = 第一个矩阵连乘的次数 + 第二个矩阵连乘的次数 + 这两个矩阵连乘的次数。

  接下来就是动态规划的重点环节了:填表。

i \ m[i,j] / j1234
10200002700010500
20120008000
306000
40

由此我们可以知道最小的乘法次数为10500,那么这个表是怎么填,以及如何读的呢?

ijm[i,j]
110
220
330
440
12min{m[1,1]+m[2,2]+p0p1p2}=20000
23min{m[2,2]+m[3,3]+p1p2p3}=12000
34min{m[3,3]+m[4,4]+p2p3p4}=6000
13min{m[1,1]+m[2,3]+p0p1p3 =27000 ,m[1,2]+m[3,3]+p0p2p3 =80000}=27000
24min{m[2,2]+m[3,4]+p1p2p3 =8000 ,m[1,2]+m[3,3]+p1p3p4=27000}=8000
14min{m[1,1]+m[2,4]+p0p1p4 =10500 ,m[1,2]+m[3,4]+p0p2p4 =36000 ,m[1,3]+m[4,4]+p0p3p4=34500}=10500

  从这个表中我们看出填刚才那个表的顺序是按对角线进行填写.
  1.当i=1,j=4的时候最小乘法次数为10500,对应的划分为m[1,1]+m[2,4]+p0p1p4 =10500 ,也就是(A1(A2A3A4))
  2.我们继续往下找m[2,4]对应的划分m[2,2]+m[3,4]+p1p2p3 =8000 ,也就是(A2(A3A4))
  3.最后我们就得到了最终的答案:(A1(A2(A3A4)))

  • 18
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
动态规划算法是一种解决最优化问题算法,它在许多应用中都能得到成功的应用,其中之一就是投资问题。 假设有一个投资者想要在股市中进行投资,他有一定的资金,并且希望通过投资获得最大的收益。这个问题可以看作是一个动态规划问题,下面我们来看一个具体的案例分析。 假设投资者有1万元的资金,他希望在A股市场和B股市场中进行投资。他可以按照不同的比例投资,比如说他可以将5000元投资到A股市场,将5000元投资到B股市场,也可以将6000元投资到A股市场,将4000元投资到B股市场等等。 现在假设投资者有以下的投资方案: | 方案 | A股市场 | B股市场 | | --- | --- | --- | | 方案1 | 5000元 | 5000元 | | 方案2 | 6000元 | 4000元 | | 方案3 | 7000元 | 3000元 | | 方案4 | 8000元 | 2000元 | | 方案5 | 9000元 | 1000元 | | 方案6 | 10000元 | 0元 | 假设在A股市场中,每投资1000元可以获得800元的回报,而在B股市场中,每投资1000元可以获得600元的回报。根据这些数据,我们可以计算出每种方案的预期收益: | 方案 | A股市场回报 | B股市场回报 | 预期收益 | | --- | --- | --- | --- | | 方案1 | 4000元 | 3000元 | 7000元 | | 方案2 | 4800元 | 2400元 | 7200元 | | 方案3 | 5600元 | 1800元 | 7400元 | | 方案4 | 6400元 | 1200元 | 7600元 | | 方案5 | 7200元 | 600元 | 7800元 | | 方案6 | 8000元 | 0元 | 8000元 | 现在,我们可以使用动态规划算法来寻找最优的投资方案。我们可以定义一个状态方程,假设在第i个方案中,投资了x元在A股市场,那么就可以计算出在第i个方案中,投资了(10000-x)元在B股市场。因此,我们可以定义状态方程为: f(i,x) = max{f(i-1,x) + Ai * (x/1000), f(i-1,x-1000) + Bi * [(10000-x)/1000]} 其中,f(i,x)表示在前i个方案中,投资了x元在A股市场所能获得的最大收益,Ai表示在A股市场中每投资1000元所能获得的回报,Bi表示在B股市场中每投资1000元所能获得的回报。 根据上述状态方程,我们可以使用动态规划算法来计算出最优的投资方案。具体的算法流程如下: 1. 初始化f(0,x) = 0,表示在前0个方案中,无论如何投资都无法获得收益。 2. 对于每个方案i,在0到10000元之间枚举投资在A股市场的金额x,计算出f(i,x)的值。 3. 根据计算出的f(i,x)的值,可以得到在第i个方案中投资在A股市场所能获得的最大收益f(i,10000)。 4. 最终的最大收益即为f(6,10000)。 通过这种方式,我们可以求出最优的投资方案,从而帮助投资者获得最大的收益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值