動態規劃之矩陣連乘問題

2022-06-08 15:54:14 字數 1466 閱讀 4073

​ 給定\(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\)可以有以下5種完全加括號方式:\((a_1(a_2(a_3a_4)))\),\((a_1((a_2a_3)a_4))\),\(((a_1a_2)(a_3a_4))\),\(((a_1(a_2a_3))a_4))\),\((((a_1a_2)a_3)a_4)\)

​ 將矩陣連乘\(,\ldots,a_j}\)簡記為\(a[i:j]\)。為考察計算\(a[1:n]\)的計算次序,設這個計算次序在矩陣\(a_k(1\le k和\(a_\)之間將矩陣鏈斷開,則其相應的完全加括號方式為\(((a_1,\ldots, a_k)(a_, a_n))\)。以此次序,先計算\(a[1:k]\)和\(a[k+1:n]\),再計算結果相乘,得到總得計算順序為:\(a[1:k]\)的計算量加上\(a[k+1:n]\)的計算量,再加上\(a[1:k]\)和\(a[k+1:n]\)相乘的計算量。

​ 對於矩陣連乘積的最優計算次序問題,設計算\(a[i:j](1\le i\le j\le n)\),所需的最少數乘次數為\(m[i][j]\),則原問題的最優值為\(m[1][n]\)。

​ 當\(i = j\)時,\(a[i:j]=a_i\)為單一矩陣,無須計算,因此\(m[i][i] = 0 (i = 1, 2,\ldots, n)\)。

​ 當\(i < j\)時,利用最優子結構性質來計算\(m[i][j]\)。若\(a[i:j]\)的最優次序在 \(a_k(i\le k和\(a_\)之間斷開,則\(m[i][j] = m[i][k] + m[k+1][j] + p_p_kp_j\)。

​ 從而,\(m[i][j]\)可以遞迴定義為:

\[m[i][j]=

\begin

0 &\text \\

\underset}}

}}​ 例題分析:

​ 要計算矩陣連乘積\(a_1a_2a_3a_4a_5a_6\),其中各矩陣的維數分別如下表:

​ 演算法matrixchain記錄了構造最優解所需的全部資訊。\(s[i][j]\)中的數表明,計算矩陣鏈\(a[i:j]\)的最佳方式是在矩陣\(a_k\)和\(a_\)之間斷開,即最優加括號方式為\((a[i:k])(a[k+1:j])\)。而\(a[1:s[1][n]]\)的最優加括號方式為\((a[1:s[1][n]])(a[s[1][n]+1:n])\)。算了,直接看**吧......

void traceback(int i, int j, int **s)

動態規劃之矩陣連乘問題

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

動態規劃之矩陣連乘問題

矩陣連乘問題是通過給矩陣連乘時加括號,使得總的計算量最小。考慮3個矩陣相乘的例子,a1,a2,a3,假設這3個矩陣的維數分別為 10x100,100x50,5x50 若按照 a1a2 a3 方式計算,需要的數乘次數為10x100x5 10x5x50 7500 若按照 a1 a2a3 方式計算,需要的...

矩陣連乘 動態規劃 動態規劃解矩陣連乘問題

一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 1 尋找最優子結構 假設我們已經找到父矩陣鏈最優解,當我們劃分到最後一步時都是兩個子矩陣鏈 分別被括號包圍 相乘,如 a1a2a3a4 a5a6a7...