动态规划之矩阵连乘问题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列表append和+的区别浅析
Feb 02 Python
Python去除字符串两端空格的方法
May 21 Python
Django中的forms组件实例详解
Nov 08 Python
解决项目pycharm能运行,在终端却无法运行的问题
Jan 19 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
Apr 03 Python
Python面向对象封装操作案例详解
Dec 31 Python
Django ValuesQuerySet转json方式
Mar 16 Python
Python读入mnist二进制图像文件并显示实例
Apr 24 Python
python中Django文件上传方法详解
Aug 05 Python
在终端启动Python时报错的解决方案
Nov 20 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
Feb 22 Python
Python中的 No Module named ***问题及解决
Jul 23 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+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
php实现的SESSION类
2014/12/02 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
动态修改DOM 里面的 id 属性的弊端分析
2008/09/03 Javascript
JQuery 常用操作代码
2010/03/14 Javascript
js 程序执行与顺序实现详解
2013/05/13 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
2017/04/01 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
2017/05/08 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
python 迭代器和iter()函数详解及实例
2017/03/21 Python
Django 路由控制的实现代码
2018/11/08 Python
python验证码图片处理(二值化)
2019/11/01 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
CSS3实现精美横向滚动菜单按钮
2017/04/14 HTML / CSS
法国一家芭蕾舞鞋公司:Repetto
2018/11/12 全球购物
LN-CC美国:伦敦时尚生活的缩影
2019/02/19 全球购物
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
工作所在部门证明
2014/09/21 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
企业宣传稿范文
2015/07/23 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书
销售会议开幕词
2016/03/04 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
JS Canvas接口和动画效果大全
2021/04/29 Javascript