動態(tài)規(guī)劃之矩陣連乘問題Python實現(xiàn)方法
本文實例講述了動態(tài)規(guī)劃之矩陣連乘問題Python實現(xiàn)方法。分享給大家供大家參考,具體如下:
給定n個矩陣{A1,A2,…,An},其中Ai與Ai+1是可乘的,i=1,2 ,…,n-1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數(shù)乘次數(shù)最少。
例如:
A1={30x35} ; A2={35x15} ;A3={15x5} ;A4={5x10} ;A5={10x20} ;A6={20x25} ;
結(jié)果為:((A1(A2A3))((A4A5)A6)) 最小的乘次為15125。
原問題為n個矩陣連乘,將原問題分解為子問題,即當n等于1,2,3.....時。
n==1時,單一矩陣,不需要計算。最小乘次為0
n==2時,根據(jù)n==1時的結(jié)果,遍歷計算出每相鄰兩個矩陣的最小乘次
n==3時,根據(jù)n==1和n==2時的結(jié)果,此時已經(jīng)求出每相鄰1個、2個矩陣的最小乘次,遍歷計算出該相鄰三個矩陣的最小乘次
依次類推……
當n==n時,根據(jù)n==1、2、……n-1時的結(jié)果,此時已經(jīng)求出每相鄰1個、2個、3個……n-1個矩陣的最小乘次,由此求出n==n時的最小乘次
每當n增加1時,就利用已求出的子結(jié)構(gòu)來求解此時的最優(yōu)值。
數(shù)學描述如下:
設(shè)矩陣Ai的維數(shù)為Pi × Pi+1。
設(shè)A[i:j]為矩陣AiAi+1....Aj的連乘積,即從Ai到Aj的連乘積,其中,0 <= i <= j <= n-1
設(shè)m[i][j]為計算A[i:j]的最小乘次,所以原問題的最優(yōu)值為m[0][n-1]。
當 i==j 時,單一矩陣,無需計算。m[i][i]=0,i=0,1,....n-1
當 i < j 時,利用最優(yōu)子結(jié)構(gòu),計算m[i][j]。即尋找斷開位置k(i <= k < j),使得m[i][k]+m[k+1][j]+Pi*Pk+1*Pj+1最小。
該算法的python實現(xiàn):
# coding=gbk # 矩陣連乘問題 __author__ = 'ice' # row_num 每個矩陣的行數(shù) 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
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計有所幫助。
相關(guān)文章
Python實現(xiàn)softmax反向傳播的示例代碼
這篇文章主要為大家詳細介紹了Python實現(xiàn)softmax反向傳播的相關(guān)資料,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的可以了解一下2023-04-04Pandas常用累計、同比、環(huán)比等統(tǒng)計方法實踐過程
這篇文章主要介紹了Pandas常用累計、同比、環(huán)比等統(tǒng)計方法實踐過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05Python內(nèi)置數(shù)學函數(shù)和math模塊使用指南
這篇文章主要為大家介紹了Python數(shù)學函數(shù)math模塊使用指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11Python實現(xiàn)的銀行系統(tǒng)模擬程序完整案例
這篇文章主要介紹了Python實現(xiàn)的銀行系統(tǒng)模擬程序,結(jié)合完整實例形式分析了Python基于面向?qū)ο蟪绦蛟O(shè)計模擬的銀行系統(tǒng)登錄驗證、開戶、找回密碼、掛失、查詢、存取款、轉(zhuǎn)賬等功能相關(guān)操作技巧,需要的朋友可以參考下2019-04-04