在動態規劃演算法中,區域性最優並不一定會使得全域性最優,它在每乙個階段的決策都會影響到後面的決策。所以我們在將問題劃分為若干階段時,需要將各個階段所發生的不同狀態儲存起來,提供後一階段做決策。一般都是子問題重疊的時候使用動態規劃。下面是乙個矩陣連乘的問題。
問題:n個矩陣連乘問題
描述:矩陣連乘滿足結合律,在n個矩陣連乘時,什麼樣的結合方式可以使得整個過程中所做的乘法次數最小。
數量化:記 mi
* mi+1
… * mj
的乘法次數記為mi,j,矩陣大小為:m1
=r1*r2
,m2=r
2*r3, mi=r
i * r
i+1。
因此,對於mi,j,我們可以知道,當 i = j 的時候,即連乘式子中只有乙個矩陣,此時mi,j = 0。當 j = i + 1 的時候,mi,j = r
i* r
i+1* r
i+2。因此
,對於一n個矩陣連乘的式子m1 * m2 … * mn ,我們可以直接知道所有相鄰的兩個矩陣的乘法次數。這個結論先放著。
我們繼續,當 j > i 時,我們可以將 m
i * m
i+1
… * mj
根據結合律
成兩個連乘式子,劃分斷點為k,即劃分為了
(mi * … * mk ) * (mk+1 * … * mj ),這裡的k的取值當然不止乙個,可以從i到j,即可以得到像下面這些這樣子的兩個式子:
mi * (mi+1 *… * mj )k = i對於每種結合,我們可以將問題程式設計分別求劃分開的兩個式子的最小乘法次數。一直縮小直到轉換為相鄰兩個矩陣的乘法。每個階段都儲存次數最小的情況。下面乙個圖來說明這個問題:(mi * mi+1 ) * (mi+2 * … * mj )k = i +1
(mi * … * mj-1 ) * mj
k = j - 1 m
i * m
i+1
… * mj
k = j
分別求得各個k值情況下的最優,一直劃分,直到轉換成求相鄰兩個矩陣乘法次數的問題。每次都是取最優情況,比如最後k指向的是c,劃分為求a*b*c和+d的最優解,然後然後a*b*c的k有兩種取法,分別求這兩種取法下各自的乘法次數,儲存其中乘法次數較少的k值,這樣就可以直到是怎麼結合的了,得到較少的那種劃分。然後對於整個的a*b*c*d,對於每種k所求得的最小乘法次數,取得最小的k。
動態規劃之矩陣連乘問題
矩陣連乘問題是通過給矩陣連乘時加括號,使得總的計算量最小。考慮3個矩陣相乘的例子,a1,a2,a3,假設這3個矩陣的維數分別為 10x100,100x50,5x50 若按照 a1a2 a3 方式計算,需要的數乘次數為10x100x5 10x5x50 7500 若按照 a1 a2a3 方式計算,需要的...
動態規劃之矩陣連乘問題
給定 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...