动态规划之矩阵连乘问题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通过pil为png图片填充上背景颜色的方法
Mar 17 Python
在Python中使用__slots__方法的详细教程
Apr 28 Python
在DigitalOcean的服务器上部署flaskblog应用
Dec 19 Python
详解appium+python 启动一个app步骤
Dec 20 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
Python使用微信接入图灵机器人过程解析
Nov 04 Python
调用其他python脚本文件里面的类和方法过程解析
Nov 15 Python
基于python3实现倒叙字符串
Feb 18 Python
深入浅析Python 函数注解与匿名函数
Feb 24 Python
解决python中import文件夹下面py文件报错问题
Jun 01 Python
pytorch读取图像数据转成opencv格式实例
Jun 02 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的中问验证码
2006/11/25 PHP
PHP迅雷、快车、旋风下载专用链转换代码
2010/06/15 PHP
PHP实现CSV文件的导入和导出类
2015/03/24 PHP
php $_SESSION会员登录实例分享
2021/01/19 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
Jqyery中同等与js中windows.onload的应用
2011/05/10 Javascript
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
2014/08/30 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
vue中axios处理http发送请求的示例(Post和get)
2017/10/13 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
微信小程序实现留言功能
2018/10/31 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
Python 异常处理实例详解
2014/03/12 Python
简单解析Django框架中的表单验证
2015/07/17 Python
Python操作MySQL数据库的方法
2018/06/20 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
Python装饰器用法与知识点小结
2020/03/09 Python
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
JPA的特点
2014/10/25 面试题
小学班主任寄语大全
2014/04/04 职场文书
财务部绩效考核方案
2014/05/04 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
《日月潭》教学反思
2016/02/20 职场文书