27、min rmin 28 then fmin rmin; 29 else fmin lmin; 30 ,,,遞歸調用,,利用層次分析法分析此遞歸調用過程。(要求掌握),考慮如下例子: A:(1) (2) (3) (4) (5) (6) (7) (8) (9) 22 13 -5 -8 15 60 17 31 47,,,?,討論:以上算法是否是最優(yōu)的? 1)遞歸帶來的額外的空間開銷。 2)當元素A(i)和A(j)的比較時間i和j的比較時間相差不大時,過程maxmin并不可取。,因此:當n是的冪時,3n/2-2是最好,平均及最壞情況的比較數(shù),和直接算法的比較數(shù)n相比,它少了。 可以證明,任何
28、一種以元素比較為基礎的找最大和最小元素的算法,其元素比較下界均為 次。,為說明問題,假設元素比較與i和j間的比較時間相同,又設maxmin的頻率計數(shù)為C(n) ,n=2k,,k是某個正整數(shù),并且對前兩種情況,用ij-1來代替i==j和i==j-1這兩次比較,這樣,只用對i和j-1作一次比較就足以實現(xiàn)被修改過的語句。于是maxmin頻率計數(shù) C(n)= n=2 n2,,?,解此關系式可得 C(n)=2C(n/2)+3=4C(n/4)+6+3 =2k-1C(2)+ =2k+3*2k-1-3 =5n/2-3,,分析:STRA
29、ITMAXMIN的比較數(shù)是3(n-1)(包括實現(xiàn)for循環(huán)所要的比較)。盡管它比5n/2-3大些,但由于遞歸算法中i,j,fmax,fmin進出棧所帶來的開銷,因此maxmin在這種情況下反而比STRAITMAXMIN還要慢些。,根據(jù)以上分析可以得出結論:如果A的元素間的比較遠比整數(shù)變量的比較代價昂貴,則分治方法產生效率較高(實際上是最優(yōu))的算法;反之,就得到一個效率較低的程序。因此,分治策略只能看成是一個較好的然而并不總是能成功的算法設計指導。,2.4斯特拉森矩陣乘法,一、一般的矩陣乘法 設C=A*B, 則利用常規(guī)方法計算,所需時間是,二、分治法求矩陣乘法 設n=2k,則可以將兩個矩陣的乘法
30、做如下劃分:,其中:C11=A11B11+A12B21 C12=A11B12+A12B21 C21=A21B11+A22B21 C22=A21B12+A22B22 可以證明: C=AB=,三.斯特拉森矩陣乘法 斯特拉森矩陣乘法的設計思想:增加加法的次數(shù),減少乘法的次數(shù).,如果分塊矩陣的級大于2,則可以繼續(xù)將這些子矩陣分成更小的方陣,直至每個方陣只含有一個元素,以至可以直接計算其乘積. 時間復雜性分析: n 2 n2 則T(n)=O(n3),,先用七個乘法和十個加(減)法來算出以下的P--V P=(A11+A22)(B
31、11+B22) ,Q=(A21+A22)B11 R=A11(B12-B22), S=A22(B21-B11) T=(A11+A12)B22 ,U=(A21-A11)(B11+B12) V=(A12-A22)(B21+B22) 然后用8個加減法算出這些 Cij C11=P+S-T+V C12=R+T C21=Q+S C22=P+R-Q+U,以上共用了7次乘法,18次加減法. n 2 n2 其中a和b是常數(shù)。 解:T(n)=7T(n/2)+an2=72T(n2/4)+(7/4)an2+an2 =73T(n3/8)+(7/
32、4)2an2+(7/4)an2+an2 =an2(1+(7/4)+(7/4)2+.+(7/4)k-1)+7kT(1)cn2(7/4)logn+7logn(1),因為:7logn =nlog7 cn2(7/4)logn=cnlog4*nlog7-log4=cnlog4+log7-log4=cnlog7 因此上式(1)=cnlog7+7logn=cnlog7+nlog7 =(c+1)nlog7=O(nlog7)O(n2.81).,注意: (1)當n小于120時,斯特拉森矩陣乘法與普通的乘法沒有太大的區(qū)別 。 (2)斯特拉森矩陣乘法的核心就是降低乘法的次數(shù)而增加加法的次數(shù),那么是否可以使乘法由
33、7次降低為6次呢?已經證明7次是必須的,這一方面改進只能從更高維數(shù)如3*3,或4*4并用遞歸分治的合并方法來實現(xiàn),現(xiàn)在可以達到o(n2.495364).,一、基本方法 1例子: 背包問題:已知有n種物品和一個容量大小為M的背包,每種物品i的容量為wi。假定將物品i的一部分xi放入背包就會得到pixi的效益,這里,0 xi1,pi0。采用怎樣的裝包方法才會使裝入背包物品的總效益最大呢?顯然,由于背包容量是M,因此,要求所有選中要裝入背包的物品總容量不得超過M。如果這n件物品的總容量不超過M,則把所有物品裝入背包自然獲得最大效益。 如果這些物品容量的和大于M,則在這種情況下該如何裝包呢?,,第三章
34、貪心方法 31方法概述,例:考慮下列情況下的背包問題:n=3,M20, (25,24,15), =(18,15,10)。其中的四個可行解是: (1/2,1/3,1/4) 16.5 24.25 (1,2/15,0) 20 28.2 (0,23,1) 20 31 (0,1,12) 20 31.5 在這些可行解中,如何得到最優(yōu)解,正是貪心方法要解決的問題。,2、 適用條件: (1)有n個輸入; (2)它的解就由這n個輸入的某個子集組成; (3)這個子集必須滿足一定的約束條件---可行解; (4)可行解一般不止一個,但是要求的是最優(yōu)解即使目標函數(shù)取
35、得極值的解。,3有關概念 (1) 約束條件:把子集必須滿足的基本條件稱為約束條件。 (2) 可行解:把滿足約束條件的子集稱為該問題的可行解。 (3) 目標函數(shù):(可行解一般來說是不唯一的)為了衡量可行解的優(yōu)劣,事先也給出了一定的標準,這些標準一般以用函數(shù)形式給出,這些函數(shù)稱為目標函數(shù)。 (4) 最優(yōu)解:那些使目標函數(shù)取極值(極大或極?。┑目尚薪?,稱為最優(yōu)解。,,,,二、貪心方法的算法設計模式 GREEDY(A,n) //An 包含n個輸入// 1 solution //將解向量solution初始化為空// 2 for i1 to n do 3 xSELECT(A)//按最優(yōu)量度標準在A中選擇
36、一個輸入 4 if FEASIBLE(solution,x) then solutionUNION(solution,x) return(solution),三、設計要點: 選擇能產生問題最優(yōu)解的最優(yōu)量度標準是使用貪心法設計求解的核心問題。,3.2 背包問題 一、問題的描述 背包問題:已知有n種物品和一個容量為M的背包,每種物品i的容量為wi,效益為pi ,假定將物品i的一部分xi放入背包就會得到pixi的效益,這里,0<=xi<=1,pi0。采用怎樣的裝包方法才會使裝入背包物品的總效益最大呢?顯然,由于背包容量是M,因此,要求所有選中要裝入背包的物品總容量不得超過M。如果這n件物品
37、的總容量不超過M,則把所有物品裝入背包自然獲得最大效益。如果這些物品容量的和大于M,則在這種情況下該如何裝包呢?,由以上敘述,可將這個問題形式描述如下: 約束條件: 目標函數(shù): 其中:0 xi 1 ,pi0 ,wi0, 0 in M背包的容量 n物品種類 wi第i物品的容量 pi第i種物品價值 顯然,滿足約束條件的任一集合 是 一個可行解,使目標函數(shù)取最大值的可行解是最優(yōu)解。,,例31考慮下列情況下的背包問題:n=3,M20,(pl,p2,p3)(25,24,15),(w1,w2,w3)=(18,15,10)。其中的四個可行解是: (x1,x2,x3) (
38、12,13,14) 16.5 24.25 (1,2/15,0) 20 28.2 (0,23,1) 20 31 (0,1,12) 20 31.5 在這四個可行解中,第個解的效益值最大。下面將可看到,這個解是背包問題在這一情況下的最優(yōu)解。,,二、問題的分析 為了獲取背包問題的最優(yōu)解,必須要把物品放滿背包。由于可以只放物品i的一部分到背包中,因此這一要求是可以達到的。如果用貪心策略來求解背包問題則正如31節(jié)中所說的一樣,首先要選出最優(yōu)的量度標準。 以下不妨分三種情況進行分析: (1) 取效益值作為量度標準。 即每裝入一件物品就使背包獲得最大可能的效益值增量。在這
39、種量度標準下的貪心方法就是按效益值的非增次序將物品一件件放到背包中去。如果正在考慮中的物品放不進去,則可只取其一部分來裝滿背包。,量度標準選取,,此種選擇策略得到的解,總效益值是28.2。它是一個次優(yōu)解。由此例可知,按物品效益值的非增次序裝包不能得到最優(yōu)解。 為什么上述貪心策略不能獲得最優(yōu)解呢?原因在于,背包可用容量消耗過快。由此,很自然地啟發(fā)我們用容量作為量度,讓背包容量盡可能慢地被消耗。,,(2)用容量作為量度標準 在這種量度標準下的貪心方法就是按物品容量的非降次序來把物品放入背包。例3.1的解就是使用這種貪心策略得到的,它仍是一個次優(yōu)解。這種策略也只能得到次優(yōu)解,其原因在于容量雖然慢
40、慢地被消耗,但效益值沒能迅速地增加。 以上策略也只能得到次優(yōu)解,其原因在于容量雖然慢慢地被消耗,但效益值沒能迅速地增加。這又啟發(fā)我們應采用在效益值的增長速率和容量的消耗速率之間取得平衡的量度標準。即每裝入一件物品應使它占用的每一單位容量獲得當前最大的效益。,,三、算法設計 算法3.3 背包問題的貪心算法,(3) 用效益和容量的比值作為量度標準。(即 ) 這就需使物品的裝入次序按 比值的非增次序來考慮,在這種策略下的量度是已裝入物品的累計效益值與所用容量之比。其量度標準是每次裝入要使累計效益值與所用容量的比值有最多的增加或最少的減小(第二次和以后的裝入可能使此比值減?。?。將此貪心策略應
41、用于例3.l的數(shù)據(jù),得到解。,,Knapsack(ElemtypeW pn, ElemtypeP wn, float yn, ElemtypeW C, int n) //pn和wn分別含有按piwi,pi1wi+1排序的n件物品的效益值和容量。M是背包的容量大小,而yn是解向量// 1 for i1 to n 2 do yi0;//將解向量初始化為0; 3 cu C;//cu是背包中剩余的空間; 4 for i1 to n 5 do//依次考察下一個物品是否可以放入背包; 6 if wi cu break;//物品i無法全部放入背包, 退出for循環(huán); 7 then yi1; 8
42、 cu cu - wi; 9 10 if in 11 then yi cu/wi; //不能完全裝入的物品的部分裝入量,量度標準,,,值得指出的是:(a)如果把物品事先按效益值的非增次序或容量的非降次序分好類,再使用以上算法就可分別得到量度標準為(2)或(3)(使每次效益增量最大或使容量消耗最慢)的解。 (b)該算法的解的形式為(1,.1,x,0,0),其中x在0,1。由背包問題量度選取的研究可知,選取最優(yōu)的量度標準實為用貪心方法求解問題的核心。,,小結:貪心方法設計步驟: 找出問題的約束條件和目標函數(shù)。 選取合適的量度標準。 按照“貪心方法的算法設計模式”的步驟進行算法設計.,四、算法分
43、析 如果將物體事先按Pi/wi的非增次序分好類,則過程Knapsack就得出這一策略下背包問題的解。如果將物品分類的時間不算在內,則此算法所用時間為O(n)。,五、算法的證明 證明的基本思想是:把這貪心解與任一最優(yōu)解相比較,如果這兩個解不同,就去找開始不同的第一個xi,然后設法用貪心解的這個xi去代換最優(yōu)解的那個xi,并證明最優(yōu)解在分量代換前后的總效益無任何變化。反復進行這種代換,直到新產生的最優(yōu)解與貪心解完全一樣,從而證明了貪心解是最優(yōu)解。,,,掌握,定理31 如果p1/wl p2/w2 pn/wn。則算法GREEDYKNAPSACK對于給定的背包問題實例生成一個最優(yōu)解。 證明:設X=(
44、x1,,xn)是GREEDYKNAPSACK所生成的解。如果所有的xi等于1,顯然這個解就是最優(yōu)解。于是,設j是使xj 1的最小下標。由算法可知,對于1i
45、yk1,,yn)中減去同樣多的量,使得所用的總容量仍是M。,這導致一個新的解Z=(z1,z2,,zn),其中zi=xi,1ik,且 ,因此,對于Z有:,,若 0時,則Y不是最優(yōu)解,此與假設矛盾,所以不可能,即 =0。 當=0時,則Z=X或ZX,則 若Z=X,則pizi= piyi,由于Y是最優(yōu)解,因此Z也是最優(yōu)解,X也是最優(yōu)解。 若ZX,重復上面的討論,用Z代替Y,則又可求得相應的 0,重復以上過程,直到X=Z為止,可得X為最優(yōu)解。,,,討論:,3.3帶有限期的作業(yè)排序 一、問題的描述 假定只能在一臺機器上處理n個作業(yè),每個作業(yè)均可在單位時間內完成;又假定每個作業(yè)i都有一個截止期限di
46、0(它是整數(shù)),當且僅當作業(yè)i在它的期限截止以前被完成時,則獲得pi0的效益 ,求具有最大效益值的可行解,也就是最優(yōu)解。 分析:約束條件:每個作業(yè)均要在截止期限前完成。 目標函數(shù): 例子:n=4,(p1,p2,p3,p4)=(100,10,15,20)和(d1,d2,d3,d4)=(2,1,2,1)。,,可行解 處理順序 效益值 (1) 1 100 (2) 2 10 (3) 3 15 (4) 4 20 (1,2) 2,1 110 (1,3) 1,3或3,1 115 (1,4) 4,1 120 (2,3) 2,3
47、 25 (3,4) 4,3 35,二、問題的分析 最優(yōu)量度標準:目標函數(shù)pi作為量度,即按照pi的非增次序來考慮這些作業(yè)。 使用這一量度,下一個要計入的作業(yè)將是使得在滿足所產生的J是一個可行解的限制條件下讓pi得到最大增加的作業(yè)。,應用以上的量度標準:開始時J=0, 由于作業(yè)1有最大效益且J=1是一個可行解,于是把作業(yè)1計入J。下一步考慮作業(yè)4,J=1,4也是可行解。然后考慮作業(yè)3,因為1,3,4不是可行解,故作業(yè)3被舍棄。最后考慮作業(yè)2,由于1,2,4也不可行,作業(yè)2被舍棄。最終所留下的是效益值為120的解J=1,4。它是這個問題的最優(yōu)解。,三、算法的粗略描述 GREEDY-J
48、OB(D,J,n) //作業(yè)按p1p2pn的次序輸入,它們的期限值Di1,1in,n1.J是在它們的截止期限前完成的作業(yè)的集合// 1 J1 2 for i2 to n do 3 if Ji的所有作業(yè)都有能在它們的截止期限前完成 then JJi 4 endif 5 ,由前面貪心方法的算法設計模式得到,J是一個作業(yè)的集合,而不是調度表,,,四、算法的證明 定理3.2 以上算法所描述的貪心方法對于作業(yè)排序問題總是得到一個最優(yōu)解。,思路:J是由貪心方法所選擇的作業(yè)的集合;I是一個最優(yōu)解的作業(yè)集合。可證明J和I具有相同的效益值,從而J也是最優(yōu)的。(I,J是作業(yè)的集合,而不是作業(yè)的調度表),
49、證明:假定(1)IJ,因為若I=J,則J即為最優(yōu)解。 (2)如果I J,則I就不可能是最優(yōu)的。 (3)由貪心法的工作方式也排斥了J I。,,因此,至少存在這樣的兩個作業(yè)a和b,使得aJ且a I,bI且b J。設a是使得aJ且a I的一個具有最高效益值的作業(yè)。由貪心方法可以得出,對于在I中又不在J中的所有作業(yè)b,都有papb。這是因為若pb pa,則貪心方法會先于作業(yè)a考慮作業(yè)b并且把b計入到J中去。,設SI和SJ分別是I和J的可行調度表。(調度表與作業(yè)集的區(qū)別) (1)設i是既屬于J又屬于I的一個作業(yè),把他們調換到相同的時刻去調度,且盡量將調度時間往后移。,設i在SI中在t到t+1時刻被調度,
50、而在SJ中則在t到t+1時刻被調度。如果tt,則可以將SI中t,t+1時刻所調度的那個作業(yè)(如果有的話)與i相交換。如果J中在t,t+1時刻沒有作業(yè)被調度,則將i移到t,t+1調度。所形成的這個調度表也是可行的。如果tt,則可在和SI中作類似的調換。,(2)對于I,J中不同的作業(yè),則以J為標準,將其中不屬于I的那些作業(yè)找出,設a是這樣的作業(yè),它在SJ 中 時刻被調度。設作業(yè)b在I中的這一時刻被調度。根據(jù)對a的選擇 在SI 的 時刻去掉作業(yè)b而去調度作業(yè)a,這就給出了一張關于作業(yè)集合 I=I-ba可行的調度表。,顯然I的效益值不小于I的效益值,并且I比I少一個與J不同的作業(yè)。重復使用上述
51、的轉換,將使I能在不減效益值的情況下轉換成J,因此J也必定是最優(yōu)解,證畢。,,五、算法的實現(xiàn) 考慮對于一個給定的J,如何確定它是否為可行解的問題,一個明顯的方法是檢驗J中作業(yè)的所有可能的排列。對于任一種次序排列的作業(yè)序列,判斷這些作業(yè)是否能在其限期前完成。,J是作業(yè)集,不是調度表,假定J中有k個作業(yè),這就需要檢查k!個排列。對于所給出的一個排列=i1i2i3ik,由于完成作業(yè)ij(1jk)的最早時間是j,因此,只要判斷出排列中的每個作業(yè)的dijj,就可得知是一個允許的調度序列,從而J就是一個可行解。反之,如果排列中有一個dijj,則是一個行不通的調度序列,因為至少作業(yè)ij不會在它的限期前完成
52、,故必須去檢查J的另外形式的排列。事實上,對于J的可行性可以通過只檢驗J中作業(yè)的一種特殊的排列來確定,這個排列是按期限的非降次序來完成的。,定理3.3 設J是k個作業(yè)的集合, =i1i2i3ik是J中作業(yè)的一種排列,它使得di1di2dik。J是一個可行解,當且僅當J中的作業(yè)可以按照的次序而又不違反任何一個期限的情況下來處理。(說明了什么),證明:現(xiàn)證,若J是可行解,則表示可以處理這些作業(yè)的一種允許的調度序列。由于J可行,則必存在, 使得 假設,那末,令a是使得 的最小下標。設 ,顯然ba。在中將 與 相交換,因為 ,故作業(yè)可依新產生的排列 的次序處理而不違反任何一個期限
53、。連續(xù)使用這一方法, 就可將轉換成且不違反任何一個期限。定理得證。,,算法設計思路:首先將作業(yè)按照效益值的非增次序排列,然后試著將作業(yè)逐個與當前的部分可行解合并,檢查是否可產生新的可行解,(注意當前的部分可行解已經按期限值的非降次序排列),其方法是在部分可行解中,看能否找到新作業(yè)的合適的位置,使加入了新的作業(yè)后,其期限值仍按非降次序排列,且每個作業(yè)均在其截止期限前完成。,算法3.4 帶有限期和效益的單位時間的作業(yè)排序貪心算法 GreedyJob(int n , int d , int ,體現(xiàn)了量度標準,,,,11 12if dJrdi and di r//判斷此作業(yè)是否可以插入J; 13th
54、en 14 for j k to r+1 //j是遞減的 15 do//將第k到第r+1個作業(yè)依次后移一位以插入新的作業(yè); 16 Jj + 1 Jj; 17 18Jr + 1 i;//將作業(yè)插入位置r+1; 19k k + 1;//記入J的作業(yè)數(shù)加1; 20 21 22return k;//返回記入J中的作業(yè)數(shù)。,七、一種更快的實現(xiàn) 通過使用不相交集合的UNION與FIND算法以及使用一個不同的方法來確定部分解的可行性,可以把JS的計算時間由O(n2)降低到數(shù)量級相當接近于O(n)。,六、時間復雜性分析 經過分析知道,算法JS所需要的總時間是O(sn)。由于sn (s為包含在解中的
55、作業(yè)數(shù)),因此JS的最壞計算時間為O(n2)。,分析:該方法較前方法的不同之處在于如何確定部分解的可行性方面,兩者的量度標準是一樣的。其方法是:如果J是作業(yè)的可行子集,那么可以使用下述規(guī)則來確定這些作業(yè)中的每一個作業(yè)的處理時間:若還沒給作業(yè)i分配處理時間,則分配給它時間片1, ,其中應盡量取大且時間片1, 是空的。此規(guī)則就是盡可能推遲對作業(yè)的處理。于是,在將作業(yè)一個一個地裝配到J中時,就不必為接納新作業(yè)而去移動J中那些已分配了時間片的作業(yè)。如果正被考慮的新作業(yè)不存在像上面那樣定義的 ,這個作業(yè)就不能計入J。,例33 設n=5,(p1,,p5)=(20,15,10,5,1)和(d1, ,d5)=
56、(2,2,1,3,3) 。使用上述可行性規(guī)則,得 J 已分配的時間片 正被考慮的作業(yè) 動作 無 1 分配1,2 1 1,2 2 分配0,1 1,2 0,1,1,2 3 不適合,舍棄 1,2 0,1,1,2 4 分配2,3 1,2,4 0,1,1,2,2,3 5 舍棄 最優(yōu)解是J=1,2,4。,,設計思想: (1)只考慮時間片1,b,其中b=minn,maxdj (2)作出一些以期限值為元素的集合,且使得同一集合中的元素都有一個當前共同可用的最接近的空時間片。
57、(3)用F(i)表示期限為i的作業(yè)當前最接近的空時間片ni, 初始時, F(i)=i 且有b+1個集合與b+1個期限值相對應。 (4)p(i) :i為根時,表示樹中結點數(shù)的負值, i不為根時,表示i 的父結點。 初始時: p(i)= -1,,,,(5)若要調度具有期限值是d的作業(yè),則去找包含期限值min(n,d)的那個根,若根為j且只要F(j) 0,則F(j) 是最接近的空時間片,在使用完此時間片后,其根為 j的集合與包含期限值F(j) 1的集合合并。,核心,,,,,在算法FasterJob中調用了過程Union和Find,其算法分別描述如下描述如下: 算法Union(i,j)的概略
58、描述:,Union(int i,int j) 1 x Parent(i) + Parent(j);//計算兩棵樹的總結點數(shù); 4 if Parent(i) Parent(j) //注意這里比較的是兩個負數(shù); 5then//樹i的結點數(shù)比j的少,則把i連到以j為根的樹上; 6 Parent(i) j 7 Parent(j) x; 8 9else//樹j的結點數(shù)比i的少; 11 Parent(j) i 12 Parent(i) x; 13,此算法的功能是合并根為i,j的兩個集合.,函數(shù)Find(i)算法描述如下:,Find(i) 1ji; 2while Parent(j)0//尋找根結點j;
59、3do jParent(j); 4ki; 5while kj 6 do//使用壓縮規(guī)則,壓縮結點i到其根結點之間的路徑上的結點; 7 tParent(k); 8 Parent(k)j; 9 kt; 10 11return j;//返回根結點。,一、適用條件 多階段決策過程 實際問題中,常有這樣一類活動,它們的活動過程可以分為若干個階段,而且在任一階段i后的行為都依賴于i階段的過程狀態(tài),而與i階段之前的過程如何達到這種狀態(tài)的方式無關。當各個階段決策確定后,就組成了一個決策序列,因而也就確定了整個過程的一條活動路線。這種把一個問題看作是一個前后關聯(lián)的具有鏈狀結構的多階段過程被稱為多階段決策過程
60、. 滿足最優(yōu)性原理,第四章 動態(tài)規(guī)劃 41 方法概述,,狀態(tài)0 決策1 決策2 決策n 狀態(tài)n,,狀態(tài)1,,,,狀態(tài)n-1,狀態(tài)2,,二、最優(yōu)性原理 在多階段決策過程的每一階段,都可能有多種可供選擇的決策,但必須從中選取一種決策。一旦各個階段的決策選定之后,就構成了解決這一問題的一個決策序列,決策序列不同,所導致的問題的結果也不同。動態(tài)規(guī)劃的目標就是要在所有容許選擇的決策序列中選取一個會獲得問題最優(yōu)解的決策序列,即最優(yōu)決策序列。,三、動態(tài)規(guī)劃方法的關鍵 關鍵在于獲取各階段間的遞推關系式。 四、可解決的問題 最短路徑問題、設備更新問題、資源分配問題、貨物裝 運排序
61、、生產計劃等。 五、應用實例分析,例4.1 多段圖問題多段圖G=(V,E)是一個有向圖。它具有如下特性:圖中的結點被劃分成k2個不相交的集合Vi,1ik,其中V1和Vk分別有一個結點s(源點)和t(匯點)。圖中所有的邊(u,v)均具有如下性質:若uVi,則vVi+1,1ik-1,且每條邊(u,v)均附有成本c(u,v)。從s到t的一條路徑成本是這條路徑上邊的成本和。多段圖問題是求由s到t的最小成本路徑。每個集合Vi定義圖中的一段。由于E的約束,每條從s到t的路徑都是從第1段開始,在第k段終止。圖4.1所示的就是一個5段圖。,4,6,,,,,對于每一條由s到t的路徑,可以把它看成在k-2個階段中
62、作出的某個決策序列的相應結果。第i次決策就是確定Vi+1中的哪個結點在這條路徑上,1ik-2。 下面證明最優(yōu)性原理對多段圖成立。假設s,v2,v3,,vk-1,t是一條由s到t的最短路徑,還假定從源點s(初始狀態(tài))開始,已作出了到結點v2的決策(初始決策),因此v2就是初始決策所產生的狀態(tài)。如果把v2看成是原問題的一個子問題的初始狀態(tài),解這個子問題就是找出一條由v2到t的最短路徑。這條最短路徑顯然是v2,v3,,vk-1,t,如若不 然,設v2,q3,,qk-1,t是一條由v2到t的更短路徑,則s,v2,q3,,qk-1,t是一條比路徑s,v2,v3,,vk-1,t更短的由s到t的路徑。與假設
63、矛盾,故最優(yōu)性原理成立。因此它為使用動態(tài)規(guī)劃方法來解決多段圖問題提供了可能。,六、動態(tài)規(guī)劃方法的形式化描述 能用動態(tài)規(guī)劃求解的問題的最優(yōu)化決策序列可表示如下。設S0是問題的初始狀態(tài)。假定需要作n次決策xi, 1in。設X1=r1,1,r1,2,,r1,p1是X1的可能決策值的集合,而S1, 1是在選取決策值r1,j1以后所產生的狀態(tài), 1j1p1。又設 是相應于狀態(tài)S1,j1的最優(yōu)決策序列。那末,相應于S0的最優(yōu)決策序列就是 |1j1p1中最優(yōu)的序列,記為OPT = 。如果已作了k-1次決策,1k-1n。設x1,,xk-1的最優(yōu)決策值是r1,,rk-1,它們所產生的狀態(tài)為S1,,
64、Sk-1。又設,是xk的可能值的集合。 是選取決策值 后所產生的狀態(tài),1jkpk。 是相應于 的最優(yōu)決策序列。因此,相應于Sk-1的最優(yōu)決策序列是 。于是相應于S0的最優(yōu)決策序列為r1,,rk-1,rk, 。,,七、兩種求解方法,(1)向前處理法:從最后階段開始,以逐步向前遞推的方式列出求前一階段決策值的遞推關系式,即根據(jù)xi+1,,xn的那些最優(yōu)決策序列來列出求取xi決策值的關系式,即:xi=f(xi+1,xi+2,,xn),例子:在k段圖問題中,設 又設 是由 到t的最短路徑,則s到t的最短路徑是 中最短的那條路徑。若
65、設 是s 到t的一條最短路徑, 是路徑上的中間結點,則 就應分別是由s到vi和由vi到t的最短路徑。,(2)向后處理法:根據(jù)x1,,xi-1的那些最優(yōu)決策序列列出求xi的遞推關系式。即:xi=f(x1,x2,,xi-1) .,下例是說明向前處理法在多段圖中的使用,見黑板,小結:無論是使用向前處理法還是使用向后處理法,都將所有子問題的最優(yōu)解保存下來。這樣做的目的是為了便于逐步遞推得到原問題的最優(yōu)解并避免對它們的重復計算。由枚舉法可知,不同決策序列的總數(shù)就其所取決策值而言是指數(shù)級的(如果決策序列由n次決策構成,而每次決策有p種選擇,那末可能的決策序列就有pn個),而動態(tài)規(guī)
66、劃算法則可能有多項式的復雜度。,八、動態(tài)規(guī)劃算法的求解步驟,(1)段化; (2)自頂向下的分析,測試問題本身是否滿足最優(yōu)化原理; (3)從底向上的計算,實現(xiàn)動態(tài)規(guī)劃過程。,,一、問題的描述 例4.1給出了多段圖的定義,并且指出一個k段圖的每一條由源點s到匯點t的路徑可以看成是在k-2個階段中作出的某個決策序列的相應結果。第i次決策就是確定Vi+1中的哪個結點在這條路徑上,1ik-2。進而還證明了最優(yōu)性原理對多段圖成立,因此用動態(tài)規(guī)劃方法有可能找到由s到t的最小成本路徑。,4.2 多段圖,二、問題分析:使用向前處理法 求各階段的遞推關系式: (1) (2)若E,有COST(k-1,j)=c(j,t),若 E, 有COST(k-1,j)=, 設: P(i,j) 是一條從Vi中的結點j到匯點t的最小成本路徑, COST(i,j)是這條路的成本。,關鍵,,例子:對圖4.1的5段圖給出具體實現(xiàn)這一系列計算的步驟: COST(3,6)=min6+COST(4,9),5+COST(4,10)=7 COST(3,7)=min4+COST(4,9),3+COST(4,10)=5 COST(