![第6章 分支限界法_第1頁](http://file4.renrendoc.com/view/9c511d943eafcdf2b940824660baf1a2/9c511d943eafcdf2b940824660baf1a21.gif)
![第6章 分支限界法_第2頁](http://file4.renrendoc.com/view/9c511d943eafcdf2b940824660baf1a2/9c511d943eafcdf2b940824660baf1a22.gif)
![第6章 分支限界法_第3頁](http://file4.renrendoc.com/view/9c511d943eafcdf2b940824660baf1a2/9c511d943eafcdf2b940824660baf1a23.gif)
![第6章 分支限界法_第4頁](http://file4.renrendoc.com/view/9c511d943eafcdf2b940824660baf1a2/9c511d943eafcdf2b940824660baf1a24.gif)
![第6章 分支限界法_第5頁](http://file4.renrendoc.com/view/9c511d943eafcdf2b940824660baf1a2/9c511d943eafcdf2b940824660baf1a25.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
計算機算法設(shè)計與分析
DesignandAnalysisofComputerAlgorithms
第六章分支限界法Branch-and-BoundAlgorithm王紅霞理學(xué)院2023年2月6日2理解分支限界法的剪枝搜索策略。掌握分支限界法的算法框架隊列式(FIFO)分支限界法優(yōu)先隊列式分支限界法通過應(yīng)用范例學(xué)習(xí)分支限界法的設(shè)計策略。單源最短路徑問題裝載問題;布線問題0-1背包問題;最大團問題;旅行售貨員問題電路板排列問題批處理作業(yè)調(diào)度問題學(xué)習(xí)要點2023年2月6日3提綱一、分支限界法的基本思想二、單源最短路徑問題三、裝載問題四、0-1背包問題五、最大團問題六、旅行售貨員問題2023年2月6日4提綱一、分支限界法的基本思想二、單源最短路徑問題三、裝載問題四、0-1背包問題五、最大團問題六、旅行售貨員問題2023年2月6日5分支限界法同回溯法類似,它也是在解空間中搜索問題的可行解或最優(yōu)解,但搜索的方式不同。回溯法采用深度優(yōu)先的方式,朝縱深方向搜索,直至達到問題的一個可行解,或經(jīng)判斷沿此路徑不會達到問題的可行解或最優(yōu)解時,停止向前搜索,并沿原路返回到該路徑上最后一個還可擴展的結(jié)點。從該結(jié)點出發(fā)朝新的方向縱深搜索。分支定界法則采用寬度優(yōu)先的方式搜索解空間樹,它將活結(jié)點存放在一個特殊的表中。其策略是:在擴展結(jié)點處,先生成其所有的兒子結(jié)點,將那些導(dǎo)致不可行解或?qū)е路亲顑?yōu)解的兒子舍棄,其余兒子加入活結(jié)點表中。此后,從活結(jié)點表中取出一個結(jié)點作為當(dāng)前擴展結(jié)點。并重復(fù)上述結(jié)點擴展過程。所以,分支限界法與回溯法的本質(zhì)區(qū)別在于搜索方式的不同?;厮莘ǜm于處理那些求所有可行解的問題,而分支限界法更適于處理那些只確定一個可行解,特別是最優(yōu)化問題。6在算法空間上比較回溯法和分支限界法(1)回溯法占用內(nèi)存:O(解空間的最大路徑長度)對子集問題,需要O(n)的內(nèi)存空間對排列問題,需要O(n)的內(nèi)存空間(2)分支限界法占用內(nèi)存:O(解空間大小)對子集問題,需要O(2n)的內(nèi)存空間對排列問題,需要O(n!)的內(nèi)存空間2023年2月6日71.1分支限界法與回溯法的比較分支限界法類似于回溯法,也是一種在問題的解空間樹T中搜索問題解的算法。空間消耗不同求解目標(biāo)(適用范圍)不同:回溯法適用于找出滿足約束條件的所有解的情況;分支限界法發(fā)誓找出滿足條件的一個解,或某種意義下的最優(yōu)解。搜索方式不同回溯法:深度優(yōu)先分支限界法:廣度優(yōu)先2023年2月6日81.2分支限界法的基本思想分支限界法常以廣度優(yōu)先或以最小耗費(最大效益)優(yōu)先的方式搜索問題的解空間樹。在分支限界法中,每一個活結(jié)點只有一次機會成為擴展結(jié)點。活結(jié)點一旦成為擴展結(jié)點,就一次性產(chǎn)生其所有兒子結(jié)點。在這些兒子結(jié)點中,導(dǎo)致不可行解或?qū)е路亲顑?yōu)解的兒子結(jié)點被舍棄,其余兒子結(jié)點被加入活結(jié)點表中。此后,從活結(jié)點表中取下一結(jié)點成為當(dāng)前擴展結(jié)點,并重復(fù)上述結(jié)點擴展過程。這個過程一直持續(xù)到找到所需的解或活結(jié)點表為空時為止。2023年2月6日91.3常見的兩種分支限界法從活結(jié)點表中選擇下一擴展結(jié)點的不同方式導(dǎo)致不同的分支限界法:隊列式(FIFO)分支限界法:將活結(jié)點表組織成一個隊列,按照隊列先進先出(FIFO)原則選取下一個節(jié)點為擴展節(jié)點。優(yōu)先隊列式分支限界法:將活結(jié)點表組織成一個優(yōu)先隊列,按照優(yōu)先隊列中規(guī)定的優(yōu)先級選取優(yōu)先級最高的節(jié)點成為當(dāng)前擴展節(jié)點。最大優(yōu)先隊列:使用最大堆,體現(xiàn)最大效益優(yōu)先最小優(yōu)先隊列:使用最小堆,體現(xiàn)最小費用優(yōu)先2023年2月6日10
隊列式分支限界法的搜索解空間樹的方式類似于解空間樹的寬度優(yōu)先搜索,不同的是隊列式分支限界法不搜索以不可行結(jié)點(已經(jīng)被判定不能導(dǎo)致可行解或不能導(dǎo)致最優(yōu)解的結(jié)點)為根的子樹。這是因為,按照規(guī)則,這樣的結(jié)點未被列入活結(jié)點表。2023年2月6日11優(yōu)先隊列式分支限界法的搜索方式是根據(jù)活結(jié)點的優(yōu)先級確定下一個擴展結(jié)點。結(jié)點的優(yōu)先級常用一個與該結(jié)點有關(guān)的數(shù)值p來表示。最大優(yōu)先隊列規(guī)定p值較大的結(jié)點點的優(yōu)先級較高。在算法實現(xiàn)時通常用一個最大堆來實現(xiàn)最大優(yōu)先隊列,用最大堆的Deletemax運算抽取堆中的下一個結(jié)點作為當(dāng)前擴展結(jié)點,體現(xiàn)最大效益優(yōu)先的原則。類似地,最小優(yōu)先隊列規(guī)定p值較小的結(jié)點的優(yōu)先級較高。在算法實現(xiàn)時,常用一個最小堆來實現(xiàn),用最小堆的Deletemin運算抽取堆中下一個結(jié)點作為當(dāng)前擴展結(jié)點,體現(xiàn)最小優(yōu)先的原則。2023年2月6日12
采用優(yōu)先隊列式分支定界算法解決具體問題時,應(yīng)根據(jù)問題的特點選用最大優(yōu)先或最小優(yōu)先隊列,確定各個結(jié)點的p值。2023年2月6日131.4實例0-1背包問題n=3,c=30,w=[16,15,15],p=[45,25,25]分支限界法解0-1背包問題n=3,w=[16,15,15],p=[45,25,25],c=30FIFO隊列:A活結(jié)點隊列:{}BC{B,C}DEJKFGLMNO{C,E}{E,F,G}{F,G}{G}{}455025250分支限界法解0-1背包問題n=3,w=[16,15,15],p=[45,25,25],c=30價值大者優(yōu)先隊列:A活結(jié)點隊列:{}BC{B,C}DEJKFGLMNO{E,C}{C}{F,G}{G}{}455025250454525002023年2月6日16實例分析-0-1背包問題n=3,c=30,w=[16,15,15],p=[45,25,25]隊列式分支限界法:[A]B,C=>B,C[B,C]D,E=>E[C,E]F,G=>F,G[E,F,G]J,K=>K(45)[1,0,0][F,G]L,M=>L(50)[0,1,1]M(25)[G]N,0=>N(25),O(0)不搜索以不可行結(jié)點為根的子樹優(yōu)先隊列式分支限界法:[A]B,C=>B(45),C(0)[B,C]D,E=>E(45)[E,C]J,K=>K(45)[1,0,0][C]F,G=>F(25),G(0)[F,G]L,M=>L(50),[0,1,1]M(25)[G]N,O=>N(25),O(0)可用剪枝函數(shù)加速搜索2023年2月6日171.5實例-TSP問題1234206305410ABCDEFGHIJKLMNOPQ1234344342322423問題描述:某售貨員要到若干城市去推銷商品,一直各城市之間的路程,他要選定一條從駐地出發(fā),經(jīng)過每個城市一遍,最后回到住地的路線,使總的路程最短。分支限界法解旅行售貨員問題1234302010654FIFO隊列:活結(jié)點隊列:{}BCDEGIKFHJMOQLNP222223333344444592525666659{C,D,E}{D,E,F,G}{E,F,G,H,I}{F,G,H,I,J,K}{G,H,I,J,K}{H,I,J,K}{I,J,K}{J,K}{K}{}分支限界法解旅行售貨員問題1234302010654最小費用優(yōu)先隊列:活結(jié)點隊列:{}BCDEGIKFHJMOQLNP2222233333444443064402624351114592525666659{E,D,C}{D,J,K,C}{H,J,K,I,C}{J,K,I,C}{K,I,C}{I,C}{C}{F,G}{G}{}2023年2月6日20實例分析-TSP問題隊列式分支限界法:[B]C,D,E[C,D,E]F,G[D,E,F,G]H,I[E,F,G,H,I]J,K[F,G,H,I,J,K]L(59)[1,2,3,4,1][G,H,I,J,K]M(66)[H,I,J,K]N(25)[1,3,2,4,1][I,J,K]1-3-4(26)[J,K]P(25)[K]Q(59)優(yōu)先隊列式分支限界法:[B]C,D,E=>C(30),D(6),E(4)[E,D,C]J,K=>J(14),K(24)[D,J,K,C]H,I=>H(11),I(26)[H,J,K,I,C]N=>N(25)[1,3,2,4,1][J,K,I,C]P=>P(25)[K,I,C]Q=>Q(59)[I,C]I,C被限界掉1234206305410ABCDEFGHIJKLMNOPQ12343443423224232023年2月6日211.6應(yīng)用分支限界法的關(guān)鍵如何確定合適的限界函數(shù)?如何組織活結(jié)點表?如何確定最優(yōu)解中的各個分量?好的限界函數(shù)不僅計算簡單,還要保證最優(yōu)解在搜索空間中,更重要的是能在搜索的早期對超出目標(biāo)函數(shù)界的結(jié)點進行丟棄,減少搜索空間,從而盡快找到問題的最優(yōu)解。
通常采用最大堆或最小堆來實現(xiàn)優(yōu)先隊列式分支限界法求解問題。
可以用如下方法求得最優(yōu)解中的分量:1)對每個擴展結(jié)點保存該結(jié)點到根結(jié)點的路徑;2)在搜索過程中構(gòu)建搜索經(jīng)過的樹結(jié)構(gòu),在求得最優(yōu)解時,從葉子結(jié)點不斷回溯到根結(jié)點,以確定最優(yōu)解中的各個分量。
2023年2月6日22提綱一、分支限界法的基本思想二、單源最短路徑問題三、裝載問題四、0-1背包問題五、最大團問題六、旅行售貨員問題2023年2月6日232.1單源最短路徑問題定義在有向圖G中,每一邊都有一個非負邊權(quán)。求圖G的從源頂點s到目標(biāo)頂點t之間的最短路徑。2023年2月6日24用優(yōu)先隊列式分支限界法解有向圖G的單源最短路徑問題產(chǎn)生的解空間樹。其中,每一個結(jié)點旁邊的數(shù)字表示該結(jié)點所對應(yīng)的當(dāng)前路長。有向圖G的單源最短路徑問題產(chǎn)生的解空間樹2023年2月6日252.2單源最短路徑問題算法思想用一最小堆來存儲活結(jié)點表。其優(yōu)先級是結(jié)點所對應(yīng)的當(dāng)前路長。算法從圖G的源頂點s和空優(yōu)先隊列開始。結(jié)點s被擴展后,它的兒子結(jié)點被依次插入堆中。此后,算法從堆中取出具有最小當(dāng)前路長的結(jié)點作為當(dāng)前擴展結(jié)點,并依次檢查與當(dāng)前擴展結(jié)點相鄰的所有頂點。如果從當(dāng)前擴展結(jié)點i到頂點j有邊可達,且從源出發(fā),途經(jīng)頂點i再到頂點j的所相應(yīng)的路徑的長度小于當(dāng)前最優(yōu)路徑長度,則將該頂點作為活結(jié)點插入到活結(jié)點優(yōu)先隊列中。這個結(jié)點的擴展過程一直繼續(xù)到活結(jié)點優(yōu)先隊列為空時為止。2023年2月6日262.3剪枝策略在算法擴展結(jié)點的過程中,一旦發(fā)現(xiàn)一個結(jié)點的下界(即結(jié)點所對應(yīng)的當(dāng)前路長)不小于當(dāng)前找到的最短路長,則算法剪去以該結(jié)點為根的子樹。在算法中,還可以利用結(jié)點間的控制關(guān)系進行剪枝。從源頂點s出發(fā),2條不同路徑到達圖G的同一頂點。由于兩條路徑的路長不同,因此可以將路長長的路徑所對應(yīng)的樹中的結(jié)點為根的子樹剪去。例如,從源點s出發(fā),經(jīng)過邊a,e,q(路長為5)和經(jīng)過邊c,h(路長為6)的2條路徑到達圖G的同一頂點。故可將后一條路徑剪掉。2023年2月6日27剪枝策略
下圖是用優(yōu)先隊列式分支限界法解有向圖G的單源最短路徑問題產(chǎn)生的解空間樹的剪枝情況。BA優(yōu)于B,B可剪枝經(jīng)過不同的路徑到達相同的頂點A2023年2月6日282.4算法描述
while(true){for(intj=1;j<=n;j++)if((c[E.i][j]<inf)&&(E.length+c[E.i][j]<dist[j])){//頂點i到頂點j可達,且滿足控制約束
dist[j]=E.length+c[E.i][j];prev[j]=E.i;//加入活結(jié)點優(yōu)先隊列
MinHeapNode<Type>N;N.i=j;N.length=dist[j];H.Insert(N);}try{H.DeleteMin(E);}//取下一擴展結(jié)點
catch(OutOfBounds){break;}//優(yōu)先隊列空
}}頂點i和j間有邊,且此路徑長小于原先從源點到j(luò)的路徑長
2023年2月6日29實例計算從源頂點1到其它頂點間最短路徑2023年2月6日301230V2V0V1V4V33825420510計算從源頂點V0
到其它頂點間最短路徑練習(xí)2023年2月6日31提綱一、分支限界法的基本思想二、單源最短路徑問題三、裝載問題四、0-1背包問題五、最大團問題六、旅行售貨員問題2023年2月6日323.1問題定義有一批共個集裝箱要裝上2艘載重量分別為C1和C2的輪船,其中集裝箱i的重量為wi,且∑wi≤C1+C2裝載問題要求確定是否有一個合理的裝載方案可將這個集裝箱裝上這2艘輪船。如果有,找出一種裝載方案。容易證明:如果一個給定裝載問題有解,則采用下面的策略可得到最優(yōu)裝載方案。(1)首先將第一艘輪船盡可能裝滿;(2)將剩余的集裝箱裝上第二艘輪船。2023年2月6日33
解裝載問題的隊列式分支限界法只求出所要求的最優(yōu)值,稍后將進一步討論求出最優(yōu)解。函數(shù)MaxLoading具體實施對解空間的分支限界搜索。其中隊列Q用于存放活結(jié)點表。在隊列Q的元素值表示每個活結(jié)點所相應(yīng)的當(dāng)前載重量。當(dāng)其值為—1時,表示隊列已到達解空間樹同一層結(jié)點的尾部。3.2隊列式分支限界法2023年2月6日34
函數(shù)EnQueue用于將活結(jié)點加入到活結(jié)點隊列中。該函數(shù)首先檢查i是否等于n。如果i=n,則表示當(dāng)前活結(jié)點為一個葉結(jié)點。由于葉結(jié)點不會被進一步擴展,因此不必加入到活結(jié)點隊列中。此時只要檢查該葉結(jié)點表示的可行解是否優(yōu)于當(dāng)前最優(yōu)解,并適時更新當(dāng)前最優(yōu)解。當(dāng)i<n時,當(dāng)前活結(jié)點是一個內(nèi)部結(jié)點,應(yīng)加入到活結(jié)點隊列中。2023年2月6日35voidEnQueue(&Q,Typewt,Type&bestw,inti,intn)//該函數(shù)負責(zé)加入活結(jié)點
{//如果不是葉結(jié)點,則將結(jié)點權(quán)值wt加入隊列Q
if(i==n)
{//可行葉子結(jié)點
if(wt>bestw)
bestw=wt;
}
else
Q.Add(wt);//不是葉子
}2023年2月6日36函數(shù)MaxLoading在開始時將i初始化為1,bestw初始化為0。此時活結(jié)點隊列為空。將同層結(jié)點尾部標(biāo)志—1加入到活結(jié)點隊列中,表示此時位于第1層結(jié)點的尾部。Ew存儲當(dāng)前擴展結(jié)點所相應(yīng)的重量。2023年2月6日37隊列式分支限界法在算法的while循環(huán)中,首先檢測當(dāng)前擴展結(jié)點的左兒子結(jié)點是否為可行結(jié)點。如果是則將其加入到活結(jié)點隊列中。然后將其右兒子結(jié)點加入到活結(jié)點隊列中(右兒子結(jié)點一定是可行結(jié)點)。2個兒子結(jié)點都產(chǎn)生后,當(dāng)前擴展結(jié)點被舍棄。活結(jié)點隊列中的隊首元素被取出作為當(dāng)前擴展結(jié)點,由于隊列中每一層結(jié)點之后都有一個尾部標(biāo)記-1,故在取隊首元素時,活結(jié)點隊列一定不空。當(dāng)取出的元素是-1時,再判斷當(dāng)前隊列是否為空。如果隊列非空,則將尾部標(biāo)記-1加入活結(jié)點隊列,算法開始處理下一層的活結(jié)點。2023年2月6日38隊列式分支限界法while(true){//檢查左兒子結(jié)點
if(Ew+w[i]<=c)//x[i]=1EnQueue(Q,Ew+w[i],bestw,i,n);//右兒子結(jié)點總是可行的
EnQueue(Q,Ew,bestw,i,n);//x[i]=0Q.Delete(Ew);//取下一擴展結(jié)點
if(Ew==-1){//同層結(jié)點尾部
if(Q.IsEmpty())returnbestw;Q.Add(-1);//同層結(jié)點尾部標(biāo)志
Q.Delete(Ew);//取下一擴展結(jié)點
i++;}//進入下一層
}}2023年2月6日393.3算法的改進
節(jié)點的左子樹表示將此集裝箱裝上船,右子樹表示不將此集裝箱裝上船。設(shè)bestw是當(dāng)前最優(yōu)解;ew是當(dāng)前擴展結(jié)點所相應(yīng)的重量;r是剩余集裝箱的重量。則當(dāng)ew+rbestw時,可將其右子樹剪去。算法MaxLoading初始時將bestw置為0,直到搜索到第一個葉結(jié)點時才更新bestw。因此在算法搜索到第一個葉結(jié)點之前,總有bestw=0,r>0,故Ew十r>bestw總是成立。也就是說,此時右子樹測試不起作用。另外,為了確保右子樹成功剪枝,應(yīng)該在算法每一次進入左子樹的時候更新bestw的值。2023年2月6日40算法的改進
//檢查左兒子結(jié)點
Typewt=Ew+w[i];//左兒子結(jié)點的重量
if(wt<=c){//可行結(jié)點
if(wt>bestw)bestw=wt;
//加入活結(jié)點隊列
if(i<n)Q.Add(wt);}提前更新bestw//檢查右兒子結(jié)點
if(Ew+r>bestw&&i<n)Q.Add(Ew);//可能含最優(yōu)解
Q.Delete(Ew);//取下一擴展結(jié)點右兒子剪枝2023年2月6日41算法的改進while(true){//檢查左兒子結(jié)點
Typewt=Ew+w[i];//左兒子結(jié)點的重量
if(wt<=c){//可行結(jié)點
if(wt>bestw)bestw=wt;//加入活結(jié)點隊列
if(i<n)Q.Add(wt);}//檢查右兒子結(jié)點
if(Ew+r>bestw&&i<n)Q.Add(Ew);//可能含最優(yōu)解
Q.Delete(Ew);//取下一擴展結(jié)點
if(Ew==-1){//同層結(jié)點尾部
if(Q.IsEmpty())returnbestw;Q.Add(-1);//同層結(jié)點尾部標(biāo)志
Q.Delete(Ew);//取下一擴展結(jié)點
i++;//進入下一層
r-=w[i];
}}}2023年2月6日423.4構(gòu)造最優(yōu)解classQNode{QNode*parent;//指向父結(jié)點的指針
boolLChild;//左兒子標(biāo)志
Typeweight;//結(jié)點所相應(yīng)的載重量}
為了在算法結(jié)束后能方便地構(gòu)造出與最優(yōu)值相應(yīng)的最優(yōu)解,算法必須存儲相應(yīng)子集樹中從活結(jié)點到根結(jié)點的路徑。為此目的,可在每個結(jié)點處設(shè)置指向其父結(jié)點的指針,并設(shè)置左、右兒子標(biāo)志。2023年2月6日43//構(gòu)造當(dāng)前最優(yōu)解for(intj=n-1;j>0;j--){bestx[j]=bestE->LChild;bestE=bestE->parent;}
找到最優(yōu)值后,可以根據(jù)parent回溯到根結(jié)點,找到最優(yōu)解。構(gòu)造最優(yōu)解2023年2月6日443.5優(yōu)先隊列式分支限界法解裝載問題的優(yōu)先隊列式分支限界法用最大優(yōu)先隊列存儲活結(jié)點表?;罱Y(jié)點x在優(yōu)先隊列中的優(yōu)先級定義為從根結(jié)點到結(jié)點x的路徑所相應(yīng)的載重量再加上剩余集裝箱的重量之和。優(yōu)先隊列中優(yōu)先級最大的活結(jié)點成為下一個擴展結(jié)點。以結(jié)點x為根的子樹中所有結(jié)點相應(yīng)的路徑的載重量不超過它的優(yōu)先級。子集樹中葉結(jié)點所相應(yīng)的載重量與其優(yōu)先級相同。在優(yōu)先隊列式分支限界法中,一旦有一個葉結(jié)點成為當(dāng)前擴展結(jié)點,則可以斷言該葉結(jié)點所相應(yīng)的解即為最優(yōu)解。此時可終止算法。2023年2月6日45上述策略可以用兩種不同的方式實現(xiàn)。第一種方式在結(jié)點優(yōu)先隊列的每一個活結(jié)點中保存從解空間樹的根結(jié)點到該活結(jié)點的路徑,在算法確定了達到最優(yōu)值的葉結(jié)點時,就在該葉結(jié)點處同時得到相應(yīng)的最優(yōu)解。第二種策略在算法的搜索進程中保存當(dāng)前已構(gòu)造出的部分解空間樹,這樣在算法確定了達到最優(yōu)值的葉結(jié)點時,就可以在解空間樹中從該葉結(jié)點開始向根結(jié)點回溯,構(gòu)造出相應(yīng)的最優(yōu)解。在下面的算法中,我們采用第二種策略。2023年2月6日46第i十1層結(jié)點的剩余重量r[i]定義為r[i]=。變量E指向子集樹中當(dāng)前擴展結(jié)點,Ew是相應(yīng)的重量。算法開始時,i=1,Ew=0,子集樹的根結(jié)點是擴展結(jié)點。//定義剩余重量數(shù)組r
int*r=(int*)malloc(sizeof(int)*(n+1));
r[n]=0;
for(intj=n-1;j>0;j--)
r[j]=r[j+1]+w[j+1];
2023年2月6日47intMaxLoading(intw[],intc,intn)
{//優(yōu)先隊列式分支限界法,返回最優(yōu)載重量,bestx返回最優(yōu)解
//定義最大堆的容量為1000
//
MaxHeap<HeapNode<Type>>H(1000);
head=(HeapNode*)malloc(sizeof(HeapNode));
if(head==NULL)
{printf("沒有足夠的空間分配\n");
return1;}
head->level=0;head->next=NULL;
head->ptr=NULL;head->uweight=0;
//定義剩余重量數(shù)組r
int*r=(int*)malloc(sizeof(int)*(n+1));
r[n]=0;
for(intj=n-1;j>0;j--)
r[j]=r[j+1]+w[j+1];
//初始化
inti=1;//當(dāng)前擴展結(jié)點所處的層
bbnode*E=0;//當(dāng)前擴展結(jié)點
intEw=0;//擴展結(jié)點所相應(yīng)的載重量2023年2月6日48優(yōu)先隊列式分支限界法While循環(huán)體產(chǎn)生當(dāng)前擴展結(jié)點的左右兒子結(jié)點。如果當(dāng)前擴展結(jié)點的左兒子結(jié)點是可行結(jié)點,即它所相應(yīng)的重量末超過船載容量,則將它加入到子集樹的第i十1層上,并插入最大堆。擴展結(jié)點的右兒子結(jié)點總是可行的,故直接插入子集樹的最大堆中。接著算法從最大堆中取出最大元素作為下一個擴展結(jié)點。如果此時不存在下一個擴展結(jié)點,則相應(yīng)的問題無可行解。如果下一個擴展結(jié)點是一個葉結(jié)點,即子集樹中第n十1層結(jié)點,則它相應(yīng)的可行解為最優(yōu)解。該最優(yōu)解所相應(yīng)的路徑可由子集樹中從該葉結(jié)點開始沿結(jié)點父指針逐步構(gòu)造出來。具體算法可描述如下:2023年2月6日49while(i!=n+1){//非葉結(jié)點
//檢查當(dāng)前擴展結(jié)點的兒子結(jié)點
if(Ew+w[i]<=c){//左兒子結(jié)點為可行結(jié)點
AddLiveNode(E,Ew+w[i]+r[i],true,i+1);
}
AddLiveNode(E,Ew+r[i],false,i+1);//右兒子結(jié)點
HeapNode*N;//取下一擴展結(jié)點
DeleteMax(N);//非空
i=N->level;
E=N->ptr;
Ew=N->uweight-r[i-1];
//優(yōu)先權(quán)uweight=Ew+r[i-1];
}
2023年2月6日50for(j=n;j>0;j--){//構(gòu)造當(dāng)前最優(yōu)解
{bestx[j]=E->LChild;
E=E->parent;
}returnEw;
}構(gòu)造當(dāng)前最優(yōu)解2023年2月6日512023年2月6日52提綱一、分支限界法的基本思想二、單源最短路徑問題三、裝載問題四、0-1背包問題五、最大團問題六、旅行售貨員問題2023年2月6日534.1問題定義給定n種物品和一個背包,物品i的重量是wi,價值pi,背包容量為C,問如何選擇裝入背包的物品,使裝入背包中的物品的總價值最大?對于每種物品只能選擇完全裝入或不裝入,一個物品至多裝入一次。2023年2月6日544.2算法思想首先,要對輸入數(shù)據(jù)進行預(yù)處理,將各物品依其單位重量價值從大到小進行排列。在優(yōu)先隊列分支限界法中,節(jié)點的優(yōu)先級由已裝入背包的物品價值加上剩下的最大單位重量價值的物品裝滿剩余容量的價值和。算法首先檢查當(dāng)前擴展結(jié)點的左兒子結(jié)點的可行性。如果該左兒子結(jié)點是可行結(jié)點,則將它加入到子集樹和活結(jié)點優(yōu)先隊列中。當(dāng)前擴展結(jié)點的右兒子結(jié)點一定是可行結(jié)點,僅當(dāng)右兒子結(jié)點滿足上界約束時才將它加入子集樹和活結(jié)點優(yōu)先隊列。當(dāng)擴展到葉節(jié)點時即為問題的最優(yōu)值。2023年2月6日554.3上界函數(shù)template<classTypew,classTypep>TypepKnap<Typew,Typep>::Bound(inti){//計算結(jié)點所相應(yīng)價值的上界
Typewcleft=c-cw;//剩余容量
Typepb=cp;//價值上界
//以物品單位重量價值遞減序裝滿剩余背包容量
while(i<=n&&w[i]<=cleft){cleft-=w[i];b+=p[i];i++;}//裝填剩余容量至裝滿背包
if(i<=n)b+=p[i]/w[i]*cleft;returnb;}2023年2月6日564.4算法描述while(i!=n+1){//非葉結(jié)點
//檢查當(dāng)前擴展結(jié)點的左兒子結(jié)點
Typewwt=cw+w[i];if(wt<=c){//左兒子結(jié)點為可行結(jié)點
if(cp+p[i]>bestp)bestp=cp+p[i];AddLiveNode(up,cp+p[i],cw+w[i],true,i+1);}up=Bound(i+1);//檢查當(dāng)前擴展結(jié)點的右兒子結(jié)點
if(up>=bestp)//右子樹可能含最優(yōu)解
AddLiveNode(up,cp,cw,false,i+1);//取下一個擴展節(jié)點(略)}分支限界搜索過程2023年2月6日57提綱一、分支限界法的基本思想二、單源最短路徑問題三、裝載問題四、0-1背包問題五、最大團問題六、旅行售貨員問題2023年2月6日585.1問題定義給定無向圖G=(V,E)。如果UV,且對任意u,vU有(u,v)E,則稱U是G的完全子圖。G的完全子圖U是G的團當(dāng)且僅當(dāng)U不包含在G的更大的完全子圖中。G的最大團是指G中所含頂點數(shù)最多的團。下圖G中,子集{1,2}是G的大小為2的完全子圖。這個完全子圖不是團,因為它被G的更大的完全子圖{1,2,5}包含。{1,2,5}是G的最大團。{1,4,5}和{2,3,5}也是G的最大團。2023年2月6日595.2算法思想
子集樹的根結(jié)點是初始擴展結(jié)點,對于這個特殊的擴展結(jié)點,其cliqueSize的值為0。
算法在擴展內(nèi)部結(jié)點時,首先考察其左兒子結(jié)點。在左兒子結(jié)點處,將頂點i加入到當(dāng)前團中,并檢查該頂點與當(dāng)前團中其它頂點之間是否有邊相連。當(dāng)頂點i與當(dāng)前團中所有頂點之間都有邊相連,則相應(yīng)的左兒子結(jié)點是可行結(jié)點,將它加入到子集樹中并插入活結(jié)點優(yōu)先隊列,否則就不是可行結(jié)點。
接著繼續(xù)考察當(dāng)前擴展結(jié)點的右兒子結(jié)點。當(dāng)右兒子結(jié)點滿足上界函數(shù)(upperSize>bestn)時,右子樹中可能含有最優(yōu)解,此時將右兒子結(jié)點加入到子集樹中并插入到活結(jié)點優(yōu)先隊列中。2023年2月6日605.3上界函數(shù)用變量cliqueSize表示與該結(jié)點相應(yīng)的團的頂點數(shù);level表示結(jié)點在子集空間樹中所處的層次;用cliqueSize+n-level+1作為頂點數(shù)上界upperSize的值。在此優(yōu)先隊列式分支限界法中,upperSize實際上也是優(yōu)先隊列中元素的優(yōu)先級。算法總是從活結(jié)點優(yōu)先隊列中抽取具有最大upperSize值的元素作為下一個擴展元素。2023年2月6日615.4算法描述具體算法略(見課本)。
算法的while循環(huán)的終止條件是遇到子集樹中的一個葉結(jié)點(即n+1層結(jié)點)成為當(dāng)前擴展結(jié)點。對于子集樹中的葉結(jié)點,有upperSize=cliqueSize。此時活結(jié)點優(yōu)先隊列中剩余結(jié)點的upperSize值均不超過當(dāng)前擴展結(jié)點的upperSize值,從而進一步搜索不可能得到更大的團,此時算法已找到一個最優(yōu)解。2023年2月6日62提綱一、分支限界法的基本思想二、單源最短路徑問題三、裝載問題四、0-1背包問題五、最大團問題六、旅行售貨員問題2023年2月6日636.1問題定義某售貨員要到若干城市去推銷商品,已知各城市之間的路程(或旅費)。他要選定一條從駐地出發(fā),經(jīng)過每個城市一次,最后回到駐地的路線,使總的路程(或總旅費)最小。路線是一個帶權(quán)圖。圖中各邊的費用(權(quán))為正數(shù)。圖的一條周游路線是包括V中的每個頂點在內(nèi)的一條回路。周游路線的費用是這條路線上所有邊的費用之和。旅行售貨員問題的解空間可以組織成一棵樹,從樹的根結(jié)點到任一葉結(jié)點的路徑定義了圖的一條周游路線。旅行售貨員問題要在圖G中找出費用最小的周游路線。2023年2月6日646.2算法思想算法開始時創(chuàng)建一個最小堆,用于表示活結(jié)點優(yōu)先隊列。堆中每個結(jié)點的子樹費用的下界lcost值是優(yōu)先隊列的優(yōu)先級。接著算法計算出圖中每個頂點的最小費用出邊并用minout記錄。如果所給的有向圖中某個頂點沒有出邊,則該圖不可能有回路,算法即告結(jié)束。如果每個頂點都有出邊,則根據(jù)計算出的minout作算法初始化。算法的while循環(huán)體完成對排列樹內(nèi)部結(jié)點的擴展。對于當(dāng)前擴展結(jié)點,算法分2種情況進行處理:2023年2月6日656.2算法思想1、首先考慮s=n-2的情形,此時當(dāng)前擴展結(jié)點是排列樹中某個葉結(jié)點的父結(jié)點。如果該葉結(jié)點相應(yīng)一條可行回路且費用小于當(dāng)前最小費用,則將該葉結(jié)點插入到優(yōu)先隊列中,否則舍去該葉結(jié)點。2、當(dāng)s<n-2時,算法依次產(chǎn)生當(dāng)前擴展結(jié)點的所有兒子結(jié)點。由于當(dāng)前擴展結(jié)點所相應(yīng)的路徑是x[0:s],其可行兒子結(jié)點是從剩余頂點x[s+1:n-1]中選取的頂點x[i],且(x[s],x[i])是所給有向圖G中的一條邊。對于當(dāng)前擴展結(jié)點的每一個可行兒子結(jié)點,計算出其前綴(x[0:s],x[i])的費用cc和相應(yīng)的下界lcost。當(dāng)lcost<bestc時,將這個可行兒子結(jié)點插入到活結(jié)點優(yōu)先隊列中。2023年2月6日666.2算法思想算法中while循環(huán)的終止條件是排列樹的一個葉結(jié)點成為當(dāng)前擴展結(jié)點。當(dāng)s=n-1時,已找到的回路前綴是x[0:n-1],它已包含圖G的所有n個頂點。因此,當(dāng)s=n-1時,相應(yīng)的擴展結(jié)點表示一個葉結(jié)點。此時該葉結(jié)點所相應(yīng)的回路的費用等于cc和lcost的值。剩余的活結(jié)點的lcost值不小于已找到的回路的費用。它們都不可能導(dǎo)致費用更小的回路。因此已找到的葉結(jié)點所相應(yīng)的回路是一個最小費用旅行售貨員回路,算法可以結(jié)束。算法結(jié)束時返回找到的最小費用,相應(yīng)的最優(yōu)解由數(shù)組v給出。2023年2月6日676.3算法描述2023年2月6日682023年2月6日692023年2月6日702023年2月6日712023年2月6日72
算法中while循環(huán)的終止條件是排列樹的一個葉結(jié)點成為當(dāng)前擴展結(jié)點。當(dāng)s=n—1時,已找到的回路前綴是x[0:n—1],它已包含圖G的所有n個頂點。因此,當(dāng)s=n—1時,相應(yīng)的擴展結(jié)點表示一個葉結(jié)點。此時該葉結(jié)點所相應(yīng)的回路的費用等于cc和lcost的值。剩余的活結(jié)點的1cost值不小于己找到的回路的費用。它們都不可能導(dǎo)致費用更小的回路。因此已找到的葉結(jié)點所相應(yīng)的回路是一個最小費用旅行售貨員回路,算法可以結(jié)束.2023年2月6日73
算法的while循環(huán)體完成對排列樹內(nèi)部結(jié)點的擴展。對于當(dāng)前擴展結(jié)點,算法分兩種情況進行處理。首先;考慮s=n—2的情形。此時當(dāng)前擴展結(jié)點是排列樹中某個葉結(jié)點的父結(jié)點。如果該葉結(jié)點相應(yīng)一條可行回路且費用小于當(dāng)前最小費用,則將該葉結(jié)點插入到優(yōu)先隊列中,否則舍去該葉結(jié)點。當(dāng)s<n-2時,算法依次產(chǎn)生當(dāng)前擴展結(jié)點的所有兒子結(jié)點。由于當(dāng)前擴展結(jié)點所相應(yīng)的路徑是x[0:s],其可行兒子結(jié)。點是從剩余頂點x[s+1:n-1]中選取的頂點xIj],且(x[s],x[i])是所給有向圖G中的一條邊。對于當(dāng)前擴展結(jié)點的每一個可行兒子結(jié)點,計算出其前綴(x[0:s],x[i])的費用cc和相應(yīng)的下界Lcost。當(dāng)lcost<bestc時,將這個可·行兒子結(jié)點插入到活結(jié)點優(yōu)先隊列中。2023年2月6日74試寫出0/1背包問題的優(yōu)先隊列式分枝限界算法程序,并找一個物品件數(shù)為16的例子檢驗程序的運行情況。上機2023年2月6日75回溯法與分支限界法的用法取向探討
1.基本思想分析回溯法的基本思想:首先確定解空間的組織結(jié)構(gòu),接著就從開始結(jié)點(根結(jié)點)出發(fā),以深度優(yōu)先的方式搜索整個解空間。這個開始結(jié)點就成為一個活結(jié)點,同時也成為當(dāng)前的擴展結(jié)點。在當(dāng)前的擴展結(jié)點處,搜索向縱深方向移至一個新結(jié)點。這個新結(jié)點就成為一個新的活結(jié)點,并成為當(dāng)前擴展結(jié)點。如果在當(dāng)前的擴展結(jié)點處不能再向縱深方向移動,則當(dāng)前擴展結(jié)點就成為死結(jié)點。換句話說,這個結(jié)點不再是一個活結(jié)點。此時,應(yīng)往回移動(回溯)至最近的一個活結(jié)點處,并使這個活結(jié)點成為當(dāng)前的擴展結(jié)點?;厮莘匆赃@種工作方式遞歸地在解空間中搜索,直至找到所要求的解或解空間中已沒有活結(jié)點時為止。2023年2月6日76分支限界法的基本思想:確定解空間的組織結(jié)構(gòu),以廣度優(yōu)先或以最小耗費(最大效益)優(yōu)先的方式搜索問題的解空間樹。在搜索問題的解空間樹時,分支限界法與回溯法對當(dāng)前擴展結(jié)點所使用的擴展方式不同。在分支限界法中,每一個活結(jié)點只有一次機會成為擴展結(jié)點?;罱Y(jié)點一旦成為擴展結(jié)點,就一次性產(chǎn)生其所有兒子結(jié)點。在這些兒子結(jié)點中,那些導(dǎo)致不可行解或?qū)е路亲顑?yōu)解的兒子結(jié)點被舍棄,其余兒子結(jié)點被子加入活結(jié)點表中。此后,從活結(jié)點表中取下一結(jié)點成為當(dāng)前擴展結(jié)點,并重復(fù)上述結(jié)點擴展過程。這個過程一直持續(xù)到找到所求的解或活結(jié)點表為空時為止。2023年2月6日77用法比較分支限界法類似于回溯法,也是一種在問題的解空間樹T上搜索問題解的算法。但在一般情況下,分支限界法與回溯法的求解目標(biāo)不同?;厮莘ǖ那蠼饽繕?biāo)是找出T中滿足約束條件的所有解,而分支限界法的求解目標(biāo)則是找出滿足約束條件的一個解,或是在滿足約束條件的解中找出使某一目標(biāo)函數(shù)值達到極大或極小的解,即在某種意義下的最優(yōu)解。2023年2月6日78由于求解目標(biāo)不同,導(dǎo)致分支限界法與回溯法在解空間樹T上的搜索方式也不相同?;厮莘ㄒ陨疃葍?yōu)先的方式搜索解空間樹T,而分支限界法則以廣度優(yōu)先或以最小耗費優(yōu)先的方式搜索解空間樹T。分支限界法的搜索策略是:在擴展結(jié)點處,先生成其所有的兒子結(jié)點(分支),然后再從當(dāng)前的活結(jié)點表中選擇下一個擴展對點。為了有效地選擇下一擴展結(jié)點,以加速搜索的進程,在每一活結(jié)點處,計算一個函數(shù)值(限界
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三農(nóng)村義務(wù)教育實施方案
- 珠寶鑒定與評估技術(shù)作業(yè)指導(dǎo)書
- 居民采暖供用熱合同
- 信息安全防護技術(shù)作業(yè)指導(dǎo)書
- 2025年毫州考貨運資格證考試內(nèi)容
- 2025年延安道路運輸從業(yè)資格證考試
- 2025年銀川貨車從業(yè)資格證考試試題
- 2025年襄陽道路客貨運輸從業(yè)資格證模擬考試下載
- 電力資源整合合同(2篇)
- 電力公司勞動合同范本(2篇)
- 復(fù)旦中華傳統(tǒng)體育課程講義05木蘭拳基本技術(shù)
- GB/T 13234-2018用能單位節(jié)能量計算方法
- (課件)肝性腦病
- 北師大版五年級上冊數(shù)學(xué)教學(xué)課件第5課時 人民幣兌換
- 工程回訪記錄單
- 住房公積金投訴申請書
- 高考物理二輪專題課件:“配速法”解決擺線問題
- 檢驗科生物安全風(fēng)險評估報告
- 京頤得移動門診產(chǎn)品輸液
- 如何做一名合格的帶教老師PPT精選文檔
- ISO9001-14001-2015內(nèi)部審核檢查表
評論
0/150
提交評論