动态规划之矩阵连乘问题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变量和字符串详解
Apr 29 Python
解决python读取几千万行的大表内存问题
Jun 26 Python
django从请求到响应的过程深入讲解
Aug 01 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
如何解决django-celery启动后迅速关闭
Oct 16 Python
django admin 添加自定义链接方式
Mar 11 Python
Python opencv相机标定实现原理及步骤详解
Apr 09 Python
JupyterNotebook 输出窗口的显示效果调整方法
Apr 13 Python
使用 django orm 写 exists 条件过滤实例
May 20 Python
Spark处理数据排序问题如何避免OOM
May 21 Python
Python 实现敏感目录扫描的示例代码
May 21 Python
Python fileinput模块如何逐行读取多个文件
Oct 05 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中循环语句的用法介绍
2012/01/30 PHP
PHP 面向对象详解
2012/09/13 PHP
php实现的任意进制互转类分享
2015/07/07 PHP
PHP实现转盘抽奖算法分享
2020/04/15 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
2012/01/15 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
详解handlebars+require基本使用方法
2016/12/21 Javascript
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
在JavaScript中使用严格模式(Strict Mode)
2019/06/13 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
2020/02/28 Python
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
美国高端牛仔品牌:Silver Jeans
2019/12/12 全球购物
技校个人求职信范文
2014/01/25 职场文书
工厂门卫岗位职责范本
2014/04/04 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
2014年纪委工作总结
2014/12/05 职场文书
雨花台导游词
2015/02/06 职场文书
2015年端午节活动总结
2015/02/11 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
辞职信格式范文
2015/05/13 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书