第3章算法設(shè)計PPT.ppt_第1頁
第3章算法設(shè)計PPT.ppt_第2頁
第3章算法設(shè)計PPT.ppt_第3頁
第3章算法設(shè)計PPT.ppt_第4頁
第3章算法設(shè)計PPT.ppt_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1,第3章 動態(tài)規(guī)劃,2,學(xué)習(xí)要點: 理解動態(tài)規(guī)劃算法的概念。 掌握動態(tài)規(guī)劃算法的基本要素 (1)最優(yōu)子結(jié)構(gòu)性質(zhì) (2)重疊子問題性質(zhì) 掌握設(shè)計動態(tài)規(guī)劃算法的步驟。 (1)找出最優(yōu)解的性質(zhì),并刻劃其結(jié)構(gòu)特征。 (2)遞歸地定義最優(yōu)值。 (3)以自底向上的方式計算出最優(yōu)值。 (4)根據(jù)計算最優(yōu)值時得到的信息,構(gòu)造最優(yōu)解。,3,通過應(yīng)用范例學(xué)習(xí)動態(tài)規(guī)劃算法設(shè)計策略。 (1)矩陣連乘問題; (2)最長公共子序列; (3)最大子段和 (4)凸多邊形最優(yōu)三角剖分; (5)多邊形游戲; (6)圖像壓縮; (7)電路布線; (8)流水作業(yè)調(diào)度; (9)背包問題; (10)最優(yōu)二叉搜索樹。,4,動態(tài)規(guī)劃算法與

2、分治法類似,其基本思想也是將待求解問題分解成若干個子問題,算法總體思想,5,但是經(jīng)分解得到的子問題往往不是互相獨立的。不同子問題的數(shù)目常常只有多項式量級。在用分治法求解時,有些子問題被重復(fù)計算了許多次。,算法總體思想,6,如果能夠保存已解決的子問題的答案,而在需要時再找出已求得的答案,就可以避免大量重復(fù)計算,從而得到多項式時間算法。,算法總體思想,T(n),7,動態(tài)規(guī)劃基本步驟,找出最優(yōu)解的性質(zhì),并刻劃其結(jié)構(gòu)特征。 遞歸地定義最優(yōu)值。 以自底向上的方式計算出最優(yōu)值。 根據(jù)計算最優(yōu)值時得到的信息,構(gòu)造最優(yōu)解。,8,(1)單個矩陣是完全加括號的; (2)矩陣連乘積 是完全加括號的,則 可 表示為2

3、個完全加括號的矩陣連乘積 和 的乘積并加括號,即,16000, 10500, 36000, 87500, 34500,完全加括號的矩陣連乘積可遞歸地定義為: 設(shè)有四個矩陣 ,它們的維數(shù)分別是: 總共有五中完全加括號的方式,完全加括號的矩陣連乘積,9,矩陣連乘問題,給定n個矩陣 , 其中 與 是可乘的, 。考察這n個矩陣的連乘積 由于矩陣乘法滿足結(jié)合律,所以計算矩陣的連乘可以有許多不同的計算次序。這種計算次序可以用加括號的方式來確定。 若一個矩陣連乘積的計算次序完全確定,也就是說該連乘積已完全加括號,則可以依此次序反復(fù)調(diào)用2個矩陣相乘的標(biāo)準(zhǔn)算法計算出矩陣連乘積,10,矩陣連乘問題,給定n個矩陣A

4、1,A2,An,其中Ai與Ai+1是可乘的,i=1,2,n-1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數(shù)乘次數(shù)最少。,窮舉法:列舉出所有可能的計算次序,并計算出每一種計算次序相應(yīng)需要的數(shù)乘次數(shù),從中找出一種數(shù)乘次數(shù)最少的計算次序。,算法復(fù)雜度分析: 對于n個矩陣的連乘積,設(shè)其不同的計算次序為P(n)。 由于每種加括號方式都可以分解為兩個子矩陣的加括號問題:(A1.Ak)(Ak+1An)可以得到關(guān)于P(n)的遞推式如下:,11,矩陣連乘問題,窮舉法 動態(tài)規(guī)劃,將矩陣連乘積 簡記為Ai:j ,這里ij,考察計算Ai:j的最優(yōu)計算次序。設(shè)這個計算次序在矩陣 Ak和Ak+1

