动态规划之矩阵连乘问题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脚本判断 Linux 是否运行在虚拟机上
Apr 25 Python
Python文件去除注释的方法
May 25 Python
使用Python神器对付12306变态验证码
Jan 05 Python
Python多进程multiprocessing用法实例分析
Aug 18 Python
Python3.4实现远程控制电脑开关机
Feb 22 Python
python删除本地夹里重复文件的方法
Nov 19 Python
如何安装多版本python python2和python3共存以及pip共存
Sep 18 Python
Python http接口自动化测试框架实现方法示例
Dec 06 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
Python: 传递列表副本方式
Dec 19 Python
Django中的JWT身份验证的实现
May 07 Python
python周期任务调度工具Schedule使用详解
Nov 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
Protoss魔法科技
2020/03/14 星际争霸
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
php简单实现快速排序的方法
2015/04/04 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
Jqyery中同等与js中windows.onload的应用
2011/05/10 Javascript
JavaScript中的typeof操作符用法实例
2014/04/05 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
AngularJS基础 ng-model-options 指令简单示例
2016/08/02 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
基于JavaScript实现弹幕特效
2020/08/27 Javascript
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
Python自动重试HTTP连接装饰器
2015/04/28 Python
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
Python算法之求n个节点不同二叉树个数
2017/10/27 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Python实现EXCEL表格的排序功能示例
2019/06/25 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
化工工艺专业求职信
2013/09/22 职场文书
浪费资源的建议书
2014/03/12 职场文书
2015年行政部工作总结
2015/04/28 职场文书
诚实守信主题班会
2015/08/13 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
muduo TcpServer模块源码分析
2022/04/26 Redis
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL