动态规划之矩阵连乘问题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网页请求urllib2模块简单封装代码
Feb 07 Python
python实现从字符串中找出字符1的位置以及个数的方法
Aug 25 Python
Python 3.7新功能之dataclass装饰器详解
Apr 21 Python
python email smtplib模块发送邮件代码实例
Apr 26 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
python flask框架实现重定向功能示例
Jul 02 Python
在pytorch中查看可训练参数的例子
Aug 18 Python
python+tkinter实现学生管理系统
Aug 20 Python
Python单链表原理与实现方法详解
Feb 22 Python
详解python 内存优化
Aug 17 Python
Python实现区域填充的示例代码
Feb 03 Python
Python 转移文件至云对象存储的方法
Feb 07 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
php过滤危险html代码
2008/08/18 PHP
yii数据库的查询方法
2015/12/28 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
ubuntu下安装nodejs以及升级的办法
2015/05/08 NodeJs
javascript常用函数(1)
2015/11/04 Javascript
html5+javascript实现简单上传的注意细节
2016/04/18 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
微信小程序跳转到其他网页(外部链接)的实现方法
2019/09/20 Javascript
HTML+JavaScript实现扫雷小游戏
2019/09/30 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
Python3连接SQLServer、Oracle、MySql的方法
2018/06/28 Python
python圣诞树编写实例详解
2020/02/13 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
基于python实现坦克大战游戏
2020/10/27 Python
HTML5 canvas实现的静态循环滚动播放弹幕
2021/01/05 HTML / CSS
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
法制宣传实施方案
2014/03/13 职场文书
优秀三好学生事迹材料
2014/08/31 职场文书
作风建设整改方案
2014/10/27 职场文书
帮你提高开发效率的JavaScript20个技巧
2021/06/18 Javascript
threejs太阳光与阴影效果实例代码
2022/04/05 Javascript