第6章 分支限界法_第1頁
第6章 分支限界法_第2頁
第6章 分支限界法_第3頁
第6章 分支限界法_第4頁
第6章 分支限界法_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

計算機算法設計與分析

DesignandAnalysisofComputerAlgorithms

第六章分支限界法Branch-and-BoundAlgorithm王紅霞理學院2023年2月6日2理解分支限界法的剪枝搜索策略。掌握分支限界法的算法框架隊列式(FIFO)分支限界法優(yōu)先隊列式分支限界法通過應用范例學習分支限界法的設計策略。單源最短路徑問題裝載問題;布線問題0-1背包問題;最大團問題;旅行售貨員問題電路板排列問題批處理作業(yè)調度問題學習要點2023年2月6日3提綱一、分支限界法的基本思想二、單源最短路徑問題三、裝載問題四、0-1背包問題五、最大團問題六、旅行售貨員問題2023年2月6日4提綱一、分支限界法的基本思想二、單源最短路徑問題三、裝載問題四、0-1背包問題五、最大團問題六、旅行售貨員問題2023年2月6日5分支限界法同回溯法類似,它也是在解空間中搜索問題的可行解或最優(yōu)解,但搜索的方式不同?;厮莘ú捎蒙疃葍?yōu)先的方式,朝縱深方向搜索,直至達到問題的一個可行解,或經(jīng)判斷沿此路徑不會達到問題的可行解或最優(yōu)解時,停止向前搜索,并沿原路返回到該路徑上最后一個還可擴展的結點。從該結點出發(fā)朝新的方向縱深搜索。分支定界法則采用寬度優(yōu)先的方式搜索解空間樹,它將活結點存放在一個特殊的表中。其策略是:在擴展結點處,先生成其所有的兒子結點,將那些導致不可行解或導致非最優(yōu)解的兒子舍棄,其余兒子加入活結點表中。此后,從活結點表中取出一個結點作為當前擴展結點。并重復上述結點擴展過程。所以,分支限界法與回溯法的本質區(qū)別在于搜索方式的不同?;厮莘ǜm于處理那些求所有可行解的問題,而分支限界法更適于處理那些只確定一個可行解,特別是最優(yōu)化問題。6在算法空間上比較回溯法和分支限界法(1)回溯法占用內存:O(解空間的最大路徑長度)對子集問題,需要O(n)的內存空間對排列問題,需要O(n)的內存空間(2)分支限界法占用內存:O(解空間大小)對子集問題,需要O(2n)的內存空間對排列問題,需要O(n!)的內存空間2023年2月6日71.1分支限界法與回溯法的比較分支限界法類似于回溯法,也是一種在問題的解空間樹T中搜索問題解的算法。空間消耗不同求解目標(適用范圍)不同:回溯法適用于找出滿足約束條件的所有解的情況;分支限界法發(fā)誓找出滿足條件的一個解,或某種意義下的最優(yōu)解。搜索方式不同回溯法:深度優(yōu)先分支限界法:廣度優(yōu)先2023年2月6日81.2分支限界法的基本思想分支限界法常以廣度優(yōu)先或以最小耗費(最大效益)優(yōu)先的方式搜索問題的解空間樹。在分支限界法中,每一個活結點只有一次機會成為擴展結點?;罱Y點一旦成為擴展結點,就一次性產生其所有兒子結點。在這些兒子結點中,導致不可行解或導致非最優(yōu)解的兒子結點被舍棄,其余兒子結點被加入活結點表中。此后,從活結點表中取下一結點成為當前擴展結點,并重復上述結點擴展過程。這個過程一直持續(xù)到找到所需的解或活結點表為空時為止。2023年2月6日91.3常見的兩種分支限界法從活結點表中選擇下一擴展結點的不同方式導致不同的分支限界法:隊列式(FIFO)分支限界法:將活結點表組織成一個隊列,按照隊列先進先出(FIFO)原則選取下一個節(jié)點為擴展節(jié)點。優(yōu)先隊列式分支限界法:將活結點表組織成一個優(yōu)先隊列,按照優(yōu)先隊列中規(guī)定的優(yōu)先級選取優(yōu)先級最高的節(jié)點成為當前擴展節(jié)點。最大優(yōu)先隊列:使用最大堆,體現(xiàn)最大效益優(yōu)先最小優(yōu)先隊列:使用最小堆,體現(xiàn)最小費用優(yōu)先2023年2月6日10

