矩阵连乘:给定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<n,使其完全加括号方式为((A1……Ak)(AK+1……An)),这样就将原问题分解为两个子问题,,按此计算次序,计算A[1:n]的计算量就等于计算A[1:k]的计算量加上A[k+1:n]的计算量,再加上A[1:k]和A[k+1:n]相乘的计算量。计算A[1:n]的最优次序包含了计算A[1:k]和A[k+1:n]这两个子问题的最优计算次序,以此类推,将A[1:k]和A[k+1:n]递归的分解下去,求出每个子问题的最优解,子问题的最优解相乘便得到原问题的最优解。

(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<j时,这就需要用步骤(1)的最优子结构性质来计算m[i][j]。若计算A[i:j]的最优次序在Ak和Ak+1之间断开,i<=k<j,则m[i][j]=m[i][k]+m[k+1][j]+pi-1*pk*pj,k的位置只有j-i种可能,即k属于集合{i,i+1,……,j-1},所以k是这j-i个位置中使计算量达到最小的那个位置。

所以m[i][j]可以递归地定义为        m[i][j]={  0                                                            i=j

min{m[i][k]+m[k+1][j]+pi-1*pk*pj }         i<j ,i<=k<j     }

将对应于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] = 0for r in range(1, inp):for i in range(inp-r):j = i + rm[i][j] = m[i+1][j] + matrix[i][0] * matrix[i][1] * matrix[j][1]s[i][j] = i+1for 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] = judges[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)

  

转载于:https://www.cnblogs.com/whitehawk/p/10887702.html

python动态规划解决矩阵连乘相关推荐

  1. 动态规划解决矩阵连乘问题

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

  2. Python | 动态规划解决“返回第n个丑数”

    本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 给你一个整数 n ,请你找出并返回第 n 个 丑数 .丑数 就是只包含质因数 2.3 和/或 ...

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

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

  4. Python解决矩阵的PLU分解及求矩阵的逆

    Python解决矩阵的PLU分解及求矩阵的逆 关于PLU的分解基础知识就不叙述了,可以自己去看矩阵分析的书,大体上和高斯消去法差不多. PLU分解被经常用在Ax=bAx=bAx=b的求解上 在这里xx ...

  5. 范德蒙德矩阵在MATLAB中怎么表示,Python 之 Python与MATLAB 矩阵操作总结

    Python 之 Python与MATLAB 矩阵操作小结 一.线形代数理论基础 线形代数(linear algebra)是数学的一个分支,研究矩阵理论.向量空间.线性变换和有限维线形方程组等内容. ...

  6. 最大子段和动态规划_动态规划解决最大正方形问题

    今天的问题 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 来 ...

  7. 萌新做点小玩意儿DAY-4 动态规划解决多边形游戏

    还是先简单的介绍一下动态规划的算法思想,跟分治法的思想相似的是把一个比较大的问题分解成若干子问题,而分治法分解出来的子问题都是相同规模有相同的解决办法的,动态规划可以通过空间换时间来解决这些相同的问题 ...

  8. 怎么在python中输入矩阵_如何使用NumPy在Python中实现矩阵?

    矩阵被用作数学工具,在现实世界中有多种用途.在本文中,我们将按照以下顺序讨论Python中关于使用著名的NumPy库的矩阵的所有内容:什么是NumPy以及何时使用它?在NumPy 矩阵被用作数学工具, ...

  9. 动态规划解决背包问题

    动态规划解决背包问题 问题描述: (1)解法一: 解决思路:动态规划 状态索引范围:从1开始 价值数组,大小数组索引范围:从0开始 状态:F(i,j):前i个物品放入大小为j的背包中所获得的最大价值. ...

最新文章

  1. pymssql 安装后只有 .disk-info_变频空调安装注意事项
  2. GDCM:处理JAI-JPEGLS错误的测试程序
  3. 接受map_[译] 图解 Map、Reduce 和 Filter 数组方法
  4. 南京工程学院计算机组成原理第二版答案,南大__计算机组成原理第二次作业
  5. JSR 365更新:深入CDI 2.0
  6. flex弹性布局操练2
  7. yolov4用1050ti_简单粗暴的多目标跟踪神器 – DeepSort
  8. mysql_real_connect阻塞_mysql_real_connect 参数注意-阿里云开发者社区
  9. Unity蛮牛教程噩梦射手----代码讲解(1)
  10. 北京计算机学校招生要求,北京小升初 16区采取电脑随机录取的入学途径及规则 2021家长一定要看...
  11. 【02】Java进阶:17-单例设计模式、多例设计模式、枚举、工厂设计模式、Lombok
  12. python自学篇——PyGame模块的所有功能函数详解
  13. 从源代码开始构建Ogre图文教程(Ogre 1.8 Source + VS2010)
  14. java计算机毕业设计共享充电宝管理系统演示录像2021MyBatis+系统+LW文档+源码+调试部署
  15. Chrome源码剖析 上--多线程模型 进程通信 进程模型
  16. 病理与病理生理学【2】
  17. 【附源码】计算机毕业设计java中小学家校通系统设计与实现
  18. php的echo函数,phpecho函数介绍与使用方法详解
  19. Django 权限Permissions python
  20. OCV 、AOCV、POCV还在傻傻分不清吗

热门文章

  1. 第一类曲线、曲面积分计算公式
  2. 【ITIL框架】什么是 ITIL? 您的 IT 基础架构库指南
  3. 交换机 (switch)、路由器 (router) 和集线器 (hub) 的区别
  4. Switch Transformer
  5. Ruby‘s Adventrue游戏制作笔记(十七)Unity添加游戏胜利条件和失败条件和导出游戏
  6. 猫吃老鼠(数学题型解答)
  7. 网易面试题:卡特兰数
  8. 干货 | Elasticsearch 冷热集群架构实战
  9. Java Basic Knowledge—— newCoder —— Java专项练习 —— Day04
  10. 数学建模带来的商业机会和职业发展前景,你知道吗?