动态规划之矩阵连乘问题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 ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 Python
Pycharm学习教程(3) 代码运行调试
May 03 Python
numpy使用fromstring创建矩阵的实例
Jun 15 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 Python
浅谈python下tiff图像的读取和保存方法
Dec 04 Python
Python语言快速上手学习方法
Dec 14 Python
python实现图片彩色转化为素描
Jan 15 Python
Python 使用 prettytable 库打印表格美化输出功能
Dec 26 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
python利用os模块编写文件复制功能——copy()函数用法
Jul 13 Python
判断Python中的Nonetype类型
May 25 Python
教你如何用Python实现人脸识别(含源代码)
Jun 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实现将上传word文件转为html的方法
2015/06/03 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
JavaScript交换两个变量值的七种解决方案
2016/12/01 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
2017/12/01 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
angularjs实现table增加tr的方法
2018/02/27 Javascript
vue2 设置router-view默认路径的实例
2018/09/20 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
Python中的ctime()方法使用教程
2015/05/22 Python
python web基础之加载静态文件实例
2018/03/20 Python
python三引号输出方法
2019/02/27 Python
Python3进制之间的转换代码实例
2019/08/24 Python
Python猴子补丁知识点总结
2020/01/05 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
Python小白学习爬虫常用请求报头
2020/06/03 Python
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
澳大利亚排名第一的在线酒类商店:MyBottleShop
2018/04/26 全球购物
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
大学本科毕业生的自我鉴定范文
2013/11/19 职场文书
学生社团文化节开幕式主持词
2014/03/28 职场文书
售后客服工作职责
2014/06/16 职场文书
2014年班组长工作总结
2014/11/20 职场文书
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记