概述
本文实例讲述了动态规划之矩阵连乘问题Python实现方法。分享给大家供大家参考,具体如下:
给定n个矩阵{A@H_403_4@1,A@H_403_4@2,…,A@H_403_4@n}@H_403_4@,其中Ai与Ai+1是可乘的,i=1,2,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
例如:
A@H_403_4@1={30x35} ; A@H_403_4@2={35x15} ;A@H_403_4@3={15x5} ;A@H_403_4@4={5x10} ;A@H_403_4@5={10x20} ;A@H_403_4@6={20x25} ;
结果为:((A@H_403_4@1(A@H_403_4@2A@H_403_4@3))((A@H_403_4@4A@H_403_4@5)A@H_403_4@6)) 最小的乘次为15125。
原问题为n个矩阵连乘,将原问题分解为子问题,即当n等于1,3.....时。
n==1@H_403_4@时,单一矩阵,不需要计算。最小乘次为0
n==2@H_403_4@时,根据n==1时的结果,遍历计算出每相邻两个矩阵的最小乘次
n==3@H_403_4@时,根据n==1和n==2时的结果,此时已经求出每相邻1个、2个矩阵的最小乘次,遍历计算出该相邻三个矩阵的最小乘次
依次类推……
当n==n@H_403_4@时,根据n==1、2、……n-1时的结果,此时已经求出每相邻1个、2个、3个……n-1个矩阵的最小乘次,由此求出n==n时的最小乘次
每当n增加1时,就利用已求出的子结构来求解此时的最优值。
数学描述如下:
设矩阵Ai的维数为P@H_403_4@i × P@H_403_4@i+1。
设A@H_403_4@[i:j]为矩阵A@H_403_4@iA@H_403_4@i+1....A@H_403_4@j的连乘积,即从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]+P@H_403_4@i*P@H_403_4@k+1*P@H_403_4@j+1最小。
该算法的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,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加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
总结
以上是编程之家为你收集整理的动态规划之矩阵连乘问题Python实现方法全部内容,希望文章能够帮你解决动态规划之矩阵连乘问题Python实现方法所遇到的程序开发问题。
如果您也喜欢它,动动您的小指点个赞吧