5、之間將矩陣鏈斷開,ikj,則其相應(yīng)完全 加括號方式為,計算量:Ai:k的計算量加上Ak+1:j的計算量,再加上 Ai:k和Ak+1:j相乘的計算量,12,特征:計算Ai:j的最優(yōu)次序所包含的計算矩陣子鏈 Ai:k和Ak+1:j的次序也是最優(yōu)的。 矩陣連乘計算次序問題的最優(yōu)解包含著其子問題的最優(yōu)解。這種性質(zhì)稱為最優(yōu)子結(jié)構(gòu)性質(zhì)。問題的最優(yōu)子結(jié)構(gòu)性質(zhì)是該問題可用動態(tài)規(guī)劃算法求解的顯著特征。,分析最優(yōu)解的結(jié)構(gòu),13,建立遞歸關(guān)系,設(shè)計算Ai:j,1ijn,所需要的最少數(shù)乘次數(shù)mi,j,則原問題的最優(yōu)值為m1,n 當(dāng)i=j時,Ai:j=Ai,因此,mi,i=0,i=1,2,n 當(dāng)ij時, 可以遞歸地定義

6、mi,j為:,這里 的維數(shù)為,的位置只有 種可能,14,計算最優(yōu)值,對于1ijn不同的有序?qū)?i,j)對應(yīng)于不同的子問題。因此,不同子問題的個數(shù)最多只有 由此可見,在遞歸計算時,許多子問題被重復(fù)計算多次。這也是該問題可用動態(tài)規(guī)劃算法求解的又一顯著特征。 用動態(tài)規(guī)劃算法解此問題,可依據(jù)其遞歸式以自底向上的方式進行計算。在計算過程中,保存已解決的子問題答案。每個子問題只計算一次,而在后面需要時只要簡單查一下,從而避免大量的重復(fù)計算,最終得到多項式時間的算法,15,用動態(tài)規(guī)劃法求最優(yōu)解,void MatrixChain(int *p,int n,int *m,int *s) for (int i =

7、 1; i = n; i+) mii = 0; for (int r = 2; r = n; r+) for (int i = 1; i = n - r+1; i+) int j=i+r-1; mij = mi+1j+ pi-1*pi*pj; sij = i; for (int k = i+1; k j; k+) int t = mik + mk+1j + pi-1*pk*pj; if (t mij) mij = t; sij = k; ,算法復(fù)雜度分析: 算法matrixChain的主要計算量取決于算法中對r,i和k的3重循環(huán)。循環(huán)體內(nèi)的計算量為O(1),而3重循環(huán)的總次數(shù)為O(n3)。因此

8、算法的計算時間上界為O(n3)。算法所占用的空間顯然為O(n2)。,16,動態(tài)規(guī)劃算法的基本要素,一、最優(yōu)子結(jié)構(gòu),矩陣連乘計算次序問題的最優(yōu)解包含著其子問題的最優(yōu)解。這種性質(zhì)稱為最優(yōu)子結(jié)構(gòu)性質(zhì)。 在分析問題的最優(yōu)子結(jié)構(gòu)性質(zhì)時,所用的方法具有普遍性:首先假設(shè)由問題的最優(yōu)解導(dǎo)出的子問題的解不是最優(yōu)的,然后再設(shè)法說明在這個假設(shè)下可構(gòu)造出比原問題最優(yōu)解更好的解,從而導(dǎo)致矛盾。 利用問題的最優(yōu)子結(jié)構(gòu)性質(zhì),以自底向上的方式遞歸地從子問題的最優(yōu)解逐步構(gòu)造出整個問題的最優(yōu)解。最優(yōu)子結(jié)構(gòu)是問題能用動態(tài)規(guī)劃算法求解的前提。,同一個問題可以有多種方式刻劃它的最優(yōu)子結(jié)構(gòu),有些表示方法的求解速度更快(空間占用小,問題的

9、維度低),17,動態(tài)規(guī)劃算法的基本要素,二、重疊子問題,遞歸算法求解問題時,每次產(chǎn)生的子問題并不總是新問題,有些子問題被反復(fù)計算多次。這種性質(zhì)稱為子問題的重疊性質(zhì)。 動態(tài)規(guī)劃算法,對每一個子問題只解一次,而后將其解保存在一個表格中,當(dāng)再次需要解此子問題時,只是簡單地用常數(shù)時間查看一下結(jié)果。 通常不同的子問題個數(shù)隨問題的大小呈多項式增長。因此用動態(tài)規(guī)劃算法只需要多項式時間,從而獲得較高的解題效率。,18,動態(tài)規(guī)劃算法的基本要素,三、備忘錄方法,備忘錄方法的控制結(jié)構(gòu)與直接遞歸方法的控制結(jié)構(gòu)相同,區(qū)別在于備忘錄方法為每個解過的子問題建立了備忘錄以備需要時查看,避免了相同子問題的重復(fù)求解。,int L