隊列式分支限界法的搜索解空間樹的方式類似于解空間樹的寬度優(yōu)先搜索,不同的是隊列式分支限界法不搜索以不可行結點(已經(jīng)被判定不能導致可行解或不能導致最優(yōu)解的結點)為根的子樹。這是因為,按照規(guī)則,這樣的結點未被列入活結點表。2023年2月6日11優(yōu)先隊列式分支限界法的搜索方式是根據(jù)活結點的優(yōu)先級確定下一個擴展結點。結點的優(yōu)先級常用一個與該結點有關的數(shù)值p來表示。最大優(yōu)先隊列規(guī)定p值較大的結點點的優(yōu)先級較高。在算法實現(xiàn)時通常用一個最大堆來實現(xiàn)最大優(yōu)先隊列,用最大堆的Deletemax運算抽取堆中的下一個結點作為當前擴展結點,體現(xiàn)最大效益優(yōu)先的原則。類似地,最小優(yōu)先隊列規(guī)定p值較小的結點的優(yōu)先級較高。在算法實現(xiàn)時,常用一個最小堆來實現(xiàn),用最小堆的Deletemin運算抽取堆中下一個結點作為當前擴展結點,體現(xiàn)最小優(yōu)先的原則。2023年2月6日12

采用優(yōu)先隊列式分支定界算法解決具體問題時,應根據(jù)問題的特點選用最大優(yōu)先或最小優(yōu)先隊列,確定各個結點的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活結點隊列:{}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活結點隊列:{}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)不搜索以不可行結點為根的子樹優(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隊列:活結點隊列:{}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)先隊列:活結點隊列:{}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應用分支限界法的關鍵如何確定合適的限界函數(shù)?如何組織活結點表?如何確定最優(yōu)解中的各個分量?好的限界函數(shù)不僅計算簡單,還要保證最優(yōu)解在搜索空間中,更重要的是能在搜索的早期對超出目標函數(shù)界的結點進行丟棄,減少搜索空間,從而盡快找到問題的最優(yōu)解。

通常采用最大堆或最小堆來實現(xiàn)優(yōu)先隊列式分支限界法求解問題。

可以用如下方法求得最優(yōu)解中的分量:1)對每個擴展結點保存該結點到根結點的路徑;2)在搜索過程中構建搜索經(jīng)過的樹結構,在求得最優(yōu)解時,從葉子結點不斷回溯到根結點,以確定最優(yōu)解中的各個分量。

2023年2月6日22提綱一、分支限界法的基本思想二、單源最短路徑問題三、裝載問題四、0-1背包問題五、最大團問題六、旅行售貨員問題2023年2月6日232.1單源最短路徑問題定義在有向圖G中,每一邊都有一個非負邊權。求圖G的從源頂點s到目標頂點t之間的最短路徑。2023年2月6日24用優(yōu)先隊列式分支限界法解有向圖G的單源最短路徑問題產生的解空間樹。其中,每一個結點旁邊的數(shù)字表示該結點所對應的當前路長。有向圖G的單源最短路徑問題產生的解空間樹2023年2月6日252.2單源最短路徑問題算法思想用一最小堆來存儲活結點表。其優(yōu)先級是結點所對應的當前路長。算法從圖G的源頂點s和空優(yōu)先隊列開始。結點s被擴展后,它的兒子結點被依次插入堆中。此后,算法從堆中取出具有最小當前路長的結點作為當前擴展結點,并依次檢查與當前擴展結點相鄰的所有頂點。如果從當前擴展結點i到頂點j有邊可達,且從源出發(fā),途經(jīng)頂點i再到頂點j的所相應的路徑的長度小于當前最優(yōu)路徑長度,則將該頂點作為活結點插入到活結點優(yōu)先隊列中。這個結點的擴展過程一直繼續(xù)到活結點優(yōu)先隊列為空時為止。2023年2月6日262.3剪枝策略在算法擴展結點的過程中,一旦發(fā)現(xiàn)一個結點的下界(即結點所對應的當前路長)不小于當前找到的最短路長,則算法剪去以該結點為根的子樹。在算法中,還可以利用結點間的控制關系進行剪枝。從源頂點s出發(fā),2條不同路徑到達圖G的同一頂點。由于兩條路徑的路長不同,因此可以將路長長的路徑所對應的樹中的結點為根的子樹剪去。例如,從源點s出發(fā),經(jīng)過邊a,e,q(路長為5)和經(jīng)過邊c,h(路長為6)的2條路徑到達圖G的同一頂點。故可將后一條路徑剪掉。2023年2月6日27剪枝策略

