矩陣連乘問題是通過給矩陣連乘時加括號,使得總的計算量最小。
考慮3個矩陣相乘的例子, a1,a2,a3,假設這3個矩陣的維數分別為 10x100,100x50,5x50
若按照((a1a2)a3)方式計算,需要的數乘次數為10x100x5+10x5x50 =
7500
若按照(a1(a2a3))方式計算,需要的數乘次數為100x5x50+10x100x50 =
75000
設計求解具體問題的動態規劃演算法的第一步是刻畫該問題的最優解的結構特徵。我們將矩陣連乘積aiai+1....aj簡記為a[ i : j ]。考察計算a[ 1: n]的最優計算次序。設這個計算次序在矩陣ak和ak+1之間將矩陣鏈斷開,1<=k
設計動態規劃演算法的第二步就是遞迴地定義最優值。對於矩陣連乘積的最有計算次序問題,設計算
a[i:j], 1<=i<=j<=n
,所需的最少數乘次數為
m[i][j]
,則原問題的最優值為
m[1][n]。當
i=j時,
a[i;j ]=ai
,為單一矩陣,無需計算,因此
m[i][i]=0。當
i < j
時,可以利用最優子結構的性質來計算
m[i][j]
。事實上,若計算
a[i:j]
的最優次序在ak和
ak+1
之間斷開,
i<=k,則
m[i][j]=m[i][k]+m[k+1][j]+pi-1*pk*pj
。其中pi
表示第i
個矩陣的列數,也是第
i-1個矩陣的行數,
p0表示第乙個矩陣的行數。由於在計算時並不知道斷開點
k的位置,所以
k還未定。不過
k的位置只有
j-i個可能。從而
m[i][j]
可以遞迴地定義為
當i=j m[i][j] = 0當i
m[i][j]
給出了最優值,即計算
a[i:j]
所需的最少數乘次數。同時還確定了計算
a[i:j]
的最優次序中的斷開位置
k,也就是說,對於這個k有
m[i][j]=m[i[k]+m[k+1][j] + pi-1*pk*pj
若將對應於
m[i][j]
的斷開位置k記為
s[i][j]
,在計算最優值
m[i][j]
後,可以遞迴地有
s[i][j]
構造出相應的最優解。
動態規劃之矩陣連乘問題
在動態規劃演算法中,區域性最優並不一定會使得全域性最優,它在每乙個階段的決策都會影響到後面的決策。所以我們在將問題劃分為若干階段時,需要將各個階段所發生的不同狀態儲存起來,提供後一階段做決策。一般都是子問題重疊的時候使用動態規劃。下面是乙個矩陣連乘的問題。問題 n個矩陣連乘問題 描述 矩陣連乘滿足結...
動態規劃之矩陣連乘問題
給定 n 個矩陣 其中 a i 與 a 是可乘的 i 1,2,ldots,n 1 矩陣 a i 的維數為 p p i,i 1,2,ldots,n 考察這 n 個矩陣的連乘積 a 1a 2 ldots a n 要求通過新增括號使得矩陣連乘時,數乘次數最少。例如連乘積 a 1a 2a 3a 4 可以有以...
矩陣連乘 動態規劃 動態規劃解矩陣連乘問題
一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 1 尋找最優子結構 假設我們已經找到父矩陣鏈最優解,當我們劃分到最後一步時都是兩個子矩陣鏈 分別被括號包圍 相乘,如 a1a2a3a4 a5a6a7...