动态规划之矩阵连乘问题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的几条建议分享
Feb 10 Python
跟老齐学Python之玩转字符串(2)更新篇
Sep 28 Python
Python xlrd读取excel日期类型的2种方法
Apr 28 Python
Python中的变量和作用域详解
Jul 13 Python
Python用UUID库生成唯一ID的方法示例
Dec 15 Python
pandas数据预处理之dataframe的groupby操作方法
Apr 13 Python
python学习基础之循环import及import过程
Apr 22 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
利用python开发app实战的方法
Jul 09 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
Jul 10 Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 Python
Python写情书? 10行代码展示如何把情书写在她的照片里
Apr 21 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
关于zend studio 出现乱码问题的总结
2013/06/23 PHP
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
jQuery Html控件基本操作(日常收集整理)
2016/03/11 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
JS中使用apply方法通过不同数量的参数调用函数的方法
2016/05/31 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
js生成word中图片处理方法
2018/01/06 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
python根据京东商品url获取产品价格
2015/08/09 Python
python图片验证码生成代码
2016/07/02 Python
浅析Python中yield关键词的作用与用法
2016/11/29 Python
python 计算文件的md5值实例
2017/01/13 Python
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
Python计算两个矩形重合面积代码实例
2019/09/16 Python
django框架两个使用模板实例
2019/12/11 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
详解用Python调用百度地图正/逆地理编码API
2020/07/02 Python
python 字符串格式化的示例
2020/09/21 Python
俄罗斯便宜的在线服装商店:GroupPrice
2020/04/10 全球购物
如何开发安全的AJAX应用
2014/03/26 面试题
python神经网络编程之手写数字识别
2021/05/08 Python
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python