动态规划之矩阵连乘问题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程序实例(通讯录)
Nov 29 Python
在Python的web框架中编写创建日志的程序的教程
Apr 30 Python
Python实现的Excel文件读写类
Jul 30 Python
python魔法方法-属性访问控制详解
Jul 25 Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
django 发送邮件和缓存的实现代码
Jul 18 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
在python中计算ssim的方法(与Matlab结果一致)
Dec 19 Python
Pytorch中膨胀卷积的用法详解
Jan 07 Python
python常量折叠基础知识点讲解
Feb 28 Python
Python Django框架介绍之模板标签及模板的继承
May 27 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
织梦模板标记简介
2007/03/11 PHP
请离开include_once和require_once
2013/07/18 PHP
php json与xml序列化/反序列化
2013/10/28 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
PHP常用算法和数据结构示例(必看篇)
2017/03/15 PHP
php图像验证码生成代码
2017/06/08 PHP
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
探讨JavaScript中声明全局变量三种方式的异同
2013/12/03 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
js全选按钮的实现方法
2015/11/17 Javascript
vue多级多选菜单组件开发
2020/09/08 Javascript
React中使用collections时key的重要性详解
2017/08/07 Javascript
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
通过实例讲解JS如何防抖动
2019/06/15 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
小程序实现录音功能
2020/09/22 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
python搜索指定目录的方法
2015/04/29 Python
Python 加密与解密小结
2018/12/06 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
python使用pandas处理excel文件转为csv文件的方法示例
2019/07/18 Python
解决pycharm 安装numpy失败的问题
2019/12/05 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
python中有函数重载吗
2020/05/28 Python
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
大学生毕业自我鉴定范文
2013/11/03 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
中文专业求职信
2014/06/20 职场文书
新农村建设汇报材料
2014/08/15 职场文书
2015年依法行政工作总结
2015/04/29 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python