下圖是用優(yōu)先隊列式分支限界法解有向圖G的單源最短路徑問題產生的解空間樹的剪枝情況。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;//加入活結點優(yōu)先隊列

MinHeapNode<Type>N;N.i=j;N.length=dist[j];H.Insert(N);}try{H.DeleteMin(E);}//取下一擴展結點

catch(OutOfBounds){break;}//優(yōu)先隊列空

}}頂點i和j間有邊,且此路徑長小于原先從源點到j的路徑長

2023年2月6日29實例計算從源頂點1到其它頂點間最短路徑2023年2月6日301230V2V0V1V4V33825420510計算從源頂點V0

到其它頂點間最短路徑練習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用于存放活結點表。在隊列Q的元素值表示每個活結點所相應的當前載重量。當其值為—1時,表示隊列已到達解空間樹同一層結點的尾部。3.2隊列式分支限界法2023年2月6日34

函數(shù)EnQueue用于將活結點加入到活結點隊列中。該函數(shù)首先檢查i是否等于n。如果i=n,則表示當前活結點為一個葉結點。由于葉結點不會被進一步擴展,因此不必加入到活結點隊列中。此時只要檢查該葉結點表示的可行解是否優(yōu)于當前最優(yōu)解,并適時更新當前最優(yōu)解。當i<n時,當前活結點是一個內部結點,應加入到活結點隊列中。2023年2月6日35voidEnQueue(&Q,Typewt,Type&bestw,inti,intn)//該函數(shù)負責加入活結點

{//如果不是葉結點,則將結點權值wt加入隊列Q

if(i==n)

{//可行葉子結點

if(wt>bestw)

bestw=wt;

}

else

Q.Add(wt);//不是葉子

}2023年2月6日36函數(shù)MaxLoading在開始時將i初始化為1,bestw初始化為0。此時活結點隊列為空。將同層結點尾部標志—1加入到活結點隊列中,表示此時位于第1層結點的尾部。Ew存儲當前擴展結點所相應的重量。2023年2月6日37隊列式分支限界法在算法的while循環(huán)中,首先檢測當前擴展結點的左兒子結點是否為可行結點。如果是則將其加入到活結點隊列中。然后將其右兒子結點加入到活結點隊列中(右兒子結點一定是可行結點)。2個兒子結點都產生后,當前擴展結點被舍棄。活結點隊列中的隊首元素被取出作為當前擴展結點,由于隊列中每一層結點之后都有一個尾部標記-1,故在取隊首元素時,活結點隊列一定不空。當取出的元素是-1時,再判斷當前隊列是否為空。如果隊列非空,則將尾部標記-1加入活結點隊列,算法開始處理下一層的活結點。2023年2月6日38隊列式分支限界法while(true){//檢查左兒子結點

if(Ew+w[i]<=c)//x[i]=1EnQueue(Q,Ew+w[i],bestw,i,n);//右兒子結點總是可行的

EnQueue(Q,Ew,bestw,i,n);//x[i]=0Q.Delete(Ew);//取下一擴展結點

if(Ew==-1){//同層結點尾部

if(Q.IsEmpty())returnbestw;Q.Add(-1);//同層結點尾部標志

Q.Delete(Ew);//取下一擴展結點

i++;}//進入下一層

}}2023年2月6日393.3算法的改進

