动态规划之矩阵连乘问题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 相关文章推荐
pandas 数据实现行间计算的方法
Jun 08 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
Jun 13 Python
基于Python列表解析(列表推导式)
Jun 23 Python
对Python3.x版本print函数左右对齐详解
Dec 22 Python
Python数据可视化库seaborn的使用总结
Jan 15 Python
Python Flask框架扩展操作示例
May 03 Python
python输出pdf文档的实例
Feb 13 Python
django模型类中,null=True,blank=True用法说明
Jul 09 Python
Python如何将字符串转换为日期
Jul 31 Python
python 用opencv实现霍夫线变换
Nov 27 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
http通过StreamingHttpResponse完成连续的数据传输长链接方式
Feb 12 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
使用apache模块rewrite_module (转)
2007/02/14 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
input的focus方法使用
2010/03/13 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
JS判断表单输入是否为空(示例代码)
2013/12/23 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
React Native中TabBarIOS的简单使用方法示例
2017/10/13 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
2018/03/20 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
Vue-router 切换组件页面时进入进出动画方法
2018/09/01 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
利用Python为iOS10生成图标和截屏
2016/09/24 Python
python求解数组中两个字符串的最小距离
2018/09/27 Python
Python中super函数用法实例分析
2019/03/18 Python
python和c语言的主要区别总结
2019/07/07 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
python统计文章中单词出现次数实例
2020/02/27 Python
django 取消csrf限制的实例
2020/03/13 Python
Python新手学习raise用法
2020/06/03 Python
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
瑞士网球商店:Tennis-Point
2020/03/12 全球购物
毕业生写求职信的要点
2014/03/04 职场文书
《生命 生命》教学反思
2014/04/19 职场文书
教师师德演讲稿
2014/05/06 职场文书
党日活动总结
2014/05/07 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书
七年级作文之关于奶奶
2019/10/29 职场文书
Vue通过懒加载提升页面响应速度
2021/05/10 Vue.js
浅谈Python numpy创建空数组的问题
2021/05/25 Python
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript