計算機算法設(shè)計與實現(xiàn) 王曉東主編第三版 PPT第4章 貪心算法_第1頁
計算機算法設(shè)計與實現(xiàn) 王曉東主編第三版 PPT第4章 貪心算法_第2頁
計算機算法設(shè)計與實現(xiàn) 王曉東主編第三版 PPT第4章 貪心算法_第3頁
計算機算法設(shè)計與實現(xiàn) 王曉東主編第三版 PPT第4章 貪心算法_第4頁
計算機算法設(shè)計與實現(xiàn) 王曉東主編第三版 PPT第4章 貪心算法_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1第4章 貪心算法2學(xué)習(xí)要點學(xué)習(xí)要點理解貪心算法的概念。掌握貪心算法的基本要素 (1)最優(yōu)子結(jié)構(gòu)性質(zhì)(2)貪心選擇性質(zhì)理解貪心算法與動態(tài)規(guī)劃算法的差異理解貪心算法的一般理論通過應(yīng)用范例學(xué)習(xí)貪心設(shè)計策略。(1)活動安排問題;(2)最優(yōu)裝載問題;(3)哈夫曼編碼;(4)單源最短路徑;(5)最小生成樹;(6)多機調(diào)度問題。3 顧名思義,貪心算法總是作出在當(dāng)前看來最好的選擇。也就是說貪心算法并不從整體最優(yōu)考慮,它所作出的選擇只是在某種意義上的局部最優(yōu)局部最優(yōu)選擇。當(dāng)然,希望貪心算法得到的最終結(jié)果也是整體最優(yōu)的。雖然貪心算法不能對所有問題都得到整體最優(yōu)解,但對許多問題它能產(chǎn)生整體最優(yōu)解。如單源最短路經(jīng)問

2、題,最小生成樹問題等。在一些情況下,即使貪心算法不能得到整體最優(yōu)解,其最終結(jié)果卻是最優(yōu)解的很好近似。44.1 活動安排問題 活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心算法提供了一個簡單、漂亮的方法使得盡可能多的活動能兼容地使用公共資源。54.1 活動安排問題 設(shè)有n個活動的集合E=1,2,n,其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內(nèi)只有一個活動能使用這一資源。每個活動i都有一個要求使用該資源的起始時間si和一個結(jié)束時間fi,且si fi 。如果選擇了活動i,則它在半

3、開時間區(qū)間si, fi)內(nèi)占用資源。若區(qū)間si, fi)與區(qū)間sj, fj)不相交,則稱活動i與活動j是相容的。也就是說,當(dāng)sifj或sjfi時,活動i與活動j相容。64.1 活動安排問題ntemplatenvoid GreedySelector(int n, Type s, Type f, bool A)nn A1=true;n int j=1;n for (int i=2;i=fj) Ai=true; j=i; n else Ai=false;n n下面給出解活動安排問題的貪心算法GreedySelectorGreedySelector :各活動的起始時間和結(jié)各活動的起始時間和結(jié)束時間存儲

4、于數(shù)組束時間存儲于數(shù)組s s和和f f中且按結(jié)束時間的非減中且按結(jié)束時間的非減序排列序排列 74.1 活動安排問題 由于輸入的活動以其完成時間的非減序非減序排列,所以算法greedySelectorgreedySelector每次總是選擇具有最早具有最早完成時間完成時間的相容活動加入集合A中。直觀上,按這種方法選擇相容活動為未安排活動留下盡可能多的時間。也就是說,該算法的貪心選擇的意義是使剩余的可安排時間段極大化使剩余的可安排時間段極大化,以便安排盡可能多的相容活動。 算法greedySelectorgreedySelector的效率極高。當(dāng)輸入的活動已按結(jié)束時間的非減序排列,算法只需O(nO

5、(n) )的時間安排n個活動,使最多的活動能相容地使用公共資源。如果所給出的活動未按非減序排列,可以用O(nlognO(nlogn) )的時間重排。 84.1 活動安排問題 例:例:設(shè)待安排的11個活動的開始時間和結(jié)束時間按結(jié)束時間的非減序排列如下:i12345678910 11Si 130535688212fi45678910 11 12 13 1494.1 活動安排問題 算法算法greedySelectorgreedySelector 的計算過程的計算過程如左圖所示。圖中每行相應(yīng)于算法的一次迭代。陰影長條表示的活動是已選入集合A的活動,而空白長條表示的活動是當(dāng)前正在檢查相容性的活動。104

6、.1 活動安排問題 若被檢查的活動i的開始時間Si小于最近選擇的活動j的結(jié)束時間fi,則不選擇活動i,否則選擇活動i加入集合A中。 貪心算法并不總能求得問題的整體最優(yōu)解整體最優(yōu)解。但對于活動安排問題,貪心算法greedySelector卻總能求得的整體最優(yōu)解,即它最終所確定的相容活動集合A的規(guī)模最大。這個結(jié)論可以用數(shù)學(xué)歸納法證明。114.2 貪心算法的基本要素 本節(jié)著重討論可以用貪心算法求解的問題的一般特征。 對于一個具體的問題,怎么知道是否可用貪心算法解此問題,以及能否得到問題的最優(yōu)解呢?這個問題很難給予肯定的回答。 但是,從許多可以用貪心算法求解的問題中看到這類問題一般具有2個重要的性質(zhì):

7、貪心選擇性質(zhì)貪心選擇性質(zhì)和最最優(yōu)子結(jié)構(gòu)性質(zhì)優(yōu)子結(jié)構(gòu)性質(zhì)。 124.2 貪心算法的基本要素1 1、貪心選擇性質(zhì)、貪心選擇性質(zhì) 所謂貪心選擇性質(zhì)貪心選擇性質(zhì)是指所求問題的整體最優(yōu)解整體最優(yōu)解可以通過一系列局部最優(yōu)局部最優(yōu)的選擇,即貪心選擇來達到。這是貪心算法可行的第一個基本要素,也是貪心算法與動態(tài)規(guī)劃算法的主要區(qū)別。 動態(tài)規(guī)劃算法通常以自底向上自底向上的方式解各子問題,而貪心算法則通常以自頂向下自頂向下的方式進行,以迭代的方式作出相繼的貪心選擇,每作一次貪心選擇就將所求問題簡化為規(guī)模更小的子問題。 對于一個具體問題,要確定它是否具有貪心選擇性質(zhì),必須證明每一步所作的貪心選擇最終導(dǎo)致問題的整體最優(yōu)解

8、。134.2 貪心算法的基本要素 當(dāng)一個問題的最優(yōu)解包含其子問題的最優(yōu)解時,稱此問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)最優(yōu)子結(jié)構(gòu)性質(zhì)。問題的最優(yōu)子結(jié)構(gòu)性質(zhì)是該問題可用動態(tài)規(guī)劃算法或貪心算法求解的關(guān)鍵特征。 2 2、最優(yōu)子結(jié)構(gòu)性質(zhì)、最優(yōu)子結(jié)構(gòu)性質(zhì)144.2 貪心算法的基本要素 貪心算法和動態(tài)規(guī)劃算法都要求問題具有最優(yōu)子結(jié)構(gòu)性質(zhì),這是2類算法的一個共同點。但是,對于具有最優(yōu)子結(jié)構(gòu)最優(yōu)子結(jié)構(gòu)的問題應(yīng)該選用貪心算法還是動態(tài)規(guī)劃算法求解?是否能用動態(tài)規(guī)劃算法求解的問題也能用貪心算法求解?下面研究2個經(jīng)典的組合優(yōu)化問題組合優(yōu)化問題,并以此說明貪心算法與動態(tài)規(guī)劃算法的主要差別。3、貪心算法與動態(tài)規(guī)劃算法的差異154.2 貪

9、心算法的基本要素n0-10-1背包問題背包問題: 給定n種物品和一個背包。物品i的重量是Wi,其價值為Vi,背包的容量為C。應(yīng)如何選擇裝入背包的物品,使得裝入背包中物品的總價值最大? 在選擇裝入背包的物品時,對每種物品在選擇裝入背包的物品時,對每種物品i i只有只有2 2種選擇,即種選擇,即裝入背包或不裝入背包。不能將物品裝入背包或不裝入背包。不能將物品i i裝入背包多次,也不能只裝入背包多次,也不能只裝入部分的物品裝入部分的物品i i。164.2 貪心算法的基本要素n背包問題:背包問題: 與0-1背包問題類似,所不同的是在選擇物品i裝入背包時,可以選擇物品可以選擇物品i i的一部分的一部分,

10、而不一定要全部裝入背包,1in。 這2類問題都具有最優(yōu)子結(jié)構(gòu)最優(yōu)子結(jié)構(gòu)性質(zhì),極為相似,但背包問題可以用貪心算法求解,而0-1背包問題卻不能用貪心算法求解。 (P107例子)174.2 貪心算法的基本要素 首先計算每種物品單位重量的價值Vi/Wi,然后,依貪心選擇策略,將盡可能多的單位重量價值最高單位重量價值最高的物品裝入背包。若將這種物品全部裝入背包后,背包內(nèi)的物品總重量未超過C,則選擇單位重量價值次高的物品并盡可能多地裝入背包。依此策略一直地進行下去,直到背包裝滿為止。 具體算法可描述如下頁: 用貪心算法解背包問題的基本步驟:184.2 貪心算法的基本要素nvoid Knapsack(int

11、 n,float M,float v,float w,float x)nn Sort(n,v,w);n int i;n for (i=1;i=n;i+) xi=0;n float c=M;n for (i=1;ic) break;n xi=1;n c-=wi;n n if (i=n) xi=c/wi;n 算法算法knapsackknapsack的的主要計算時間在于將主要計算時間在于將各種物品依其單位重各種物品依其單位重量的價值從大到小排量的價值從大到小排序。因此,算法的計序。因此,算法的計算時間上界為算時間上界為O O(nlognnlogn)。)。為了證明算法的正確為了證明算法的正確性,還必須

12、證明背包性,還必須證明背包問題具有貪心選擇性問題具有貪心選擇性質(zhì)質(zhì)。194.2 貪心算法的基本要素 對于0-10-1背包問題背包問題,貪心選擇之所以不能得到最優(yōu)解是因為在這種情況下,它無法保證最終能將背包裝滿,部分閑置的背包空間使每公斤背包空間的價值降低了。事實上,在考慮0-1背包問題時,應(yīng)比較選擇該物品和不選擇該物品所導(dǎo)致的最終方案,然后再作出最好選擇。由此就導(dǎo)出許多互相重疊的子問題。這正是該問題可用動態(tài)規(guī)劃動態(tài)規(guī)劃算法算法求解的另一重要特征。實際上也是如此,動態(tài)規(guī)劃算法的確可以有效地解0-1背包問題。 204.3 最優(yōu)裝載 有一批集裝箱要裝上一艘載重量為c的輪船。其中集裝箱i的重量為Wi。

13、最優(yōu)裝載問題要求確定在裝載體積不受限制的情況下,將盡可能多的集裝箱裝上輪船。1 1、算法描述、算法描述最優(yōu)裝載問題可用貪心算法求解。采用重量最輕者先裝的貪心選擇策略,可產(chǎn)生最優(yōu)裝載問題的最優(yōu)解。具體算法描述如下頁。 214.3 最優(yōu)裝載ntemplatenvoid Loading(int x, Type w, Type c, int n)nn int *t = new int n+1;n Sort(w, t, n);n for (int i = 1; i = n; i+) xi = 0;n for (int i = 1; i = n & wti = c; i+) xti = 1; c -= w

14、ti;n224.3 最優(yōu)裝載2 2、貪心選擇性質(zhì)貪心選擇性質(zhì) 可以證明最優(yōu)裝載問題具有貪心選擇性質(zhì)。 3 3、最優(yōu)子結(jié)構(gòu)性質(zhì)最優(yōu)子結(jié)構(gòu)性質(zhì)最優(yōu)裝載問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)。由最優(yōu)裝載問題的貪心選擇性質(zhì)和最優(yōu)子結(jié)構(gòu)性質(zhì),容易證明算法loadingloading的正確性。算法loadingloading的主要計算量在于將集裝箱依其重量從小到大排序,故算法所需的計算時間為 O(nlognO(nlogn) )。 234.4 哈夫曼編碼哈夫曼編碼哈夫曼編碼是廣泛地用于數(shù)據(jù)文件壓縮的十分有效的編碼方法。其壓縮率通常在20%90%之間。哈夫曼編碼算法用字符在文件中出現(xiàn)的頻率表來建立一個用0,1串表示各字符的最

15、優(yōu)表示方式。 給出現(xiàn)頻率高的字符較短的編碼,出現(xiàn)頻率較低的字符以較長的編碼,可以大大縮短總碼長。1、前綴碼對每一個字符規(guī)定一個0,1串作為其代碼,并要求任一字符的代碼都不是其它字符代碼的前綴。這種編碼稱為前綴碼前綴碼。244.4 哈夫曼編碼 編碼的前綴性質(zhì)可以使譯碼方法非常簡單。 表示最優(yōu)前綴碼最優(yōu)前綴碼的二叉樹總是一棵完全二叉樹完全二叉樹,即樹中任一結(jié)點都有2個兒子結(jié)點。平均碼長平均碼長定義為:使平均碼長達到最小的前綴碼編碼方案稱為給定編碼字符集C的最優(yōu)前綴碼最優(yōu)前綴碼。)()()(cdcfTBTCc 254.4 哈夫曼編碼2 2、構(gòu)造哈夫曼編碼構(gòu)造哈夫曼編碼哈夫曼提出構(gòu)造最優(yōu)前綴碼的貪心算

16、法,由此產(chǎn)生的編碼方案稱為哈夫曼編碼哈夫曼編碼。哈夫曼算法以自底向上的方式構(gòu)造表示最優(yōu)前綴碼的二叉樹T。算法以|C|個葉結(jié)點開始,執(zhí)行|C|1次的“合并”運算后產(chǎn)生最終所要求的樹T。 264.4 哈夫曼編碼 在書上給出的算法huffmanTree中,編碼字符集中每一字符c的頻率是f(c)。以以f f為鍵值的優(yōu)先隊列為鍵值的優(yōu)先隊列Q Q用在貪心選擇貪心選擇時有效地確定算法當(dāng)前要合并的2棵具有最小頻率的樹。一旦2棵具有最小頻率的樹合并后,產(chǎn)生一棵新的樹,其頻率為合并的2棵樹的頻率之和,并將新樹插入優(yōu)先隊列Q。經(jīng)過n1次的合并后,優(yōu)先隊列中只剩下一棵樹,即所要求的樹T。算法huffmanTree用

17、最小堆實現(xiàn)優(yōu)先隊列Q。初始化優(yōu)先隊列需要O(n)計算時間,由于最小堆的removeMin和put運算均需O(logn)時間,n1次的合并總共需要O(nlogn)計算時間。因此,關(guān)于n個字符的哈夫曼算法的計算時間計算時間為O(nlogn) 。274.4 哈夫曼編碼3 3、哈夫曼算法的正確性哈夫曼算法的正確性要證明哈夫曼算法的正確性,只要證明最優(yōu)前綴碼問題具有貪心選擇性質(zhì)貪心選擇性質(zhì)和最優(yōu)子結(jié)構(gòu)性質(zhì)最優(yōu)子結(jié)構(gòu)性質(zhì)。(1)貪心選擇性質(zhì)(2)最優(yōu)子結(jié)構(gòu)性質(zhì)284.5 單源最短路徑給定帶權(quán)有向圖G =(V,E),其中每條邊的權(quán)是非負(fù)實數(shù)。另外,還給定V中的一個頂點,稱為源源?,F(xiàn)在要計算從源到所有其它各頂

18、點的最短路長度最短路長度。這里路的長度是指路上各邊權(quán)之和。這個問題通常稱為單源單源最短路徑問題最短路徑問題。1、算法基本思想Dijkstra算法是解單源最短路徑問題的貪心算法。294.5 單源最短路徑其基本思想基本思想是,設(shè)置頂點集合S并不斷地作貪心選貪心選擇擇來擴充這個集合。一個頂點屬于集合S當(dāng)且僅當(dāng)從源到該頂點的最短路徑長度已知。初始時,S中僅含有源。設(shè)u是G的某一個頂點,把從源到u且中間只經(jīng)過S中頂點的路稱為從源到u的特殊路徑,并用數(shù)組dist記錄當(dāng)前每個頂點所對應(yīng)的最短特殊路徑長度。Dijkstra算法每次從V-S中取出具有最短特殊路長度的頂點u,將u添加到S中,同時對數(shù)組dist作必

19、要的修改。一旦S包含了所有V中頂點,dist就記錄了從源到所有其它頂點之間的最短路徑長度。304.5 單源最短路徑例如例如,對右圖中的有向圖,應(yīng)用Dijkstra算法計算從源頂點1到其它頂點間最短路徑的過程列在下頁的表中。314.5 單源最短路徑迭代迭代S Su udist2dist2 dist3dist3 dist4dist4 dist5dist5初始初始1-10maxint301001 11,221060301002 21,2,44105030903 31,2,4,33105030604 41,2,4,3,5510503060Dijkstra算法的迭代過程: 324.5 單源最短路徑2、算

20、法的正確性和計算復(fù)雜性(1)貪心選擇性質(zhì)(2)最優(yōu)子結(jié)構(gòu)性質(zhì)(3)計算復(fù)雜性對于具有n個頂點和e條邊的帶權(quán)有向圖,如果用帶權(quán)鄰接矩陣表示這個圖,那么Dijkstra算法的主循環(huán)體需要 時間。這個循環(huán)需要執(zhí)行n-1次,所以完成循環(huán)需要 時間。算法的其余部分所需要時間不超過 。)(nO)(2nO)(2nO334.6 最小生成樹 設(shè)G =(V,E)是無向連通帶權(quán)圖,即一個網(wǎng)絡(luò)網(wǎng)絡(luò)。E中每條邊(v,w)的權(quán)為cvw。如果G的子圖G是一棵包含G的所有頂點的樹,則稱G為G的生成樹。生成樹上各邊權(quán)的總和稱為該生成樹的耗費耗費。在G的所有生成樹中,耗費最小的生成樹稱為G的最小生成樹最小生成樹。網(wǎng)絡(luò)的最小生成樹

21、在實際中有廣泛應(yīng)用。例如例如,在設(shè)計通信網(wǎng)絡(luò)時,用圖的頂點表示城市,用邊(v,w)的權(quán)cvw表示建立城市v和城市w之間的通信線路所需的費用,則最小生成樹就給出了建立通信網(wǎng)絡(luò)的最經(jīng)濟的方案。 344.6 最小生成樹1、最小生成樹性質(zhì)用貪心算法設(shè)計策略可以設(shè)計出構(gòu)造最小生成樹的有效算法。本節(jié)介紹的構(gòu)造最小生成樹的PrimPrim算法算法和KruskalKruskal算法算法都可以看作是應(yīng)用貪心算法設(shè)計策略的例子。盡管這2個算法做貪心選擇的方式不同,它們都利用了下面的最小生成樹性質(zhì)最小生成樹性質(zhì):設(shè)G=(V,E)是連通帶權(quán)圖,U是V的真子集。如果(u,v)E,且uU,vV-U,且在所有這樣的邊中,(

22、u,v)的權(quán)cuv最小,那么一定存在G的一棵最小生成樹,它以(u,v)為其中一條邊。這個性質(zhì)有時也稱為MSTMST性質(zhì)性質(zhì)。 354.6 最小生成樹2 2、PrimPrim算法算法 設(shè)G=(V,E)是連通帶權(quán)圖,V=1,2,n。構(gòu)造G的最小生成樹的Prim算法的基本思想基本思想是:首先置S=1,然后,只要S是V的真子集,就作如下的貪貪心選擇心選擇:選取滿足條件iS,jV-S,且cij最小的邊,將頂點j添加到S中。這個過程一直進行到S=V時為止。在這個過程中選取到的所有邊恰好構(gòu)成G的一棵最最小生成樹小生成樹。 364.6 最小生成樹利用最小生成樹性質(zhì)和數(shù)學(xué)歸納法容易證明,上述算法中的邊集合邊集合

23、T T始終始終包含包含G G的某棵最小生成樹中的某棵最小生成樹中的邊的邊。因此,在算法結(jié)束時,T中的所有邊構(gòu)成G的一棵最小生成樹。 例如例如,對于右圖中的帶權(quán)圖,按PrimPrim算法算法選取邊的過程如下頁圖所示。374.6 最小生成樹384.6 最小生成樹在上述Prim算法中,還應(yīng)當(dāng)考慮如何有效地找出如何有效地找出滿足條件滿足條件i i S,jS,j V V-S-S,且權(quán),且權(quán)cijcij 最小的邊最小的邊( (i,ji,j) )。實現(xiàn)這個目的的較簡單的辦法是設(shè)置2個數(shù)組closest和lowcost。在Prim算法執(zhí)行過程中,先找出V-S中使lowcost值最小的頂點j,然后根據(jù)數(shù)組clo

24、sest選取邊(j,closestj),最后將j添加到S中,并對closest和lowcost作必要的修改。用這個辦法實現(xiàn)的Prim算法所需的計算時間計算時間為 )(2nO394.6 最小生成樹3 3、KruskalKruskal算法算法Kruskal算法構(gòu)造G的最小生成樹的基本思想基本思想是,首先將G的n個頂點看成n個孤立的連通分支。將所有的邊按權(quán)從小到大排序。然后從第一條邊開始,依邊權(quán)遞增的順序查看每一條邊,并按下述方法連接2個不同的連通分支:當(dāng)查看到第k條邊(v,w)時,如果端點v和w分別是當(dāng)前2個不同的連通分支T1和T2中的頂點時,就用邊(v,w)將T1和T2連接成一個連通分支,然后繼

25、續(xù)查看第k+1條邊;如果端點v和w在當(dāng)前的同一個連通分支中,就直接再查看第k+1條邊。這個過程一直進行到只剩下一個連通分支時為止。 404.6 最小生成樹例如,例如,對前面的連通帶權(quán)圖,按Kruskal算法順序得到的最小生成樹上的邊如下圖所示。414.6 最小生成樹關(guān)于集合的一些基本運算集合的一些基本運算可用于實現(xiàn)Kruskal算法。 按權(quán)的遞增順序查看等價于對優(yōu)先隊列優(yōu)先隊列執(zhí)行removeMinremoveMin運算??梢杂枚讯褜崿F(xiàn)這個優(yōu)先隊列。 對一個由連通分支組成的集合不斷進行修改,需要用到抽象數(shù)據(jù)類型并查集并查集UnionFindUnionFind所支持的基本運算。當(dāng)圖的邊數(shù)為e時,

26、Kruskal算法所需的計算時間計算時間是 。當(dāng) 時,Kruskal算法比Prim算法差,但當(dāng) 時,Kruskal算法卻比Prim算法好得多。)log(eeO)(2ne)(2noe 424.7 多機調(diào)度問題多機調(diào)度問題多機調(diào)度問題要求給出一種作業(yè)調(diào)度方案,使所給的n個作業(yè)在盡可能短的時間內(nèi)由m臺機器加工處理完成。這個問題是NPNP完全問題完全問題,到目前為止還沒有有效的解法。對于這一類問題,用貪心選擇策略貪心選擇策略有時可以設(shè)計出較好的近似算法。 約定,每個作業(yè)均可在任何一臺機器上加工處理,但未約定,每個作業(yè)均可在任何一臺機器上加工處理,但未完工前不允許中斷處理。作業(yè)不能拆分成更小的子作業(yè)。完

27、工前不允許中斷處理。作業(yè)不能拆分成更小的子作業(yè)。434.7 多機調(diào)度問題采用最長處理時間作業(yè)優(yōu)先最長處理時間作業(yè)優(yōu)先的貪心選擇策略可以設(shè)計出解多機調(diào)度問題的較好的近似算法。按此策略,當(dāng) 時,只要將機器i的0, ti時間區(qū)間分配給作業(yè)i即可,算法只需要O(1)時間。當(dāng) 時,首先將n個作業(yè)依其所需的處理時間從大到小排序。然后依此順序?qū)⒆鳂I(yè)分配給空閑的處理機。算法所需的計算時間為O(nlogn)。mn mn 444.7 多機調(diào)度問題例如,例如,設(shè)7個獨立作業(yè)1,2,3,4,5,6,7由3臺機器M1,M2和M3加工處理。各作業(yè)所需的處理時間分別為2,14,4,16,6,5,3。按算法greedygre

28、edy產(chǎn)生的作業(yè)調(diào)度如下圖所示,所需的加工時間為17。 454.8 貪心算法的理論基礎(chǔ)借助于擬陣擬陣工具,可建立關(guān)于貪心算法的較一般的理論。這個理論對確定何時使用貪心算法確定何時使用貪心算法可以得到問題的整體最優(yōu)解十分有用。1 1、擬陣擬陣擬陣M定義為滿足下面3個條件的有序?qū)?S,I):(1)S是非空有限集。(2)I是S的一類具有遺傳性質(zhì)的獨立子集族,即若BI,則B是S的獨立子集,且B的任意子集也都是S的獨立子集??占貫镮的成員。(3)I滿足交換性質(zhì),即若AI,BI且|A|0,則稱擬陣M為帶權(quán)擬陣帶權(quán)擬陣。依此權(quán)函數(shù),S的任一子集A的權(quán)定義為 。2 2、關(guān)于帶權(quán)擬陣的貪心算法、關(guān)于帶權(quán)擬陣的

29、貪心算法許多可以用貪心算法求解的問題可以表示為求帶權(quán)擬陣的最大權(quán)獨立子集問題最大權(quán)獨立子集問題。 AxxWAW)()(484.8 貪心算法的理論基礎(chǔ)給定帶權(quán)擬陣M=(S,I),確定S的獨立子集AI使得W(A)達到最大。這種使W(A)最大的獨立子集A稱為擬陣M的最優(yōu)子集最優(yōu)子集。由于S中任一元素x的權(quán)W(x)是正的,因此,最優(yōu)子集也一定是極大獨立子集最優(yōu)子集也一定是極大獨立子集。例如例如,在最小生成樹問題可以表示為確定帶權(quán)擬陣 的最優(yōu)子集問題。求帶權(quán)擬陣的最優(yōu)子集A的算法可用于解最小生成樹問題。下面給出求帶權(quán)擬陣最優(yōu)子集帶權(quán)擬陣最優(yōu)子集的貪心算法。該算法以具有正權(quán)函數(shù)W的帶權(quán)擬陣M=(S,I)作

30、為輸入,經(jīng)計算后輸出M的最優(yōu)子集A。GM494.8 貪心算法的理論基礎(chǔ)nSet greedygreedy (M,W)nA=;n 將S中元素依權(quán)值W(大者優(yōu)先)組成優(yōu)先隊列;n while (S!=) n S.removeMax(x);n if (AxI) A=Ax;n n return An504.8 貪心算法的理論基礎(chǔ)算法greedygreedy的計算時間復(fù)雜性為 。引理引理4.24.2( (擬陣的貪心選擇性質(zhì)擬陣的貪心選擇性質(zhì)) )設(shè)M=(S,I)是具有權(quán)函數(shù)W的帶權(quán)擬陣,且S中元素依權(quán)值從大到小排列。又設(shè)x S是S中第一個使得x是獨立子集的元素,則存在S的最優(yōu)子集A使得x A。算法gre

31、edygreedy在以貪心選擇構(gòu)造最優(yōu)子集A時,首次選入集合A中的元素x是單元素獨立集中具有最大權(quán)的元素。此時可能已經(jīng)舍棄了S中部分元素??梢宰C明這些被舍棄的元素不可能用于構(gòu)造最優(yōu)子集。)(log(nnfnnO514.8 貪心算法的理論基礎(chǔ)引理引理4.34.3:設(shè)M=(S,I)是擬陣。若S中元素x不是空集的可擴展元素,則x也不可能是S中任一獨立子集A的可擴展元素。引理引理4.4(4.4(擬陣的最優(yōu)子結(jié)構(gòu)性質(zhì)擬陣的最優(yōu)子結(jié)構(gòu)性質(zhì)) )設(shè)x是求帶權(quán)擬陣M(S,I)的最優(yōu)子集的貪心算法greedygreedy所選擇的S中的第一個元素。那么,原問題可簡化為求帶權(quán)擬陣M=(S,I)的最優(yōu)子集最優(yōu)子集問題

32、,其中:S=y|y S且x,y II=B|B S-x且Bx IM的權(quán)函數(shù)是M的權(quán)函數(shù)在S上的限制(稱M為M關(guān)于元素x的收縮收縮)。524.8 貪心算法的理論基礎(chǔ)定理定理4.5(4.5(帶權(quán)擬陣貪心算法的正確性帶權(quán)擬陣貪心算法的正確性) )設(shè)M(S,I)是具有權(quán)函數(shù)W的帶權(quán)擬陣,算法greedy返回M的最優(yōu)子集。3 3、任務(wù)時間表問題、任務(wù)時間表問題給定一個單位時間任務(wù)單位時間任務(wù)的有限集S。關(guān)于S的一個時間表時間表用于描述S中單位時間任務(wù)的執(zhí)行次序。時間表中第1個任務(wù)從時間0開始執(zhí)行直至?xí)r間1結(jié)束,第2個任務(wù)從時間1開始執(zhí)行至?xí)r間2結(jié)束,第n個任務(wù)從時間n-1開始執(zhí)行直至?xí)r間n結(jié)束。534.8

33、 貪心算法的理論基礎(chǔ)具有截止時間截止時間和誤時懲罰誤時懲罰的單位時間任務(wù)時間表問題可描述如下。(1) n個單位時間任務(wù)的集合S=1,2,n;(2) 任務(wù)i的截止時間 ,1in,1 n,即要求任務(wù)i在時間 之前結(jié)束;(3) 任務(wù)i的誤時懲罰 ,1in,即任務(wù)i未在時間 之前結(jié)束將招致的 懲罰;若按時完成則無懲罰。任務(wù)時間表問題任務(wù)時間表問題要求確定S的一個時間表(最優(yōu)時間表)使得總誤時懲罰達到最小。idididiwiwid544.8 貪心算法的理論基礎(chǔ)這個問題看上去很復(fù)雜,然而借助于擬陣擬陣,可以用帶權(quán)擬陣的貪心算法帶權(quán)擬陣的貪心算法有效求解。對于一個給定的S的時間表,在截止時間之前完成的任務(wù)稱為及時任務(wù)及時任務(wù),在截止時間之后完成的任務(wù)稱為誤時任務(wù)誤時任務(wù)。S的任一時間表可以調(diào)整成及時優(yōu)先

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論