动态规划之矩阵连乘问题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基础教程之简单入门说明(变量和控制语言使用方法)
Mar 25 Python
python海龟绘图实例教程
Jul 24 Python
Python 绘图和可视化详细介绍
Feb 11 Python
Python实现求一个集合所有子集的示例
May 04 Python
python保存数据到本地文件的方法
Jun 23 Python
Pycharm设置utf-8自动显示方法
Jan 17 Python
python 随机生成10位数密码的实现代码
Jun 27 Python
Python 实现大整数乘法算法的示例代码
Sep 17 Python
python同义词替换的实现(jieba分词)
Jan 21 Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 Python
pandas分批读取大数据集教程
Jun 06 Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Apr 24 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
Protoss热键控制
2020/03/14 星际争霸
php 如何获取数组第一个值
2013/08/06 PHP
Thinkphp5.0框架视图view的模板布局用法分析
2019/10/12 PHP
Nigma vs Alliance BO5 第五场2.14
2021/03/10 DOTA
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
浅析JS操作DOM的一些常用方法
2016/05/13 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
pycharm 配置远程解释器的方法
2018/10/28 Python
Django objects的查询结果转化为json的三种方式的方法
2018/11/07 Python
python3.6根据m3u8下载mp4视频
2019/06/17 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
Python flask框架端口失效解决方案
2020/06/04 Python
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
酒吧创业计划书
2014/01/18 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
面试复试通知单
2015/04/24 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
亲戚关系证明
2015/06/24 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
导游词之徐州-云龙山
2019/09/29 职场文书
对Keras自带Loss Function的深入研究
2021/05/25 Python
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS