动态规划是算法分析与设计中一种重要的算法。其核心思想是将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法。

文章目录

  • 一、矩阵链相乘问题
  • 二、求解
    • 1.构建备忘录
    • 2.回溯
  • 结果展示

一、矩阵链相乘问题

例: 令P=<50,35,25,10,60,70,3,5,10>,相对应的矩阵链是:A1(50*35), A2(35*25), A3(25*10), A4(10*60), A5(60*70), A6(70*3), A7(3*5), A8(5*10), 括号内为矩阵的维度,请⽤动态规划算法确定⼀种乘法⽅式,使得A1*A2*A3*A4*A5*A6*A7*A8总的基本运算量(只算乘法,不算加法)最少。

二、求解

1.构建备忘录

备忘录是动态规划算法常用的工具,用来存储子问题得到的最优值并递归的更新其值,直到寻找到全局最优值为止。MatrixChain函数中定义了两个相同大小(n*n)的矩阵M和S,n为矩阵数量。
M(i,j)表示从第i+1个矩阵到第j+1个矩阵链的最少运算总量,故M(0,n-1)即表示了整个矩阵链的最少运算总量。
S(i,j)表示从第i+1个矩阵到第j+1个矩阵链的分割位置,因为每一矩阵链都可看作是两个矩阵链分别运算后的乘积。此矩阵可用于回溯矩阵相乘的顺序。

# 求最优值,记录备忘录
def MatrixChain(p):n = len(p) - 1# 存最优值m = np.zeros((n, n))# 存最优决策s = np.zeros((n, n))# R 表示矩阵链长度 从2开始for r in range(2, n + 1):# 从第i个矩阵Ai开始,长度为r,循环次数为n-r+1for i in range(n - r + 1):j = i + r - 1  # 当前矩阵端(Ai-Aj)起始为Ai 结尾为Aj# 初始化m[i][j] = m[i + 1][j] + p[i] * p[i + 1] * p[j + 1]s[i][j] = i# 比较寻最小值for k in range(i + 1, j):t = m[i][k] + m[k + 1][j] + p[i] * p[k + 1] * p[j + 1]if t < m[i][j]:m[i][j] = ts[i][j] = kreturn m, s

2.回溯

回溯函数如下,采用递归方法构造:

# 记录最优决策并构造最优解
res = []
def Traceback(i, j):if i == j:res.append('A' + str(i))else:res.append('(')Traceback(i, int(s[i][j]))Traceback(int(s[i][j] + 1), j)res.append(')')

结果展示

矩阵链为:P=<50,35,25,10,60,70,3,5,10>
备忘录的值为

[[     0.  43750.  26250.  56250. 103250.  23025.  23775.  24675.][     0.      0.   8750.  29750.  75250.  17775.  18300.  18975.][     0.      0.      0.  15000.  59500.  15150.  15525.  16050.][     0.      0.      0.      0.  42000.  14400.  14550.  14850.][     0.      0.      0.      0.      0.  12600.  13500.  14550.][     0.      0.      0.      0.      0.      0.   1050.   2250.][     0.      0.      0.      0.      0.      0.      0.    150.][     0.      0.      0.      0.      0.      0.      0.      0.]]

可见最小值为24675.0
决策矩阵为:

[[0. 0. 0. 2. 2. 0. 5. 5.][0. 0. 1. 2. 2. 1. 5. 5.][0. 0. 0. 2. 2. 2. 5. 5.][0. 0. 0. 0. 3. 3. 5. 5.][0. 0. 0. 0. 0. 4. 5. 5.][0. 0. 0. 0. 0. 0. 5. 5.][0. 0. 0. 0. 0. 0. 0. 6.][0. 0. 0. 0. 0. 0. 0. 0.]]

最终矩阵链的相乘顺序为:((A0(A1(A2(A3(A4A5)))))(A6A7))

