动态规划之矩阵连乘问题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 相关文章推荐
qpython3 读取安卓lastpass Cookies
Jun 19 Python
Python中将字典转换为列表的方法
Sep 21 Python
Python有序字典简单实现方法示例
Sep 28 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
Dec 28 Python
python远程邮件控制电脑升级版
May 23 Python
Python如何调用外部系统命令
Aug 07 Python
python微信公众号开发简单流程实现
Mar 09 Python
python爬虫开发之urllib模块详细使用方法与实例全解
Mar 09 Python
如何使用Python处理HDF格式数据及可视化问题
Jun 24 Python
Python如何读取、写入JSON数据
Jul 28 Python
python文件名批量重命名脚本实例代码
Apr 22 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
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
PHP简单检测网址是否能够正常打开的方法
2016/09/04 PHP
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
2016/11/09 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
深入浅析vue组件间事件传递
2017/12/29 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
自学python的建议和周期预算
2019/01/30 Python
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
2020/04/22 Python
Python和Bash结合在一起的方法
2020/11/13 Python
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
薇诺娜官方网上商城:专注敏感肌肤
2017/05/25 全球购物
印度网上药店:1mg
2017/10/13 全球购物
Unineed旗下时尚轻奢网站:FABHunt
2019/05/13 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
运动会入场词50字
2014/02/20 职场文书
聚美优品励志广告词
2014/03/14 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
建国大业电影观后感
2015/06/01 职场文书
小学语文教学随笔
2015/08/14 职场文书
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server
JS class语法糖的深入剖析
2022/07/07 Javascript