动态规划之矩阵连乘问题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 基础学习第二弹 类属性和实例属性
Aug 27 Python
Python的ORM框架SQLAlchemy入门教程
Apr 28 Python
Python 中Pickle库的使用详解
Feb 24 Python
Linux下Python安装完成后使用pip命令的详细教程
Nov 22 Python
Python面向对象程序设计示例小结
Jan 30 Python
python列表推导式操作解析
Nov 26 Python
Python线程threading模块用法详解
Feb 26 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 Python
python实现Pyecharts实现动态地图(Map、Geo)
Mar 25 Python
python实现excel公式格式化的示例代码
Dec 23 Python
安装不同版本的tensorflow与models方法实现
Feb 20 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修改指定文件后缀的方法
2014/09/11 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
PHP二维数组去重算法
2016/12/17 PHP
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
javascript定义变量时加var与不加var的区别
2014/12/22 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
JavaScript中的普通函数与构造函数比较
2015/04/07 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
2016/07/18 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
canvas实现图像布局填充功能
2017/02/06 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
实例讲解python中的序列化知识点
2018/10/08 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
药品业务员岗位职责
2014/04/17 职场文书
三分钟英语演讲稿
2014/04/24 职场文书
党支部对照检查材料
2014/08/25 职场文书
详解Laravel服务容器的优势
2021/05/29 PHP
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python