矩阵连乘:给定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. 动态规划解决矩阵连乘问题

    动态规划解决矩阵连乘问题 文章目录 动态规划解决矩阵连乘问题 动态规划 1.要素 2.基本思想 3.适用于解最优化问题步骤 一.矩阵连乘问题 规则 矩阵可乘的条件 计算的次序对计算量的影响 二.动态规 ...

  2. python连乘函数_动态规划之矩阵连乘问题Python实现方法

    本文实例讲述了动态规划之矩阵连乘问题Python实现方法.分享给大家供大家参考,具体如下: 给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i=1,2 ,-,n-1.如何确定计算矩阵 ...

  3. python动态规划解决矩阵连乘

    矩阵连乘:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1.确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少.输入数据为矩阵个数和 ...

  4. python矩阵后加点_Python Numpy和矩阵的相关面试问题

    通常,数据科学家被要求在Python中执行简单的矩阵运算,这应该很简单,但许多人会偏离正轨. 本文将介绍面试中经常出现的4个Numpy/matrix问题,并用Python编写代码. 问题1: 给定4x ...

  5. python关键词共现_python 共现矩阵的实现

    1.前言 最近在学习python词库的可视化,其中有一个依据共现矩阵制作的可视化,感觉十分炫酷,便以此复刻. 2.项目背景 本人利用爬虫获取各大博客网站的文章,在进行jieba分词,得到每篇文章的关键 ...

  6. python取矩阵的一部分_Python 实现取矩阵的部分列,保存为一个新的矩阵方法

    Python 实现取矩阵的部分列,保存为一个新的矩阵方法 首先输入一个矩阵: >>> b=[[1,2,3,4,5,6],[2,2,3,4,5,6],[3,2,3,4,5,6],[4, ...

  7. python矩阵交换两行_Python 实现交换矩阵的行示例

    Python 实现交换矩阵的行示例 如下所示: # TODO r1 r2 # 直接修改参数矩阵,无返回值 def swapRows(M, r1, r2): M[r1],M[r2] = M[r2],M[ ...

  8. python对矩阵部分求和_python – numpy求和矩阵 – 按索引排

    我有3个矩阵(np数组): A是形状(n,m); B的形状为(m,k);和C的形状(n,k) 矩阵C只有集合{-1,0,1}中的值,它是某种类型的"指标":如果C [i,j] == ...

  9. python矩阵变成图片_Python将numpy矩阵保存为PNG图片

    我通过PIL和numpy处理的图片现在是一个numpy array,我希望它存回png格式,于是查到了scipy.misc.toimage可以做到,但是这里面有一些需要注意的地方. 直接上我的code ...

  10. python selenium刷新页面_python selenium 解决页面刷新后元素找不到问题

    1,问题: 当我们第一遍找元素是找到了,而你循环后页面已经新刷新,所以不能用第一遍找出的元素了 即:页面刷新后元素的属性是没变,但是element却变了,所有之前定位的元素element都过期了 2, ...

最新文章

  1. 2022-2028年中国渣油行业市场研究及前瞻分析报告
  2. R语言可视化分面图、假设检验分组t检验、可视化单变量分组分面箱图(faceting bar plot)、添加误差条(error bar)、添加p值、添加抖动数据点(jitter points)
  3. 新网站做好前期优化为后期长久运营打好基础
  4. NHibernate+MySql (erro 解决方法)
  5. php 递归到空如何处理,php递归调用删除数组空值元素的方法
  6. 前后台交互:跨域以及PHP与Ajax的配合使用
  7. 一个很奇特的异常 tmpFile.renameTo(classFile) failed
  8. 软件开发的需求分析样例
  9. 如何在Pages for Mac中添加页眉、页脚和页码?
  10. python定义私有变量的方法_Python中私有属性的定义方式
  11. carto笔记--- 传感器数据走向
  12. 上海GDD(谷歌开发者大会),第一天总结
  13. Mapreduce中的分区Partitioner
  14. java 一年 周数_Java时间:获取特定年份的最大周数
  15. l440加装固态硬盘ngff_联想L440笔记本电脑加装固态硬盘笔记
  16. 报错解决——babel-preset-es2015 报错
  17. 简单的Java 16方格排序游戏
  18. asterisk恢复
  19. 如何查看.mdf文件数据库版本信息
  20. Scratch软件编程等级考试一级——20211211

热门文章

  1. centos7安装bbr_Centos7下,BBR修正版 一键安装与使用
  2. php爬虫框架phpspider,第一次使用php编写爬虫,使用了phpspider包
  3. 能源管理监控系统为企业带来的益处
  4. 物联网工程专业考研方向
  5. matlab image反色,Matlab读入PNG图像后自动反色现象解释
  6. python动态生成数据库表_ironpython – 如何通过python在Spotfire中动态创建数据表
  7. 一键批量检测微信是否被好友删除
  8. python黑马教程ppt_Python零基础教程下载|黑马Python零基础教程(附带教学课件 开发工具 环境配置下载 - 极光下载站...
  9. linux WIFI命令iwlist、iwconfig、iwpriv
  10. DP动态规划--乡村邮局问题-Post Office(POJ-1160)