10、ookupChain(int i,int j) if (mij 0) return mij; if (i = j) return 0; int u = LookupChain(i,i) + LookupChain(i+1,j) + pi-1*pi*pj; sij = i; for (int k = i+1; k j; k+) int t = LookupChain(i,k) + LookupChain(k+1,j) + pi-1*pk*pj; if (t u) u = t; sij = k; mij = u; return u; ,19,關(guān)于動態(tài)規(guī)劃算法和備忘錄方法的適用條件,綜上所述,矩陣連

11、乘積的最優(yōu)計算次序問題可用自頂向下的備忘錄方法或自底向上的動態(tài)規(guī)劃算法在O(n3)計算時間內(nèi)求解。 這兩個算法都利用了子問題重疊性質(zhì)??偣灿?n2)個不同的子問題,對每個子問題兩種算法都只解一次并記錄答案。當(dāng)再次遇到該子問題時,簡單地取用已得到的答案,節(jié)省了計算量,提高了算法的效率。 適用條件:一般來說,當(dāng)一個問題的所有子問題都至少要解一次時,用動態(tài)規(guī)劃算法比用備忘錄方法好。此時,動態(tài)規(guī)劃算法沒有任何多余的計算,還可以利用其規(guī)則的表格存取方式來減少在動態(tài)規(guī)劃算法中的計算時間和空間需求。當(dāng)子問題空間中部分子問題可以不必求解時,易用備忘錄方法則較為有利,因為從其控制結(jié)構(gòu)可以看出,該方法只解那些確實

12、需要求解的子問題。,20,最長公共子序列,若給定序列X=x1,x2,xm,則另一序列Z=z1,z2,zk,是X的子序列是指存在一個嚴(yán)格遞增下標(biāo)序列i1,i2,ik使得對于所有j=1,2,k有:zj=xij。例如,序列Z=B,C,D,B是序列X=A,B,C,B,D,A,B的子序列,相應(yīng)的遞增下標(biāo)序列為2,3,5,7。 給定2個序列X和Y,當(dāng)另一序列Z既是X的子序列又是Y的子序列時,稱Z是序列X和Y的公共子序列。 給定2個序列X=x1,x2,xm和Y=y1,y2,yn,找出X和Y的最長公共子序列。,21,22,最長公共子序列的結(jié)構(gòu),設(shè)序列X=x1,x2,xm和Y=y1,y2,yn的最長公共子序列為

13、Z=z1,z2,zk ,則 (1)若xm=yn,則zk=xm=yn,且zk-1是xm-1和yn-1的最長公共子序列。 (2)若xmyn且zkxm,則Z是xm-1和Y的最長公共子序列。 (3)若xmyn且zkyn,則Z是X和yn-1的最長公共子序列。,由此可見,2個序列的最長公共子序列包含了這2個序列的前綴的最長公共子序列。因此,最長公共子序列問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)。,23,子問題的遞歸結(jié)構(gòu),由最長公共子序列問題的最優(yōu)子結(jié)構(gòu)性質(zhì)建立子問題最優(yōu)值的遞歸關(guān)系。用cij記錄序列和的最長公共子序列的長度。其中, Xi=x1,x2,xi;Yj=y1,y2,yj。當(dāng)i=0或j=0時,空序列是Xi和Yj的最長

14、公共子序列。故此時Cij=0。其它情況下,由最優(yōu)子結(jié)構(gòu)性質(zhì)可建立遞歸關(guān)系如下:,24,計算最優(yōu)值,由于在所考慮的子問題空間中,總共有(mn)個不同的子問題,因此,用動態(tài)規(guī)劃算法自底向上地計算最優(yōu)值能提高算法的效率。,void LCSLength(int m,int n,char *x,char *y,int *c,int *b) int i,j; for (i = 1; i =cij-1) cij=ci-1j; bij=2; else cij=cij-1; bij=3; ,構(gòu)造最長公共子序列 void LCS(int i,int j,char *x,int *b) if (i =0 | j=0

15、) return; if (bij= 1) LCS(i-1,j-1,x,b); coutxi; else if (bij= 2) LCS(i-1,j,x,b); else LCS(i,j-1,x,b); ,25,算法的改進,在算法lcsLength和lcs中,可進一步將數(shù)組b省去。事實上,數(shù)組元素cij的值僅由ci-1j-1,ci-1j和cij-1這3個數(shù)組元素的值所確定。對于給定的數(shù)組元素cij,可以不借助于數(shù)組b而僅借助于c本身在時間內(nèi)確定cij的值是由ci-1j-1,ci-1j和cij-1中哪一個值所確定的。 如果只需要計算最長公共子序列的長度,則算法的空間需求可大大減少。事實上,在計算

