動態規劃之矩陣連乘問題

2021-07-04 11:09:06 字數 1329 閱讀 6807

在動態規劃演算法中,區域性最優並不一定會使得全域性最優,它在每乙個階段的決策都會影響到後面的決策。所以我們在將問題劃分為若干階段時,需要將各個階段所發生的不同狀態儲存起來,提供後一階段做決策。一般都是子問題重疊的時候使用動態規劃。下面是乙個矩陣連乘的問題。

問題: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...