本文实例讲述了动态规划之矩阵连乘问题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实现方法相关推荐

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

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

  2. python实现推荐系统代码_推荐系统之矩阵分解及其Python代码实现

    有如下R(5,4)的打分矩阵:("-"表示用户没有打分) 其中打分矩阵R(n,m)是n行和m列,n表示user个数,m行表示item个数 那么,如何根据目前的矩阵R(5,4)如何对 ...

  3. 单应性矩阵和仿射变换_单应矩阵 基本矩阵 本质矩阵的区别与联系

    1. 叉乘 2. 双目系统 3. 对极几何 (Epipolar Geometry) 对极几何定义:是两个视图间的内部射影几何,它只与摄像机的内部参数和相对位姿有关,与场景结构无关. 基线(baseli ...

  4. python协同过滤算法_协同过滤(ALS)的原理及Python实现

    提到ALS相信大家应该都不会觉得陌生(不陌生你点进来干嘛[捂脸]),它是协同过滤的一种,并被集成到Spark的Mllib库中.本文就ALS的基本原理进行讲解,并手把手.肩并肩地带您实现这一算法. 完整 ...

  5. python 进程生命周期_计算客户生命周期价值的python解决方案

    python 进程生命周期 By Lisa Cohen, Zhining Deng, Shijing Fang, and Ron Sielinski 由丽莎·科恩,志宁邓,石井方和罗恩Sielinsk ...

  6. python批量命名教程_《自拍教程69》Python 批量重命名音频文件,AV专家必备!

    本篇主要学习如何Python自定义模块并调用该模块,并重点介绍Python正则表达式的强大的文本处理能力. 案例故事:任何一款终端产品只要涉及音频输出,就肯定涉及音频的解码, 作为一名专业的AV (A ...

  7. 如何确定python对应电脑版本_查看Anaconda版本、Anaconda和python版本对应关系和快速下载...

    官网 查看Anaconda版本 (C:\ProgramData\Anaconda3) C:\Users\Administrator>conda -V conda 4.3.30 Anaconda和 ...

  8. python ide如何运行_如何在Ubuntu上安装IDLE Python IDE

    什么是IDLE? IDLE代表一世ntegratedd前夕大号opmentËnvironment.它是用于Python的IDE,使用Python语言本身编写,基于Tkinter并绑定到Tk小部件集. ...

  9. 用python画奥迪标志_不知道不 OK!53 个 Python 经典面试题详解

    作者 | Chris 翻译 | 苏本如,责编 | 夕颜 头图 | CSDN付费下载自视觉中国 出品 | CSDN(ID:CSDNnews) 以下为译文: 本文列出53个Python面试问题,并且提供了 ...

  10. python作者 google面试_如果Google面试让你用python写一个树的遍历程序

    前几天忽然对python很感兴趣,学了几天也感觉它非常的简洁实用.打破了我这么长时间对java C# C 和vb的审美疲劳,让我眼前一亮."就像读英文一样简单"这句话评价pytho ...

最新文章

  1. 独家 | 从零开始用python搭建推荐引擎(附代码)
  2. 回首2013 展望2014
  3. ThinkPHP3.1快速入门(2)数据CURD
  4. poj 3189 Steady Cow Assignment(二分+最大流)
  5. 解决log4j2漏洞遭到挖矿、僵尸进程病毒攻击
  6. CodeForces - 1323D Present(思维+数学)
  7. 解密HLS中的AES加密
  8. 偏函数 匿名函数 高阶函数 map filter reduce
  9. java 验证码_如何使用Java生成随机验证码
  10. Java中的方法(形参及实参)return返回类型
  11. appium在android7.0上无法启动问题
  12. Gstreamer加载插件原理(二十五)
  13. centos8 yum安装mysql8 流程配置
  14. 2021 软件开发的 5 大趋势,低代码、无代码得到了验证!
  15. Linux netstat命令详解
  16. axure rp8 添加动态面板_Axure原型教程:使用动态面板简单实现三级菜单
  17. C#数据库教程5-ADO.NET登录页面设计
  18. http协议 服务器主动下发,HTTP协议快速入门指南
  19. 当外面的容器的height使用百分比时,如何设置line-height可以使里面的文字垂直居中
  20. git报错-The file will have its original

热门文章

  1. Max Script|加密写法
  2. 基于RPGMakerMV的JavaScript基础-5
  3. JDK下载与安装详细步骤
  4. nginx-请求转发
  5. 双路服务器装mac系统,华硕Z10 C612,双路E5继续折腾调试改机型Macpro终于成功。...
  6. 好好编程-物流项目01【搭建maven工程】
  7. Python:自适应滤波器简介及其实现方法
  8. matlab 蜗杆轮廓,基于MATLAB的直廓环面蜗杆的可视化
  9. bat转换成exe文件:bat2exe
  10. 嵌入式linux 学习笔记--如何使用udhcpc获取动态IP