python矩阵连乘_动态规划之矩阵连乘问题Python实现方法
本文实例讲述了动态规划之矩阵连乘问题Python实现方法。分享给大家供大家参考,具体如下:
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
例如:
A1={30x35} ; A2={35x15} ;A3={15x5} ;A4={5x10} ;A5={10x20} ;A6={20x25} ;
结果为:((A1(A2A3))((A4A5)A6)) 最小的乘次为15125。
原问题为n个矩阵连乘,将原问题分解为子问题,即当n等于1,2,3.....时。
n==1时,单一矩阵,不需要计算。最小乘次为0
n==2时,根据n==1时的结果,遍历计算出每相邻两个矩阵的最小乘次
n==3时,根据n==1和n==2时的结果,此时已经求出每相邻1个、2个矩阵的最小乘次,遍历计算出该相邻三个矩阵的最小乘次
依次类推……
当n==n时,根据n==1、2、……n-1时的结果,此时已经求出每相邻1个、2个、3个……n-1个矩阵的最小乘次,由此求出n==n时的最小乘次
每当n增加1时,就利用已求出的子结构来求解此时的最优值。
数学描述如下:
设矩阵Ai的维数为Pi × Pi+1。
设A[i:j]为矩阵AiAi+1....Aj的连乘积,即从Ai到Aj的连乘积,其中,0 <= i <= j <= n-1
设m[i][j]为计算A[i:j]的最小乘次,所以原问题的最优值为m[0][n-1]。
当 i==j 时,单一矩阵,无需计算。m[i][i]=0,i=0,1,....n-1
当 i < j 时,利用最优子结构,计算m[i][j]。即寻找断开位置k(i <= k < j),使得m[i][k]+m[k+1][j]+Pi*Pk+1*Pj+1最小。
该算法的python实现:
# coding=gbk
# 矩阵连乘问题
__author__ = 'ice'
# row_num 每个矩阵的行数
class Matrix:
def __init__(self, row_num=0, col_num=0, matrix=None):
if matrix != None:
self.row_num = len(matrix)
self.col_num = len(matrix[0])
else:
self.row_num = row_num
self.col_num = col_num
self.matrix = matrix
def matrix_chain(matrixs):
matrix_num = len(matrixs)
count = [[0 for j in range(matrix_num)] for i in range(matrix_num)]
flag = [[0 for j in range(matrix_num)] for i in range(matrix_num)]
for interval in range(1, matrix_num + 1):
for i in range(matrix_num - interval):
j = i + interval
count[i][j] = count[i][i] + count[i + 1][j] + matrixs[i].row_num * matrixs[i + 1].row_num * matrixs[j].col_num
flag[i][j] = i
for k in range(i + 1, j):
temp = count[i][k] + count[k + 1][j] + matrixs[i].row_num * matrixs[k + 1].row_num * matrixs[j].col_num
if temp < count[i][j]:
count[i][j] = temp
flag[i][j] = k
traceback(0, matrix_num - 1, flag)
return count[0][matrix_num - 1]
def traceback(i, j, flag):
if i == j:
return
if j - i > 1:
print(str(i + 1) + '~' + str(j + 1), end=': ')
print(str(i + 1) + ":" + str(flag[i][j] + 1), end=',')
print(str(flag[i][j] + 2) + ":" + str(j + 1))
traceback(i, flag[i][j], flag)
traceback(flag[i][j] + 1, j, flag)
matrixs = [Matrix(30, 35), Matrix(35, 15), Matrix(15, 5), Matrix(5, 10), Matrix(10, 20), Matrix(20, 25)]
result = matrix_chain(matrixs)
print(result)
# 1~6: 1:3,4:6
# 1~3: 1:1,2:3
# 4~6: 4:5,6:6
# 15125
希望本文所述对大家Python程序设计有所帮助。
python矩阵连乘_动态规划之矩阵连乘问题Python实现方法相关推荐
- python连乘函数_动态规划之矩阵连乘问题Python实现方法
本文实例讲述了动态规划之矩阵连乘问题Python实现方法.分享给大家供大家参考,具体如下: 给定n个矩阵{A1,A2,-,An},其中Ai与Ai+1是可乘的,i=1,2 ,-,n-1.如何确定计算矩阵 ...
- python实现推荐系统代码_推荐系统之矩阵分解及其Python代码实现
有如下R(5,4)的打分矩阵:("-"表示用户没有打分) 其中打分矩阵R(n,m)是n行和m列,n表示user个数,m行表示item个数 那么,如何根据目前的矩阵R(5,4)如何对 ...
- 单应性矩阵和仿射变换_单应矩阵 基本矩阵 本质矩阵的区别与联系
1. 叉乘 2. 双目系统 3. 对极几何 (Epipolar Geometry) 对极几何定义:是两个视图间的内部射影几何,它只与摄像机的内部参数和相对位姿有关,与场景结构无关. 基线(baseli ...
- python协同过滤算法_协同过滤(ALS)的原理及Python实现
提到ALS相信大家应该都不会觉得陌生(不陌生你点进来干嘛[捂脸]),它是协同过滤的一种,并被集成到Spark的Mllib库中.本文就ALS的基本原理进行讲解,并手把手.肩并肩地带您实现这一算法. 完整 ...
- python 进程生命周期_计算客户生命周期价值的python解决方案
python 进程生命周期 By Lisa Cohen, Zhining Deng, Shijing Fang, and Ron Sielinski 由丽莎·科恩,志宁邓,石井方和罗恩Sielinsk ...
- python批量命名教程_《自拍教程69》Python 批量重命名音频文件,AV专家必备!
本篇主要学习如何Python自定义模块并调用该模块,并重点介绍Python正则表达式的强大的文本处理能力. 案例故事:任何一款终端产品只要涉及音频输出,就肯定涉及音频的解码, 作为一名专业的AV (A ...
- 如何确定python对应电脑版本_查看Anaconda版本、Anaconda和python版本对应关系和快速下载...
官网 查看Anaconda版本 (C:\ProgramData\Anaconda3) C:\Users\Administrator>conda -V conda 4.3.30 Anaconda和 ...
- python ide如何运行_如何在Ubuntu上安装IDLE Python IDE
什么是IDLE? IDLE代表一世ntegratedd前夕大号opmentËnvironment.它是用于Python的IDE,使用Python语言本身编写,基于Tkinter并绑定到Tk小部件集. ...
- 用python画奥迪标志_不知道不 OK!53 个 Python 经典面试题详解
作者 | Chris 翻译 | 苏本如,责编 | 夕颜 头图 | CSDN付费下载自视觉中国 出品 | CSDN(ID:CSDNnews) 以下为译文: 本文列出53个Python面试问题,并且提供了 ...
- python作者 google面试_如果Google面试让你用python写一个树的遍历程序
前几天忽然对python很感兴趣,学了几天也感觉它非常的简洁实用.打破了我这么长时间对java C# C 和vb的审美疲劳,让我眼前一亮."就像读英文一样简单"这句话评价pytho ...
最新文章
- 独家 | 从零开始用python搭建推荐引擎(附代码)
- 回首2013 展望2014
- ThinkPHP3.1快速入门(2)数据CURD
- poj 3189 Steady Cow Assignment(二分+最大流)
- 解决log4j2漏洞遭到挖矿、僵尸进程病毒攻击
- CodeForces - 1323D Present(思维+数学)
- 解密HLS中的AES加密
- 偏函数 匿名函数 高阶函数 map filter reduce
- java 验证码_如何使用Java生成随机验证码
- Java中的方法(形参及实参)return返回类型
- appium在android7.0上无法启动问题
- Gstreamer加载插件原理(二十五)
- centos8 yum安装mysql8 流程配置
- 2021 软件开发的 5 大趋势,低代码、无代码得到了验证!
- Linux netstat命令详解
- axure rp8 添加动态面板_Axure原型教程:使用动态面板简单实现三级菜单
- C#数据库教程5-ADO.NET登录页面设计
- http协议 服务器主动下发,HTTP协议快速入门指南
- 当外面的容器的height使用百分比时,如何设置line-height可以使里面的文字垂直居中
- git报错-The file will have its original