动态规划典型题之——矩阵链乘法相关推荐

  1. 【动态规划】矩阵链乘法

    矩阵链乘法    求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积  A1A2...An    为了计算表 ...

  2. 【算法分析与设计】矩阵链乘法最优顺序问题

    矩阵链乘法 矩阵连乘,选择不同的乘法顺序,效率可能千差万别. 高效的实现算法应该用动态规划来设计,具体的讲解可以看这里. 编程实现 public class Main {private static ...

  3. 矩阵链乘法问题 (算法)

    一.概述 以两个矩阵相乘为例,A1*A2,A1和A2为两个矩阵,假设A1的行列数是p*q,A2的行列数是q*r.注意这里由于是A1乘以A2,所以A1的列数要等于A2的行数,否则无法做矩阵乘法,满足上述 ...

  4. python矩阵乘法算法_Python算法|矩阵链乘法

    概述 矩阵乘法是一个满足结合律的运算.显然,对于矩阵A.B.C来说,(AB)C 与 A(BC) 是等价的,我们可以根据自己的心情选择任意的运算顺序,总之,结果都是一样的. 糟糕的是,对计算机来说可不是 ...

  5. C++matrix chain multiplication矩阵链乘法算法的实现(附完整源码)

    C++lmatrix chain multiplication矩阵链乘法算法的实现 C++matrix chain multiplication矩阵链乘法算法的实现的完整源码(定义,实现,main函数 ...

  6. 矩阵链乘法 自顶向下 自底向上 Python 实现 算法导论

    算法导论 矩阵链乘法 自顶向下 自底向上 Python 实现 带备忘的自顶向下实现方式 def Memoized_Matrix_chain(p):n = len(p)m = [[0 for i in ...

  7. 15.2 矩阵链乘法

    1.代码 public class MatrixChainMultiplication {public static void main(String[] args) { // 在该代码中,我们首先创 ...

  8. c语言备忘录算法矩阵链乘,矩阵链乘法(备忘录法)

    /* * @fileMemoMatrixchain.cpp * @briefa solution of martrix chain with memorized way. * @author/Univ ...

  9. 矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...

    矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率. 先来看看咱们在高等代数中学的普通矩阵的乘法 两个矩阵相乘 上边这种普通求解方法的复杂度为: O(n3) 也称 ...

最新文章

  1. 近期活动盘点:设计与人工智能思享会、制造业的转型升级到产业跃迁思享会、瓜子二手车周洲讲座(10.30-11.1)...
  2. 一天就能上线音乐教学APP?网易云信首推音乐教学解决方案!
  3. OHCI,UHCI,EOHCI,XHCI
  4. 工业项目,用MCU还是PLC?
  5. Wireshark数据包分析(一)——使用入门
  6. gulp临时服务器显示html页面,用Gulp实现CSS压缩和页面自动刷新
  7. 程序编号以后计算机能够查出,华威大学研究人员开发出计算机程序,可发现量子计算机中的“泄漏”...
  8. flightgear通过UDP协议输出飞行态势数据以及利用C++接收flightgear数据
  9. java代码生成流程图,赶紧收藏!
  10. pwm gpio android,USB转I2C适配器 模块 USB-IIC/GPIO/PWM/ADC 支持Android 安卓 树莓派
  11. ROS新建工作空间及编译
  12. Css3中-moz、-ms、-webkit的使用
  13. 异构数据库、异构数据源、分布式数据库三者的辨析区别
  14. ,到底是买新房好还是二手房好?看完你就明白了!
  15. 苹果电脑怎么更换计算机模式,苹果电脑装windows7后怎么切回来_苹果电脑安装win7后如何切换...
  16. 生鲜配送管理系统_升鲜宝 V2.0 小程序辅助系统工具矩阵系列相关说明
  17. MATLAB中排序sort函数的用法
  18. 经纬度和坐标之间怎么相互转换
  19. JAVA处理Excel的三种实现方式(二)
  20. 海力士芯片 HY57V561620FTP-H 的内存容量问题

热门文章

  1. Python Excel文件操作
  2. 【超详细Scratch教学课件分享】简单倒计时
  3. Django—中间件详解
  4. 规则网络上的演化博弈
  5. Android 百度地图之路径规划
  6. febe_如何使用FEBE备份和恢复Firefox配置文件
  7. 解决win10提示无法开启SENS服务
  8. PCB Polar SI9000阻抗模型图片文字识别方法
  9. 别焦虑了,这才是中国各行业平均工资的真相
  10. matlab读取hdf显示,matlab读取.hdf文件