动态规划典型题之——矩阵链乘法
动态规划是算法分析与设计中一种重要的算法。其核心思想是将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法。
文章目录
- 一、矩阵链相乘问题
- 二、求解
- 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))
动态规划典型题之——矩阵链乘法相关推荐
- 【动态规划】矩阵链乘法
矩阵链乘法 求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积 A1A2...An 为了计算表 ...
- 【算法分析与设计】矩阵链乘法最优顺序问题
矩阵链乘法 矩阵连乘,选择不同的乘法顺序,效率可能千差万别. 高效的实现算法应该用动态规划来设计,具体的讲解可以看这里. 编程实现 public class Main {private static ...
- 矩阵链乘法问题 (算法)
一.概述 以两个矩阵相乘为例,A1*A2,A1和A2为两个矩阵,假设A1的行列数是p*q,A2的行列数是q*r.注意这里由于是A1乘以A2,所以A1的列数要等于A2的行数,否则无法做矩阵乘法,满足上述 ...
- python矩阵乘法算法_Python算法|矩阵链乘法
概述 矩阵乘法是一个满足结合律的运算.显然,对于矩阵A.B.C来说,(AB)C 与 A(BC) 是等价的,我们可以根据自己的心情选择任意的运算顺序,总之,结果都是一样的. 糟糕的是,对计算机来说可不是 ...
- C++matrix chain multiplication矩阵链乘法算法的实现(附完整源码)
C++lmatrix chain multiplication矩阵链乘法算法的实现 C++matrix chain multiplication矩阵链乘法算法的实现的完整源码(定义,实现,main函数 ...
- 矩阵链乘法 自顶向下 自底向上 Python 实现 算法导论
算法导论 矩阵链乘法 自顶向下 自底向上 Python 实现 带备忘的自顶向下实现方式 def Memoized_Matrix_chain(p):n = len(p)m = [[0 for i in ...
- 15.2 矩阵链乘法
1.代码 public class MatrixChainMultiplication {public static void main(String[] args) { // 在该代码中,我们首先创 ...
- c语言备忘录算法矩阵链乘,矩阵链乘法(备忘录法)
/* * @fileMemoMatrixchain.cpp * @briefa solution of martrix chain with memorized way. * @author/Univ ...
- 矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...
矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率. 先来看看咱们在高等代数中学的普通矩阵的乘法 两个矩阵相乘 上边这种普通求解方法的复杂度为: O(n3) 也称 ...
最新文章
- 近期活动盘点:设计与人工智能思享会、制造业的转型升级到产业跃迁思享会、瓜子二手车周洲讲座(10.30-11.1)...
- 一天就能上线音乐教学APP?网易云信首推音乐教学解决方案!
- OHCI,UHCI,EOHCI,XHCI
- 工业项目,用MCU还是PLC?
- Wireshark数据包分析(一)——使用入门
- gulp临时服务器显示html页面,用Gulp实现CSS压缩和页面自动刷新
- 程序编号以后计算机能够查出,华威大学研究人员开发出计算机程序,可发现量子计算机中的“泄漏”...
- flightgear通过UDP协议输出飞行态势数据以及利用C++接收flightgear数据
- java代码生成流程图,赶紧收藏!
- pwm gpio android,USB转I2C适配器 模块 USB-IIC/GPIO/PWM/ADC 支持Android 安卓 树莓派
- ROS新建工作空间及编译
- Css3中-moz、-ms、-webkit的使用
- 异构数据库、异构数据源、分布式数据库三者的辨析区别
- ,到底是买新房好还是二手房好?看完你就明白了!
- 苹果电脑怎么更换计算机模式,苹果电脑装windows7后怎么切回来_苹果电脑安装win7后如何切换...
- 生鲜配送管理系统_升鲜宝 V2.0 小程序辅助系统工具矩阵系列相关说明
- MATLAB中排序sort函数的用法
- 经纬度和坐标之间怎么相互转换
- JAVA处理Excel的三种实现方式(二)
- 海力士芯片 HY57V561620FTP-H 的内存容量问题