1. 程式人生 > >動態規劃-矩陣連乘問題(一)

動態規劃-矩陣連乘問題(一)

動態規劃的理論性和實踐性都比較強,一方面需要理解狀態、狀態轉移、最優子結構、重疊子問題等概念,另一方面又需要根據題目的條件靈活設計演算法。

動態規劃是一種用途很廣的問題求解方法。它本身並不是一個特定的演算法,而是一種思想,一種手段。

動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解為若干個子問題

在分解時,得到的子問題往往不是互相獨立的,不同子問題的數目常常只有多項式量級。

在用分治法求解時,有些子問題被重複計算了許多次

如果能夠儲存已解決的子問題的答案,而在需要時再找出已求得的答案,就可以避免大量重複計算,從而得到多項式時間演算法

動態規劃基本步驟:

1、找出最優解的性質,並刻畫其結構特徵。

2、遞迴的定義最優值。

3、以自底向上的方式計算最優值。

4、根據計算最優值時得到的資訊,構造最優解。

動態規劃演算法產用於求解具有某種最優性質的問題。

可能會有許多可行解,希望找到具有最優解的那個解。

矩陣連乘問題

給定n個矩陣, 其中與是可乘的,考察這n個矩陣的連乘積           

計算矩陣的連乘可以有許多不同的計算次序。

輸入:矩陣的個數n。矩陣的行數與列數(去除重複)

輸出:最少的數乘次數、最優解的方案,即Ai與Aj矩陣相乘,在k位置中斷,輸出i,k,k+1,j。

計算矩陣的連乘可以有許多不同的計算次序。不同的計算次序對應一種矩陣連乘的完全加括號的方式。

若一個矩陣連乘積的計算次序完全確定,即連乘積已完全加括號,則可以依此次序反覆呼叫2個矩陣相乘的標準演算法計算矩陣連乘積

完全加括號的矩陣連乘遞迴定義:

(1)單個矩陣是完全加括號的;

(2)矩陣連乘積A是完全加括號的,則A可

       表示為2個完全加括號的矩陣連乘積B 和C  

       的乘積並加括號,即A=(BC)   

給定n個矩陣{A1,A2,…,An},其中Ai與Ai+1是可乘的,i=1,2…,n-1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。

窮舉法:列舉出所有可能的計算次序,並計算出每一種計算次序相應需要的數乘次數,從中找出一種數乘次數最少的計算次序。

用這種方法時間複雜度太高了,不採用。

怎麼用動態規劃的方法來解決這個問題呢?

將矩陣連乘積AiAi+1...Aj簡記為A[i:j],這裡i <= j

考察計算A[i:j]的最優計算次序。設這個計算次序在矩陣Ak和Ak+1之間將矩陣鏈斷開,i <=k <=j,則其相應完全加括號方式為

計算量:A[i:k]的計算量加上A[k+1:j]的計算量,再加上A[i:k]和A[k+1:j]相乘的計算量。

動態規劃演算法的第一步:刻畫問題的最優解結構特徵。

特徵:計算A[i:j]的最優次序所包含的計算矩陣子鏈A[i:k]和A[k+1:j]的次序也是最優的。

矩陣連乘計算次序問題的最優解包含著其子問題的最優解。這種性質稱為最優子結構性質。

問題的最優子結構性質是該問題可用動態規劃演算法求解的顯著特徵。

步驟二:建立遞迴關係。

設計算A[i:j],1<=i<=j<=n,所需要的最少數乘次數為m[i,j],則原問題的最優值為m[1,n]

當i=j時,A[i:j]=Aj,因此,m[i,i]=0,i=1,2,...n

當i<j時,假設在k處斷開最優,利用最優子結構性質得:

於是可以遞迴的定義m[i,j]為:

k的位置只有j-i種可能(最後一個在j-1處)。

注意:m[i,j]給出了最優值,同時確定了最優次序中的斷開位置k:

m[i,j] =m[i,k] + m[k+1,j]  + pi-1pkpj

若將對應於m[i,j]的斷開位置k記為s[i],在計算最優值m[i,j]後, 可由s[i,j]構造出相應的最優解。

步驟三:計算最優值。

i,j可以相等,有n種情況。

由此可見,在遞迴計算時,許多子問題被重複計算多次。這也是該問題可用動態規劃演算法求解的又一顯著特徵

用動態規劃演算法解此問題,可根據其遞迴式以自底向上的方式進行計算。

在計算過程中,儲存已解決的子問題答案,每個子問題只計算一次。

而在後面需要子問題的解時只要簡單的查一下,從而避免大量的重複計算,最終得到多項式時間的演算法。

程式碼實現下一篇再講。