動態規划實現矩陣鏈乘法問題


矩陣鏈乘法問題( matrix-chain multiplication problem  )

  (1)問題描述

  給定n個矩陣的鏈<A 1 ,A 2 ,…,A n >,其中i=1,2,…,n,矩陣A i的維數為p i-1 ×p i 。求一個完全“括號化方案”,使得計算乘積A 1 A 2 …A n 所需的標量乘法次數最小
  (2)最優括號化方案的結構特征

  用記號 A i,j 表示 A i A i+1 …A j 通過加括號后得到的一個最優計算模式,且恰好在A k 與A k+1 之間分開。則“前綴”子鏈A i A i+1 …A k 必是一個最優的括號化子方案,記為A i,k ;同理“后綴”子鏈A k+1 A k+2 …A j 也必是一個最優的括號化子方案,記為A k+1,j。

  (3)一個遞歸求解的方案

  對於矩陣鏈乘法問題,我們將所有對於1≤i≤j≤n確定A i A i+1 …A j 的最小代價括號方案作為子問題。令m[i,j]表示計算矩陣A i,j 所需要的標量乘法的次數最小值,則最優解就是計算A i...n所需的最低代價就是m[1,n] 

  遞歸定義m[i,j]。

  ①對於i=j的情況下,顯然有m=0,不需要做任何標量乘法運算。所以,對於所有的i=1、2......n,m[i,i] = 0.

  ②當i < j的情況,就按照最優括號化方案的結構特征進行計算m[i,j]。假設最優括號化方案的分割點在矩陣Ak和Ak+1之間,那么m的值就是Ai...k和Ak+1...j的代價加上兩者量程的代價的最小值。即。該公式的假設是最優分割點是已知的,但是實際上不知道。然而,k只有j-i中情況取值。由於最優分割點k必定在i~j內取得,只需要檢查所有可能的情況,找到最優解即可。可以得出一個遞歸公式

  

  m只是給出了子問題最優解的代價,但是並未給出構造最優解的足夠信息(即分割點的位置信息)。所以,在此基礎之上,我們使用一個二維數組s[i,j]來保存 A i A i+1 …A 的分割點位置k。

  (4)我們采用自底向上表格方法來代替上述遞歸公式算法來計算最優代價。過程中假定矩陣A的規模為Pi-1Xpi,輸入是一個序列p=<p0,p1,......,pn>,長度為p.length = n+1.其中使用一個輔助表m來記錄代價m[i,j],另一個表s來記錄分割點的位置信息,以便於構造出最優解。

  

  簡單介紹一下算法:首先在3~4行對所有的i=1、2......n計算m[i,i]=0。然后在5~13行中的第一個for循環,使用(3)中的遞歸公式對所有的i=1~n-1計算m[i,i+1](長度為l=2的最小計算代價)的值。在第二個循環中,對所有的i=i~n-2計算m[i,i+2](長度為l=3的鏈的最小計算代價)的值。到最后,10~13行中計算代價m[i,j]的時候僅僅依賴於上面計算的表項m[i,k]和m[k+1,j]

  (5)給一個簡單的例子 

  ①給出一個n=6的矩陣如下圖所示

   

  ②由上述表我們按照下面這樣的計算方式來得到m[i,j]所對應的表,下圖所示的表格中代表的m[i,j]的最小值

  

  ③可以得到下面這樣一張表

  首先將矩陣化為一張一維數組表

  

  ④簡單結算其中的一些表項,給出一個m[1,3]的值的計算過程如下:

  

  可以得出上面的比較小的分割點為1,所以s[1,3] = 1。

  

  可以得出分割點的位置為s[2,5] = 3。

  上面給出了一個簡單的兩個點的計算。下圖是計算完成的矩陣m和s

  

   由上面表s可以得到,最優解為(A1(A2A3))((A4A5)A6)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM