演算法設計與分析第六章動態規劃演算法

2021-03-04 09:29:51 字數 3737 閱讀 1323

第六章動態規劃演算法

§1.動態規劃演算法的基本思想

動態規劃方法是處理分段過程最優化問題的一類及其有效的方法。在實際生活中,有一類問題的活動過程可以分成若干個階段,而且在任一階段後的行為依賴於該階段的狀態,與該階段之前的過程是如何達到這種狀態的方式無關。這類問題的解決是多階段的決策過程。

在50年代,貝爾曼(richard bellman)等人提出了解決這類問題的「最優化原則」,從而建立了最優化問題的一種新的演算法動態規劃演算法。

最優化原則指出,多階段過程的最優決策序列應當具有性質:

無論過程的初始狀態和初始決策是什麼,其餘的決策都必須相對於初始決策所產生的狀態構成乙個最優決策序列。

這要求原問題的最優解包含了其子問題的乙個最優解(稱為最優子結構性質)。

動態規劃演算法採用最優原則來建立遞迴關係式(關於求最優值的),在求解問題時有必要驗證該遞迴關係式是否保持最優原則。若不保持,則不可用動態規劃演算法。在得到最優值的遞迴式之後,需要執行回溯以構造最優解。

在使用動態規劃演算法自頂向下(top-down)求解時,每次產生的子問題並不總是新問題,有些子問題反覆計算多次。動態規劃演算法正是利用了這種子問題的重疊性質,對每乙個問題只計算一次,而後將其解儲存在乙個**中,當再次要解此子問題時,只是簡單地呼叫(用常數時間)一下已有的結果。通常,不同的子問題個數隨著輸入問題的規模呈多項式增長,因此,動態規劃演算法通常只需要多項式時間,從而獲得較高的解題效率。

最優子結構性質和子問題重疊性質是採用動態規劃演算法的兩個基本要素。

例1.多段圖問題

設g=(v,e)是乙個賦權有向圖,其頂點集v被劃分成k>2個不相交的子集vi: 1ik,其中,v1和vk分別只有乙個頂點s(稱為源)和乙個頂點t(稱為匯),下圖中所有的邊(u,v)的始點和終點都在相鄰的兩個子集vi和vi+1中:uvi,vvi+1。

圖6-1-1 乙個5段圖

多階段圖問題:求由s到t的最小成本路徑(也叫最短路徑)。

對於每一條由s到t的路徑,可以把它看成在k-2個階段作出的某個決策序列的相應結果:第i步決策就是確定vi+1中哪個頂點在這條路徑上。今假設s, v2, v3, … , vk-1, t是一條由s到t的最短路徑,再假定從源點s(初始狀態)開始,已經作出了到頂點v2的決策(初始決策),則v2就是初始決策產生的狀態。

若將v2看成是原問題的子問題的初始狀態,這個子問題就是找一條由v2到t的最短路徑。事實上,路徑v2, v3, … , vk-1, t一定是v2到t的一條最短路徑。不然,設v2, q3, … , qk-1, t是一條由v2到t的比v2, v3, … , vk-1, t更短的路徑,則s, v2, q3, … , qk-1, t是一條由s到t的比s, v2, v3, … , vk-1, t更短的路徑。

與前面的假設矛盾。這說明多段圖問題具有最優子結構性質。

例2. 0/1揹包問題

有n件物品,第i件重量和價值分別是wi和pi, i=1, 2, …, n。要將這n件物品的一部分裝入容量為c的揹包中,要求每件物品或整個裝入或不裝入,不許分割出一部分裝入。0/1揹包問題就是要給出裝包方法,使得裝入揹包的物品的總價值最大。

這個問題歸結為數學規劃問題:

s.t6.1.1)

0/1揹包問題具有最優子結構性質。事實上,若是最優解,

則將是0/1揹包問題的子問題:

s.t6.1.2)最優解。因為,若是子問題(6.1.2)的最優解,且使得

6.1.3)則將是原問題(6.1.1)的可行解,並且使得

6.1.4)

這與是最優解相悖。

例3. 矩陣連乘問題

給定n個數字矩陣a1,a2,…,an,其中ai與ai+1是可乘的,i=1,2,…,n-1.求矩陣連乘a1a2an的加括號方法,使得所用的數乘次數最少。

考察兩個矩陣相成的情形:c=ab。如果矩陣a,b分別是p×r和r×q矩陣,則它們的乘積c將是p×q矩陣,其(i, j)元素為

6.1.5)

i=1,…,p, j=1,…,q, 因而ab所用的數乘次數是prq。如果有至少3個以上的矩陣連乘,則涉及到乘積次序問題,即加括號方法。例如3個矩陣連乘的加括號方法有兩種:

((a1a2)a3)和(a1(a2a3))。設a1,a2,a3分別是p0×p1,p1×p2,p2×p3矩陣,則以上兩種乘法次序所用的數乘次數分別為:p0p1p2+p0p2p3和p0p1p3+p1p2p3。

如果p0=10, p1=100, p2=5, p3=50, 則兩種乘法所用的數乘次數分別為:7500和750000。可見,由於加括號的方法不同,使得連乘所用的數乘次數有很大差別。

對於n個矩陣的連乘積,令p(n)記連乘積的完全加括號數,則有如下遞迴關係

6.1.6)

由此不難算出p=c(n-1),其中c表示catalan數:

6.1.7)

也就是說,p(n)是隨n指數增長的,所以,我們不能希望列舉所有可能次序的連乘積,從中找到具有最少數乘次數的連乘積演算法。事實上,矩陣連乘積問題具有最優子結構性質,我們可以採用動態規劃的方法,在多項式時間內找到最優的連乘積次序。

用a[i:j]表示連乘積aiai+1aj。分析計算a[1:

n]的乙個最優次序。設這個計算次序在矩陣ak和ak+1之間將矩陣鏈分開,1k如上三個例子都具有最優子結構性質,這個性質決定了解決此類問題的基本思路是:

首先確定原問題的最優值和其子問題的最優值之間的遞推關係(自上向下),然後自底向上遞迴地構造出最優解(自下向上)。

最優子結構性質是最優化原理得以採用的先決條件。一般說來,分階段選擇策略確定最優解的問題往往會形成乙個決策序列。bellman認為,利用最優化原理以及所獲得的遞推關係式去求解最優決策序列,可以使列舉數量急劇下降。

這裡有乙個問題值得注意:最優子結構性質提示我們使用最優化原則產生的演算法是遞迴演算法,簡單地使用遞迴演算法可能會增加時間與空間開銷。例如,用遞迴式直接計算矩陣連乘積a[1:

n]的演算法recurmatrixchain的時間複雜度將是:

程式6-1-1 計算矩陣連乘的遞迴演算法

int recurmatrixchain(int i, int j)

}return u;

}如果用t(n)表示該演算法的計算a[1:n]的時間,則有如下遞迴關係式:

當時 ,

可用數學歸納法直接證明:,這顯然不是我們所期望的。

注意到,在用遞迴演算法自上向下求解具有最優子結構的問題時,每次產生的子問題並不總是新問題,有些問題被反覆計算多次。如果對每乙個問題只解一次,而後將其解儲存在乙個**中,當再次需要解此問題時,只是簡單地用常數時間檢視一下結果,則可以節省大量的時間。在矩陣的連乘積問題中,若用m[i][j]表示由第i個矩陣到第j個矩陣的連乘積所用的最少數乘次數,則計算m[1][n]時共有個子問題。

這是因為,對於,不同的有序對(i, j)對應於不同的子問題,不同子問題最多只有個。下面將會看到,用動態規劃解此問題時,可在多項式時間內完成。

程式6-1-2 求矩陣連乘最優次序的動態規劃演算法

void matrixchain(int p, int n, int * *m, int * *s)

}} }

演算法matrixchain的主要計算量取決於程式中對r, i和k的三重迴圈,迴圈體內的計算量為o(1),三重迴圈的總次數是o(n3),所以,演算法的計算時間上界為o(n3)。

例子求以下6個矩陣連乘積最少數乘計算次數及所採用乘法次序。

一般的計算以及的過程如下圖所示:

注意,上述演算法只是明確給出了矩陣最優連乘次序所用的數乘次數m[1][n],並未明確給出最優連乘次序,即完全加括號方法。但是以s[i][j]為元素的2維陣列卻給出了足夠的資訊。事實上,s[i][j]=k說明,計算連乘積a[i:

j]的最佳方式應該在矩陣ak和ak+1之間斷開,即最優加括號方式為(a[i:k])(a[k+1:j])。

[i:j]的最優次序。

第六章交通規劃

1.交通規劃的含義是什麼?分為哪幾類?2.交通規劃調查中的術語含義各是什麼?如od調查 起點 終點 出行 境界線 核查線。3.交通需求 包含那四個階段?4.交通發生 的含義是什麼?5.交通流分配 的主要方法有哪些?6.容量限制分配法的主要步驟是什麼?7.有1 2 3 4四個分割槽,它們的將來交通生成...

第六章商品規劃

第一節商品經營範圍的確定 一 商品分類 一 商品分類標準186 187 1 按顧客群劃分 2 按商品特點劃分 3 按顧客對商品選擇程度劃分 方便商品 選購商品 特殊商品 二 商品層級劃分 2 國內一般層級劃分189 二 商品政策 1 單一商品政策 指商店經營為數不多 變化不大的商品品種來滿大眾的普遍...

6第六章工作分析

第六章工作分析 答案解析 一 單項選擇題 1.是通過系統分析的方法來確定工作的職責,以及所需的知識和技能的過程。a.工作描述 b.工作規範 c.工作設計 d.工作分析 2.建立薪酬體系要以 為基礎。a.績效管理 b.工作評價 c.人力資源規劃 d.人力資源培訓與開發 3.下列不屬於工作分析在人力資源...