python矩阵连乘_python动态规划解决矩阵连乘
矩阵连乘:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数。
若A是一个p*q的矩阵,B是一个q*r的矩阵,则其乘积C=AB是一个p*r的矩阵。数乘次数是p*q*r.
动态规划算法与分治法类似,其基本思想也就是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解,简单概括为自顶向下分解,自底向上求解。与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是相互独立的,换句话说,就是前面解决过的子问题,在后面的子问题中又碰到了前面解决过的子问题,子问题之间是有联系的。如果用分治法,有些同样的子问题会被重复计算几次,这样就很浪费时间了。所以动态规划是为了解决分治法的弊端而提出的,动态规划的基本思想就是,用一个表来记录所有已经解决过的子问题的答案,不管该子问题在以后是否会被用到,只要它被计算过,就将其结果填入表中,以后碰到同样的子问题,就可以从表中直接调用该子问题的答案,而不需要再计算一次。具体的动态规划的算法多种多样,但他们都具有相同的填表式。
顺便说一下动态规划的适用场合,一般适用于解最优化问题,例如矩阵连乘问题、最长公共子序列、背包问题等等,通常动态规划的设计有4个步骤,结合矩阵连乘分析:
(1).找出最优解的性质,并刻画其结构特征
这是设计动态规划算法的第一步,我们可以将矩阵连乘积AiAi+1……Aj记为A[i:j]。问题就是计算A[1:n]的最优计算次序。设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,1<=k
(2).递归地定义最优值
这是动态规划的第二步,对于矩阵连乘积的最优计算次序的问题,设计算A[i:j],1<=i<=j<=n,所需要的最小数乘次数为m[i][j],则原问题的最优值为m[1][n]。
当i=j时,A[i:j]=Ai为单一的矩阵,则无需计算,所以m[i][j]=0,i=j=1,2,……,n。即对应的二维表对角线上的值全为0。
当i
所以m[i][j]可以递归地定义为 m[i][j]={ 0 i=j
min{m[i][k]+m[k+1][j]+pi-1*pk*pj } i
将对应于m[i][j]的断开位置k记为s[i][j],在计算出最优值m[i][j]后,可递归地由s[i][j]构造出相应的最优解
(3).以自底向上的方式计算出最优值
动态规划的一大好处是,在计算的过程中,将已解决的子问题答案保存起来,每个子问题只计算一次,而后面的子问题需要用到前面已经解决的子问题,就可以从表中简单差出来,从而避免了大量的重复计算
import random
from pandas import *
input = int(input("输入矩阵数:"))
matrix = [[0] * 2 for i in range(input)]
for i in range(input): #生成矩阵
if i == 0:
matrix[i][0] = random.randrange(100)
matrix[i][1] = random.randrange(100)
else:
matrix[i][0] = matrix[i-1][1]
matrix[i][1] = random.randrange(100)
m = [[0] * input for i in range(input)] #记录连乘次数
s = [[0] * input for j in range(input)] #记录括号位置
def MatrixMultiplication(inp):
for i in range(inp):
m[i][i] = 0
for r in range(1, inp):
for i in range(inp-r):
j = i + r
m[i][j] = m[i+1][j] + matrix[i][0] * matrix[i][1] * matrix[j][1]
s[i][j] = i+1
for k in range(i+1, j):
judge = m[i][k] + m[k+1][j] + matrix[i][0] * matrix[k][1] * matrix[j][1]
if judge < m[i][j]:
m[i][j] = judge
s[i][j] = k+1
def printmatrix(left, right):
if left == right:
print("A"+str(left+1), end='')
else:
print("(", end='')
printmatrix(left, s[left][right]-1)
printmatrix(s[left][right], right)
print(")", end='')
MatrixMultiplication(input)
dm = DataFrame(m, index=list(range(1, input+1)), columns=list(range(1, input+1)))
ds = DataFrame(s, index=list(range(1, input+1)), columns=list(range(1, input+1)))
print(matrix)
print("数乘次数:\n", dm)
print("括号位置:\n", ds)
print("最终结果:")
printmatrix(0, input-1)
python矩阵连乘_python动态规划解决矩阵连乘相关推荐
- 动态规划解决矩阵连乘问题
动态规划解决矩阵连乘问题 文章目录 动态规划解决矩阵连乘问题 动态规划 1.要素 2.基本思想 3.适用于解最优化问题步骤 一.矩阵连乘问题 规则 矩阵可乘的条件 计算的次序对计算量的影响 二.动态规 ...
- python连乘函数_动态规划之矩阵连乘问题Python实现方法
本文实例讲述了动态规划之矩阵连乘问题Python实现方法.分享给大家供大家参考,具体如下: 给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i=1,2 ,-,n-1.如何确定计算矩阵 ...
- python动态规划解决矩阵连乘
矩阵连乘:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1.确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少.输入数据为矩阵个数和 ...
- python矩阵后加点_Python Numpy和矩阵的相关面试问题
通常,数据科学家被要求在Python中执行简单的矩阵运算,这应该很简单,但许多人会偏离正轨. 本文将介绍面试中经常出现的4个Numpy/matrix问题,并用Python编写代码. 问题1: 给定4x ...
- python关键词共现_python 共现矩阵的实现
1.前言 最近在学习python词库的可视化,其中有一个依据共现矩阵制作的可视化,感觉十分炫酷,便以此复刻. 2.项目背景 本人利用爬虫获取各大博客网站的文章,在进行jieba分词,得到每篇文章的关键 ...
- python取矩阵的一部分_Python 实现取矩阵的部分列,保存为一个新的矩阵方法
Python 实现取矩阵的部分列,保存为一个新的矩阵方法 首先输入一个矩阵: >>> b=[[1,2,3,4,5,6],[2,2,3,4,5,6],[3,2,3,4,5,6],[4, ...
- python矩阵交换两行_Python 实现交换矩阵的行示例
Python 实现交换矩阵的行示例 如下所示: # TODO r1 r2 # 直接修改参数矩阵,无返回值 def swapRows(M, r1, r2): M[r1],M[r2] = M[r2],M[ ...
- python对矩阵部分求和_python – numpy求和矩阵 – 按索引排
我有3个矩阵(np数组): A是形状(n,m); B的形状为(m,k);和C的形状(n,k) 矩阵C只有集合{-1,0,1}中的值,它是某种类型的"指标":如果C [i,j] == ...
- python矩阵变成图片_Python将numpy矩阵保存为PNG图片
我通过PIL和numpy处理的图片现在是一个numpy array,我希望它存回png格式,于是查到了scipy.misc.toimage可以做到,但是这里面有一些需要注意的地方. 直接上我的code ...
- python selenium刷新页面_python selenium 解决页面刷新后元素找不到问题
1,问题: 当我们第一遍找元素是找到了,而你循环后页面已经新刷新,所以不能用第一遍找出的元素了 即:页面刷新后元素的属性是没变,但是element却变了,所有之前定位的元素element都过期了 2, ...
最新文章
- 2022-2028年中国渣油行业市场研究及前瞻分析报告
- R语言可视化分面图、假设检验分组t检验、可视化单变量分组分面箱图(faceting bar plot)、添加误差条(error bar)、添加p值、添加抖动数据点(jitter points)
- 新网站做好前期优化为后期长久运营打好基础
- NHibernate+MySql (erro 解决方法)
- php 递归到空如何处理,php递归调用删除数组空值元素的方法
- 前后台交互:跨域以及PHP与Ajax的配合使用
- 一个很奇特的异常 tmpFile.renameTo(classFile) failed
- 软件开发的需求分析样例
- 如何在Pages for Mac中添加页眉、页脚和页码?
- python定义私有变量的方法_Python中私有属性的定义方式
- carto笔记--- 传感器数据走向
- 上海GDD(谷歌开发者大会),第一天总结
- Mapreduce中的分区Partitioner
- java 一年 周数_Java时间:获取特定年份的最大周数
- l440加装固态硬盘ngff_联想L440笔记本电脑加装固态硬盘笔记
- 报错解决——babel-preset-es2015 报错
- 简单的Java 16方格排序游戏
- asterisk恢复
- 如何查看.mdf文件数据库版本信息
- Scratch软件编程等级考试一级——20211211
热门文章
- centos7安装bbr_Centos7下,BBR修正版 一键安装与使用
- php爬虫框架phpspider,第一次使用php编写爬虫,使用了phpspider包
- 能源管理监控系统为企业带来的益处
- 物联网工程专业考研方向
- matlab image反色,Matlab读入PNG图像后自动反色现象解释
- python动态生成数据库表_ironpython – 如何通过python在Spotfire中动态创建数据表
- 一键批量检测微信是否被好友删除
- python黑马教程ppt_Python零基础教程下载|黑马Python零基础教程(附带教学课件 开发工具 环境配置下载 - 极光下载站...
- linux WIFI命令iwlist、iwconfig、iwpriv
- DP动态规划--乡村邮局问题-Post Office(POJ-1160)