16、cij時,只用到數(shù)組c的第i行和第i-1行。因此,用2行的數(shù)組空間就可以計算出最長公共子序列的長度。進一步的分析還可將空間需求減至O(min(m,n)。,26,3.4 最大子段和,問題描述: 給定由n個整數(shù)(包含負整數(shù))組成的序列a1,a2,.,an,求該序列子段和的最大值。當(dāng)所有整數(shù)均為負值時定義其最大子段和為0。 依此定義,所求的最優(yōu)值為: 例如,當(dāng)(a1,a2, a3, a4, a5,a6)=(-2,11,-4,13,-5,-2)時,最大子段和為:,27,1. 一個簡單算法,一個簡單算法: int MaxSum(int n, a, 算法有3重循環(huán),復(fù)雜性為O(n3)。,由于有: 算法可作

17、如下改進: int MaxSum(int n, a, 改進后的算法復(fù)雜性為O(n2) 。,28,2. 分治方法求解,從問題的解的結(jié)構(gòu)可以看出,它適合于用分治策略求解: 如果將所給的序列a1:n分為長度相等的兩段a1:n/2和an/2+1:n,分別求出這兩段的最大子段和,則a1:n的最大子段和有三種情形: a1:n的最大子段和與a1:n/2的最大子段和相同; a1:n的最大子段和與an/2+1:n的最大子段和相同; a1:n的最大子段和為下面的形式。 A、B這兩種情形可遞歸求得。對于情形C,容易看出,an/2與an/2+1在最優(yōu)子序列中。因此,我們可以在a1:n/2和an/2+1:n中分別計算出

18、如下的s1和s2。則s1+s2即為出現(xiàn)情形C使得最優(yōu)值。 從而設(shè)計出下面所示的分治算法。,int MaxSubSum(int a, int left, int right) int sum=0; if (left=right)sum=aleft0?aleft:0; elseint center=(left+right)/2; int leftsum=MaxSubSum(a,left,center); int rightsum=MaxSubSum(a,center+1,right); int s1=0;lefts=0; for (int i=center;i=left;i-) lefts+=ai

19、; if (leftss1) s1=lefts; int s2=0;rights=0; for (int i=center+1;is2) s2=rights; sum=s1+s2; if (sumleftsum) sum=leftsum; if (sumsightsum) sum=rightsum; return sum; ,29,3. 動態(tài)規(guī)劃方法求解,在對上述分治算法的分析中我們注意到, 由bj的定義易知,當(dāng)bj-10時bj=bj-1+aj,否則bj=aj。由此可得計算bj的動態(tài)規(guī)劃遞歸式bj=maxbj-1+aj,aj,1jn。 據(jù)此,可設(shè)計出求最大子段和的動態(tài)規(guī)劃算法如下: int M

20、axSum(int n, int a) int sum=0; b=0; for (i=1;i0) b+=ai; else b=ai; if (bsum) sum=b; return sum; 顯然該算法的計算時間為O(n)。,30,4. 算法的推廣,最大矩陣和問題,略 最大m子段和問題,略,31,0-1背包問題,給定n種物品U=u1,u2,un和一背包。物品i的重量是wi,其價值為vi,背包的容量為C。問應(yīng)如何選擇裝入背包的物品,使得裝入背包中物品的總價值最大? 0-1背包問題是一個特殊的整數(shù)規(guī)劃問題。,32,mi,j是下面兩個量的最大值,mi-1,j:僅用最優(yōu)方法取自u1,u2,ui-1的物品去裝入體積為j的背包所得到的價值最大值,mi-1,j-wi:用最優(yōu)方法取自u1,u2,ui-1的物品去裝入體積為j-wi的背包所得到的價值最大值加上vi,33,Knapsack(int v,int w,int c,int n,int m) for (i=0;in;i+) mi0=0; for (j=0;jc;j+) m0j=0; for (i=1;in;i+) for(j=1;jc;j+) mij=mi-1j if (wi=j

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論