本文实例讲述了动态规划之矩阵连乘问题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 key=lambda函数_使用’key’和lambda表达式的python max函数

    我来自OOP背景,尝试学习Python.我使用的是max函数,该函数使用lambda表达式返回Player类型的实例,其中players列表中的totalScore最大. def winner(): ...

  2. python 找到装饰器_[译] 12步轻松搞定python装饰器

    呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数 ...

  3. python调用matlab函数_从 Python 调用 MATLAB 函数的三种方法

    0. 实验环境Ubuntu 16.04 Matlab R2015b 1. 借助于 mlab 库 安装方法非常简单,只需一行命令 sudo pip install mlab 即可. import num ...

  4. python中add函数_如何使用python中的add函数?

    之前向大家介绍过python中的求和函数sum函数,numpy中的sum函数,对于数组可以指定维度进行相加.numpy中还有另一种求和运算方法,即add函数.add函数不仅作用于numpy中加法运算, ...

  5. python的random函数_关于random()的详细介绍

    这篇文章主要介绍了Python随机生成数模块random使用实例,本文直接给出示例代码,需要的朋友可以参考下代码如下:#!/usr/bin/env python#coding=utf-8import ...

  6. python强制结束函数_为什么Python没有 main 函数?终于有人给出了正确答案!

    毫无疑问,Python中没有所谓的 main 入口函数,但在网上经常有文章提到"Python中的main函数"和"建议编写main函数"等. 他们的目的可能是模 ...

  7. python 使用异常函数_您如何测试Python函数引发异常?

    python 使用异常函数 This article elaborates on how to implement a test case for a function that raises an ...

  8. python 中arange函数_浅谈Python中range与Numpy中arange的比较

    本文先比较range与arange的异同点,再详细介绍各自的用法,然后列举了几个简单的示例,最后对xrange进行了简单的说明. 1. range与arange的比较 (1)相同点:A.参数的可选性. ...

  9. python指数运算函数_分享Python中用于计算指数的exp()方法实例教程

    exp()方法返回指数x: ex. 语法 以下是exp()方法的语法:import math math.exp( x ) 注意:此函数是无法直接访问的,所以我们需要导入math模块,然后需要用math ...

最新文章

  1. 多店铺多用户商城可以用来干嘛?适合什么样的商业模式?
  2. R安装包源设置的常见方式及国内常用源
  3. Jupyter Notebook 使用流程
  4. RISC-V生态未来的三种可能~
  5. 把windows一个目录mount到Ubuntu下,非root用户没有写权限
  6. Pyhton基础篇(2)-变量、用户输入及条件语句(已更新)
  7. java动态拼接String类sql
  8. HangFire循环作业中作业因执行时间太长未完成新作业开启导致重复数据的问题...
  9. Android项目目录结构
  10. python开发之路目录
  11. 用evo工具分析ORB-SLAM2运行TUM,KITTI,EuRoC数据集轨迹
  12. Qt C++制作桌面天气,无边框、透明窗口,心知天气API,开放源码
  13. 如何利用液体密度传感器准确地表征罐箱的质量规格?
  14. 记一次代码编写规范引发的惨案 | perl脚本转前端平台代码之‘天坑’
  15. 七巧板复原之剩余区域的计算-多边形的加减法计算
  16. 幸运大转盘php逻辑判断,jQuery幸运大转盘_jQuery+PHP抽奖程序(上)
  17. Python系列(五):bytes和str的区别与联系
  18. 新版本已经不需要了icudtl.dat文件
  19. 【UE4】插件与模块
  20. 老男孩教育Linux运维培训32期决心书

热门文章

  1. HTML下拉菜单为什么无线拉长,【CSS】怎么拉长一个div的高度
  2. 原创设计师交流平台|集设作品传播和推荐的地方
  3. 适用于Photoshop,Xd和Sketch的UI套件
  4. 触发器_触发器第三弹
  5. c语言传入的指针无返回值,c语言 关于指针注意事项
  6. 使用持久内存开发工具包 (PMDK) 创建持久内存感知队列
  7. C语言插件开发模式与分析
  8. C语言控制台窗口界面编程:用printf在终端打印一个GUI窗口
  9. json 转换 java odl_JSON与JAVA数据的转换
  10. linux 指定cpu运行线程,linux 线程与CPU绑定