动态规划之矩阵连乘问题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中处理日期和时间的基本知识点整理汇总
May 22 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
python虚拟环境virtualenv的使用教程
Oct 20 Python
Python操作Oracle数据库的简单方法和封装类实例
May 07 Python
Python实现统计给定字符串中重复模式最高子串功能示例
May 16 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
Apr 15 Python
python3实现字符串操作的实例代码
Apr 16 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
Aug 07 Python
Python内置函数property()如何使用
Sep 01 Python
Python3如何使用tabulate打印数据
Sep 25 Python
python中的对数log函数表示及用法
Dec 09 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中实现Bloom Filter算法
2015/03/30 PHP
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
为开发者准备的10款最好的jQuery日历插件
2014/02/04 Javascript
javascript中Object使用详解
2015/01/26 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
2017/02/24 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
小程序中canvas的drawImage方法参数使用详解
2019/07/04 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
深入了解Vue3模板编译原理
2020/11/19 Vue.js
Python实现Linux下守护进程的编写方法
2014/08/22 Python
Python深入学习之内存管理
2014/08/31 Python
python根据出生年份简单计算生肖的方法
2015/03/27 Python
答题辅助python代码实现
2018/01/16 Python
python3 爬取图片的实例代码
2018/11/06 Python
Python生命游戏实现原理及过程解析(附源代码)
2019/08/01 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
Python配置pip国内镜像源的实现
2020/08/20 Python
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
网游商务专员求职信
2013/10/15 职场文书
计算机科学与技术应届生求职信
2013/11/07 职场文书
建议书怎么写
2014/03/12 职场文书
工程承包协议书范本
2014/09/29 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
幼儿园大班开学寄语(2016秋季)
2015/12/03 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers