动态规划之矩阵连乘问题Python实现方法


Posted in Python onNovember 27, 2017

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

该算法的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程序转化为可执行程序[整理]
Apr 09 Python
Python中内建函数的简单用法说明
May 05 Python
Python 'takes exactly 1 argument (2 given)' Python error
Dec 13 Python
Python内置函数——__import__ 的使用方法
Nov 24 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
解决python字典对值(值为列表)赋值出现重复的问题
Jan 20 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
Jul 11 Python
python切片(获取一个子列表(数组))详解
Aug 09 Python
关于Python turtle库使用时坐标的确定方法
Mar 19 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
Tensorflow--取tensorf指定列的操作方式
Jun 30 Python
Python基于贪心算法解决背包问题示例
Nov 27 #Python
Python标准模块--ContextManager上下文管理器的具体用法
Nov 27 #Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 #Python
深入理解Python中range和xrange的区别
Nov 26 #Python
PyCharm在win10的64位系统安装实例
Nov 26 #Python
python shell根据ip获取主机名代码示例
Nov 25 #Python
python自动裁剪图像代码分享
Nov 25 #Python
You might like
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
PHP代码审核的详细介绍
2013/06/13 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&amp;Firefox] 有文档和例子
2007/05/30 Javascript
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
用JQUERY增删元素的代码
2012/02/14 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
每天一篇javascript学习小结(Function对象)
2015/11/16 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
使用JavaScript进行表单校验功能
2017/08/01 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
VUE实现移动端列表筛选功能
2019/08/23 Javascript
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
python 简易计算器程序,代码就几行
2009/08/29 Python
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
详解python3中socket套接字的编码问题解决
2017/07/01 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
解决python中画图时x,y轴名称出现中文乱码的问题
2019/01/29 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
Python jieba库用法及实例解析
2019/11/04 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
工商管理应届生求职信
2013/10/07 职场文书
初中校园之声广播稿
2014/01/15 职场文书
大二学生学习个人自我评价
2014/01/19 职场文书
工作室成员个人发展规划范文
2014/01/24 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
幼儿园家长安全责任书
2014/07/22 职场文书
食品安全承诺书范文
2014/08/29 职场文书
二年级作文之动物作文
2019/11/13 职场文书
Python+Tkinter打造签名设计工具
2022/04/01 Python