節(jié)點的左子樹表示將此集裝箱裝上船,右子樹表示不將此集裝箱裝上船。設bestw是當前最優(yōu)解;ew是當前擴展結點所相應的重量;r是剩余集裝箱的重量。則當ew+rbestw時,可將其右子樹剪去。算法MaxLoading初始時將bestw置為0,直到搜索到第一個葉結點時才更新bestw。因此在算法搜索到第一個葉結點之前,總有bestw=0,r>0,故Ew十r>bestw總是成立。也就是說,此時右子樹測試不起作用。另外,為了確保右子樹成功剪枝,應該在算法每一次進入左子樹的時候更新bestw的值。2023年2月6日40算法的改進

//檢查左兒子結點

Typewt=Ew+w[i];//左兒子結點的重量

if(wt<=c){//可行結點

if(wt>bestw)bestw=wt;

//加入活結點隊列

if(i<n)Q.Add(wt);}提前更新bestw//檢查右兒子結點

if(Ew+r>bestw&&i<n)Q.Add(Ew);//可能含最優(yōu)解

Q.Delete(Ew);//取下一擴展結點右兒子剪枝2023年2月6日41算法的改進while(true){//檢查左兒子結點

Typewt=Ew+w[i];//左兒子結點的重量

if(wt<=c){//可行結點

if(wt>bestw)bestw=wt;//加入活結點隊列

if(i<n)Q.Add(wt);}//檢查右兒子結點

if(Ew+r>bestw&&i<n)Q.Add(Ew);//可能含最優(yōu)解

Q.Delete(Ew);//取下一擴展結點

if(Ew==-1){//同層結點尾部

if(Q.IsEmpty())returnbestw;Q.Add(-1);//同層結點尾部標志

Q.Delete(Ew);//取下一擴展結點

i++;//進入下一層

r-=w[i];

}}}2023年2月6日423.4構造最優(yōu)解classQNode{QNode*parent;//指向父結點的指針

boolLChild;//左兒子標志

Typeweight;//結點所相應的載重量}

為了在算法結束后能方便地構造出與最優(yōu)值相應的最優(yōu)解,算法必須存儲相應子集樹中從活結點到根結點的路徑。為此目的,可在每個結點處設置指向其父結點的指針,并設置左、右兒子標志。2023年2月6日43//構造當前最優(yōu)解for(intj=n-1;j>0;j--){bestx[j]=bestE->LChild;bestE=bestE->parent;}

找到最優(yōu)值后,可以根據(jù)parent回溯到根結點,找到最優(yōu)解。構造最優(yōu)解2023年2月6日443.5優(yōu)先隊列式分支限界法解裝載問題的優(yōu)先隊列式分支限界法用最大優(yōu)先隊列存儲活結點表。活結點x在優(yōu)先隊列中的優(yōu)先級定義為從根結點到結點x的路徑所相應的載重量再加上剩余集裝箱的重量之和。優(yōu)先隊列中優(yōu)先級最大的活結點成為下一個擴展結點。以結點x為根的子樹中所有結點相應的路徑的載重量不超過它的優(yōu)先級。子集樹中葉結點所相應的載重量與其優(yōu)先級相同。在優(yōu)先隊列式分支限界法中,一旦有一個葉結點成為當前擴展結點,則可以斷言該葉結點所相應的解即為最優(yōu)解。此時可終止算法。2023年2月6日45上述策略可以用兩種不同的方式實現(xiàn)。第一種方式在結點優(yōu)先隊列的每一個活結點中保存從解空間樹的根結點到該活結點的路徑,在算法確定了達到最優(yōu)值的葉結點時,就在該葉結點處同時得到相應的最優(yōu)解。第二種策略在算法的搜索進程中保存當前已構造出的部分解空間樹,這樣在算法確定了達到最優(yōu)值的葉結點時,就可以在解空間樹中從該葉結點開始向根結點回溯,構造出相應的最優(yōu)解。在下面的算法中,我們采用第二種策略。2023年2月6日46第i十1層結點的剩余重量r[i]定義為r[i]=。變量E指向子集樹中當前擴展結點,Ew是相應的重量。算法開始時,i=1,Ew=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];

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;//當前擴展結點所處的層

bbnode*E=0;//當前擴展結點

intEw=0;//擴展結點所相應的載重量2023年2月6日48優(yōu)先隊列式分支限界法While循環(huán)體產生當前擴展結點的左右兒子結點。如果當前擴展結點的左兒子結點是可行結點,即它所相應的重量末超過船載容量,則將它加入到子集樹的第i十1層上,并插入最大堆。擴展結點的右兒子結點總是可行的,故直接插入子集樹的最大堆中。接著算法從最大堆中取出最大元素作為下一個擴展結點。如果此時不存在下一個擴展結點,則相應的問題無可行解。如果下一個擴展結點是一個葉結點,即子集樹中第n十1層結點,則它相應的可行解為最優(yōu)解。該最優(yōu)解所相應的路徑可由子集樹中從該葉結點開始沿結點父指針逐步構造出來。具體算法可描述如下:2023年2月6日49while(i!=n+1){//非葉結點

//檢查當前擴展結點的兒子結點

if(Ew+w[i]<=c){//左兒子結點為可行結點

AddLiveNode(E,Ew+w[i]+r[i],true,i+1);

}

AddLiveNode(E,Ew+r[i],false,i+1);//右兒子結點

HeapNode*N;//取下一擴展結點

DeleteMax(N);//非空

i=N->level;

E=N->ptr;

Ew=N->uweight-r[i-1];

//優(yōu)先權uweight=Ew+r[i-1];

}

2023年2月6日50for(j=n;j>0;j--){//構造當前最優(yōu)解

{bestx[j]=E->LChild;

E=E->parent;

}returnEw;

}構造當前最優(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ōu)先隊列分支限界法中,節(jié)點的優(yōu)先級由已裝入背包的物品價值加上剩下的最大單位重量價值的物品裝滿剩余容量的價值和。算法首先檢查當前擴展結點的左兒子結點的可行性。如果該左兒子結點是可行結點,則將它加入到子集樹和活結點優(yōu)先隊列中。當前擴展結點的右兒子結點一定是可行結點,僅當右兒子結點滿足上界約束時才將它加入子集樹和活結點優(yōu)先隊列。當擴展到葉節(jié)點時即為問題的最優(yōu)值。2023年2月6日554.3上界函數(shù)template<classTypew,classTypep>TypepKnap<Typew,Typep>::Bound(inti){//計算結點所相應價值的上界

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){//非葉結點

//檢查當前擴展結點的左兒子結點

Typewwt=cw+w[i];if(wt<=c){//左兒子結點為可行結點

if(cp+p[i]>bestp)bestp=cp+p[i];AddLiveNode(up,cp+p[i],cw+w[i],true,i+1);}up=Bound(i+1);//檢查當前擴展結點的右兒子結點

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的團當且僅當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算法思想

子集樹的根結點是初始擴展結點,對于這個特殊的擴展結點,其cliqueSize的值為0。

算法在擴展內部結點時,首先考察其左兒子結點。在左兒子結點處,將頂點i加入到當前團中,并檢查該頂點與當前團中其它頂點之間是否有邊相連。當頂點i與當前團中所有頂點之間都有邊相連,則相應的左兒子結點是可行結點,將它加入到子集樹中并插入活結點優(yōu)先隊列,否則就不是可行結點。

接著繼續(xù)考察當前擴展結點的右兒子結點。當右兒子結點滿足上界函數(shù)(upperSize>bestn)時,右子樹中可能含有最優(yōu)解,此時將右兒子結點加入到子集樹中并插入到活結點優(yōu)先隊列中。2023年2月6日605.3上界函數(shù)用變量cliqueSize表示與該結點相應的團的頂點數(shù);level表示結點在子集空間樹中所處的層次;用cliqueSize+n-level+1作為頂點數(shù)上界upperSize的值。在此優(yōu)先隊列式分支限界法中,upperSize實際上也是優(yōu)先隊列中元素的優(yōu)先級。算法總是從活結點優(yōu)先隊列中抽取具有最大upperSize值的元素作為下一個擴展元素。2023年2月6日615.4算法描述具體算法略(見課本)。

算法的while循環(huán)的終止條件是遇到子集樹中的一個葉結點(即n+1層結點)成為當前擴展結點。對于子集樹中的葉結點,有upperSize=cliqueSize。此時活結點優(yōu)先隊列中剩余結點的upperSize值均不超過當前擴展結點的upperSize值,從而進一步搜索不可能得到更大的團,此時算法已找到一個最優(yōu)解。2023年2月6日62提綱一、分支限界法的基本思想二、單源最短路徑問題三、裝載問題四、0-1背包問題五、最大團問題六、旅行售貨員問題2023年2月6日636.1問題定義某售貨員要到若干城市去推銷商品,已知各城市之間的路程(或旅費)。他要選定一條從駐地出發(fā),經(jīng)過每個城市一次,最后回到駐地的路線,使總的路程(或總旅費)最小。路線是一個帶權圖。圖中各邊的費用(權)為正數(shù)。圖的一條周游路線是包括V中的每個頂點在內的一條回路。周游路線的費用是這條路線上所有邊的費用之和。旅行售貨員問題的解空間可以組織成一棵樹,從樹的根結點到任一葉結點的路徑定義了圖的一條周游路線。旅行售貨員問題要在圖G中找出費用最小的周游路線。2023年2月6日646.2算法思想算法開始時創(chuàng)建一個最小堆,用于表示活結點優(yōu)先隊列。堆中每個結點的子樹費用的下界lcost值是優(yōu)先隊列的優(yōu)先級。接著算法計算出圖中每個頂點的最小費用出邊并用minout記錄。如果所給的有向圖中某個頂點沒有出邊,則該圖不可能有回路,算法即告結束。如果每個頂點都有出邊,則根據(jù)計算出的minout作算法初始化。算法的while循環(huán)體完成對排列樹內部結點的擴展。對于當前擴展結點,算法分2種情況進行處理:2023年2月6日656.2算法思想1、首先考慮s=n-2的情形,此時當前擴展結點是排列樹中某個葉結點的父結點。如果該葉結點相應一條可行回路且費用小于當前最小費用,則將該葉結點插入到優(yōu)先隊列中,否則舍去該葉結點。2、當s<n-2時,算法依次產生當前擴展結點的所有兒子結點。由于當前擴展結點所相應的路徑是x[0:s],其可行兒子結點是從剩余頂點x[s+1:n-1]中選取的頂點x[i],且(x[s],x[i])是所給有向圖G中的一條邊。對于當前擴展結點的每一個可行兒子結點,計算出其前綴(x[0:s],x[i])的費用cc和相應的下界lcost。當lcost<bestc時,將這個可行兒子結點插入到活結點優(yōu)先隊列中。2023年2月6日666.2算法思想算法中while循環(huán)的終止條件是排列樹的一個葉結點成為當前擴展結點。當s=n-1時,已找到的回路前綴是x[0:n-1],它已包含圖G的所有n個頂點。因此,當s=n-1時,相應的擴展結點表示一個葉結點。此時該葉結點所相應的回路的費用等于cc和lcost的值。剩余的活結點的lcost值不小于已找到的回路的費用。它們都不可能導致費用更小的回路。因此已找到的葉結點所相應的回路是一個最小費用旅行售貨員回路,算法可以結束。算法結束時返回找到的最小費用,相應的最優(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)的終止條件是排列樹的一個葉結點成為當前擴展結點。當s=n—1時,已找到的回路前綴是x[0:n—1],它已包含圖G的所有n個頂點。因此,當s=n—1時,相應的擴展結點表示一個葉結點。此時該葉結點所相應的回路的費用等于cc和lcost的值。剩余的活結點的1cost值不小于己找到的回路的費用。它們都不可能導致費用更小的回路。因此已找到的葉結點所相應的回路是一個最小費用旅行售貨員回路,算法可以結束.2023年2月6日73

算法的while循環(huán)體完成對排列樹內部結點的擴展。對于當前擴展結點,算法分兩種情況進行處理。首先;考慮s=n—2的情形。此時當前擴展結點是排列樹中某個葉結點的父結點。如果該葉結點相應一條可行回路且費用小于當前最小費用,則將該葉結點插入到優(yōu)先隊列中,否則舍去該葉結點。當s<n-2時,算法依次產生當前擴展結點的所有兒子結點。由于當前擴展結點所相應的路徑是x[0:s],其可行兒子結。點是從剩余頂點x[s+1:n-1]中選取的頂點xIj],且(x[s],x[i])是所給有向圖G中的一條邊。對于當前擴展結點的每一個可行兒子結點,計算出其前綴(x[0:s],x[i])的費用cc和相應的下界Lcost。當lcost<bestc時,將這個可·行兒子結點插入到活結點優(yōu)先隊列中。2023年2月6日74試寫出0/1背包問題的優(yōu)先隊列式分枝限界算法程序,并找一個物品件數(shù)為16的例子檢驗程序的運行情況。上機2023年2月6日75回溯法與分支限界法的用法取向探討

1.基本思想分析回溯法的基本思想:首先確定解空間的組織結構,接著就從開始結點(根結點)出發(fā),以深度優(yōu)先的方式搜索整個解空間。這個開始結點就成為一個活結點,同時也成為當前的擴展結點。在當前的擴展結點處,搜索向縱深方向移至一個新結點。這個新結點就成為一個新的活結點,并成為當前擴展結點。如果在當前的擴展結點處不能再向縱深方向移動,則當前擴展結點就成為死結點。換句話說,這個結點不再是一個活結點。此時,應往回移動(回溯)至最近的一個活結點處,并使這個活結點成為當前的擴展結點?;厮莘匆赃@種工作方式遞歸地在解空間中搜索,直至找到所要求的解或解空間中已沒有活結點時為止。2023年2月6日76分支限界法的基本思想:確定解空間的組織結構,以廣度優(yōu)先或以最小耗費(最大效益)優(yōu)先的方式搜索問題的解空間樹。在搜索問題的解空間樹時,分支限界法與回溯法對當前擴展結點所使用的擴展方式不同。在分支限界法中,每一個活結點只有一次機會成為擴展結點?;罱Y點一旦成為擴展結點,就一次性產生其所有兒子結點。在這些兒子結點中,那些導致不可行解或導致非最優(yōu)解的兒子結點被舍棄,其余兒子結點被子加入活結點表中。此后,從活結點表中取下一結點成為當前擴展結點,并重復上述結點擴展過程。這個過程一直持續(xù)到找到所求的解或活結點表為空時為止。2023年2月6日77用法比較分支限界法類似于回溯法,也是一種在問題的解空間樹T上搜索問題解的算法。但在一般情況下,分支限界法與回溯法的求解目標不同?;厮莘ǖ那蠼饽繕耸钦页鯰中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的一個解,或是在滿足約束條件的解中找出使某一目標函數(shù)值達到極大或極小的解,即在某種意義下的最優(yōu)解。2023年2月6日78由于求解目標不同,導致分支限界法與回溯法在解空間樹T上的搜索方式也不相同?;厮莘ㄒ陨疃葍?yōu)先的方式搜索解空間樹T,而分支限界法則以廣度優(yōu)先或以最小耗費優(yōu)先的方式搜索解空間樹T。分支限界法的搜索策略是:在擴展結點處,先生成其所有的兒子結點(分支),然后再從當前的活結點表中選擇下一個擴展對點。為了有效地選擇下一擴展結點,以加速搜索的進程,在每一活結點處,計算一個函數(shù)值(限界

溫馨提示

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

評論

0/150

提交評論