动态规划之矩阵连乘问题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 17 Python
Python构建XML树结构的方法示例
Jun 30 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
Dec 06 Python
python给微信好友定时推送消息的示例
Feb 20 Python
python在回调函数中获取返回值的方法
Feb 22 Python
python爬虫之验证码篇3-滑动验证码识别技术
Apr 11 Python
Pandas之DataFrame对象的列和索引之间的转化
Jun 25 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
Dec 11 Python
Python3获取cookie常用三种方案
Oct 05 Python
Python实现http接口自动化测试的示例代码
Oct 09 Python
Python基础之条件语句详解
Jun 16 Python
python中redis包操作数据库的教程
Apr 19 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
SONY SRF-M100的电路分析
2021/03/02 无线电
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
2007/05/03 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
php注册审核重点解析(数据访问)
2017/05/23 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
学习ExtJS fit布局使用说明
2009/10/08 Javascript
js展开闭合效果演示代码
2013/07/24 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
AngularJs中route的使用方法和配置
2016/02/04 Javascript
Bootstrap网格系统详解
2016/04/26 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
ES6新特性之变量和字符串用法示例
2017/04/01 Javascript
jQuery访问浏览器本地存储cookie、localStorage和sessionStorage的基本用法
2017/10/20 jQuery
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
使用C语言扩展Python程序的简单入门指引
2015/04/14 Python
python读写二进制文件的方法
2015/05/09 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
深入浅析Python 函数注解与匿名函数
2020/02/24 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
CSS3实现可翻转的hover效果
2018/05/23 HTML / CSS
20佳惊艳的HTML5应用程序示例分享
2011/05/03 HTML / CSS
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
幼儿园教学管理制度
2014/02/04 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
2014年党务工作总结
2014/11/25 职场文书