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<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.要素 2.基本思想 3.适用于解最优化问题步骤 一.矩阵连乘问题 规则 矩阵可乘的条件 计算的次序对计算量的影响 二.动态规 ...
- Python | 动态规划解决“返回第n个丑数”
本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 给你一个整数 n ,请你找出并返回第 n 个 丑数 .丑数 就是只包含质因数 2.3 和/或 ...
- python连乘函数_动态规划之矩阵连乘问题Python实现方法
本文实例讲述了动态规划之矩阵连乘问题Python实现方法.分享给大家供大家参考,具体如下: 给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i=1,2 ,-,n-1.如何确定计算矩阵 ...
- Python解决矩阵的PLU分解及求矩阵的逆
Python解决矩阵的PLU分解及求矩阵的逆 关于PLU的分解基础知识就不叙述了,可以自己去看矩阵分析的书,大体上和高斯消去法差不多. PLU分解被经常用在Ax=bAx=bAx=b的求解上 在这里xx ...
- 范德蒙德矩阵在MATLAB中怎么表示,Python 之 Python与MATLAB 矩阵操作总结
Python 之 Python与MATLAB 矩阵操作小结 一.线形代数理论基础 线形代数(linear algebra)是数学的一个分支,研究矩阵理论.向量空间.线性变换和有限维线形方程组等内容. ...
- 最大子段和动态规划_动态规划解决最大正方形问题
今天的问题 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 来 ...
- 萌新做点小玩意儿DAY-4 动态规划解决多边形游戏
还是先简单的介绍一下动态规划的算法思想,跟分治法的思想相似的是把一个比较大的问题分解成若干子问题,而分治法分解出来的子问题都是相同规模有相同的解决办法的,动态规划可以通过空间换时间来解决这些相同的问题 ...
- 怎么在python中输入矩阵_如何使用NumPy在Python中实现矩阵?
矩阵被用作数学工具,在现实世界中有多种用途.在本文中,我们将按照以下顺序讨论Python中关于使用著名的NumPy库的矩阵的所有内容:什么是NumPy以及何时使用它?在NumPy 矩阵被用作数学工具, ...
- 动态规划解决背包问题
动态规划解决背包问题 问题描述: (1)解法一: 解决思路:动态规划 状态索引范围:从1开始 价值数组,大小数组索引范围:从0开始 状态:F(i,j):前i个物品放入大小为j的背包中所获得的最大价值. ...
最新文章
- pymssql 安装后只有 .disk-info_变频空调安装注意事项
- GDCM:处理JAI-JPEGLS错误的测试程序
- 接受map_[译] 图解 Map、Reduce 和 Filter 数组方法
- 南京工程学院计算机组成原理第二版答案,南大__计算机组成原理第二次作业
- JSR 365更新:深入CDI 2.0
- flex弹性布局操练2
- yolov4用1050ti_简单粗暴的多目标跟踪神器 – DeepSort
- mysql_real_connect阻塞_mysql_real_connect 参数注意-阿里云开发者社区
- Unity蛮牛教程噩梦射手----代码讲解(1)
- 北京计算机学校招生要求,北京小升初 16区采取电脑随机录取的入学途径及规则 2021家长一定要看...
- 【02】Java进阶:17-单例设计模式、多例设计模式、枚举、工厂设计模式、Lombok
- python自学篇——PyGame模块的所有功能函数详解
- 从源代码开始构建Ogre图文教程(Ogre 1.8 Source + VS2010)
- java计算机毕业设计共享充电宝管理系统演示录像2021MyBatis+系统+LW文档+源码+调试部署
- Chrome源码剖析 上--多线程模型 进程通信 进程模型
- 病理与病理生理学【2】
- 【附源码】计算机毕业设计java中小学家校通系统设计与实现
- php的echo函数,phpecho函数介绍与使用方法详解
- Django 权限Permissions python
- OCV 、AOCV、POCV还在傻傻分不清吗
热门文章
- 第一类曲线、曲面积分计算公式
- 【ITIL框架】什么是 ITIL? 您的 IT 基础架构库指南
- 交换机 (switch)、路由器 (router) 和集线器 (hub) 的区别
- Switch Transformer
- Ruby‘s Adventrue游戏制作笔记(十七)Unity添加游戏胜利条件和失败条件和导出游戏
- 猫吃老鼠(数学题型解答)
- 网易面试题:卡特兰数
- 干货 | Elasticsearch 冷热集群架构实战
- Java Basic Knowledge—— newCoder —— Java专项练习 —— Day04
- 数学建模带来的商业机会和职业发展前景,你知道吗?