![第6章分支限界法2015_第1頁](http://file4.renrendoc.com/view/f163b87b31c09278f0ba0be3405aaa15/f163b87b31c09278f0ba0be3405aaa151.gif)
![第6章分支限界法2015_第2頁](http://file4.renrendoc.com/view/f163b87b31c09278f0ba0be3405aaa15/f163b87b31c09278f0ba0be3405aaa152.gif)
![第6章分支限界法2015_第3頁](http://file4.renrendoc.com/view/f163b87b31c09278f0ba0be3405aaa15/f163b87b31c09278f0ba0be3405aaa153.gif)
![第6章分支限界法2015_第4頁](http://file4.renrendoc.com/view/f163b87b31c09278f0ba0be3405aaa15/f163b87b31c09278f0ba0be3405aaa154.gif)
![第6章分支限界法2015_第5頁](http://file4.renrendoc.com/view/f163b87b31c09278f0ba0be3405aaa15/f163b87b31c09278f0ba0be3405aaa155.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1第6章分支限界法學(xué)習(xí)要點(diǎn)理解分支限界法的剪枝搜索策略。掌握分支限界法的算法框架(1)隊(duì)列式(FIFO)分支限界法(2)優(yōu)先隊(duì)列式分支限界法通過應(yīng)用范例學(xué)習(xí)分支限界法的設(shè)計(jì)策略。2第6章分支限界法6.1分支界限法的基本思想6.2單源最短路徑問題6.3裝載問題6.40-1背包問題6.5貨郎擔(dān)問題36.1 分支限界法的基本思想1.分支限界法與回溯法的不同(1)求解策略:回溯法的求解過程屬于盲目搜索,而分支限界法的求解過程是有選擇地朝有利于獲得問題解或最優(yōu)解的方向搜索。4(2)適用場合:回溯法適用于尋找滿足約束條件的所有解,而分支界限法適用于尋找滿足約束條件的一個(gè)解,或是在滿足約束條件的解中找出在某種意義下的最優(yōu)解。(3)搜索方式:回溯法以深度優(yōu)先的方式搜索解空間樹;分支限界法以廣度優(yōu)先或以最小耗費(fèi)優(yōu)先的方式搜索解空間樹。5分支限界法的搜索策略是:在擴(kuò)展結(jié)點(diǎn)處,先生成其所有的兒子結(jié)點(diǎn)(分支),——從當(dāng)前的活結(jié)點(diǎn)表中選擇下一個(gè)擴(kuò)展結(jié)點(diǎn)。為有效選擇下一擴(kuò)展結(jié)點(diǎn),加速搜索的進(jìn)程,在每一活結(jié)點(diǎn)處,計(jì)算一個(gè)函數(shù)值(限界),并根據(jù)這些已計(jì)算出的函數(shù)值,從當(dāng)前活結(jié)點(diǎn)表中選擇一個(gè)最有利的結(jié)點(diǎn)作為擴(kuò)展結(jié)點(diǎn),使搜索朝著解空間樹上有最優(yōu)解的分支推進(jìn),盡快找出一個(gè)最優(yōu)解。62.分支限界法基本思想分支限界法采用廣度優(yōu)先或最小耗費(fèi)(最大效益)優(yōu)先的方式搜索問題的解空間樹。在分支限界法中,每一個(gè)活結(jié)點(diǎn)只有一次成為擴(kuò)展結(jié)點(diǎn)的機(jī)會(huì)?;罱Y(jié)點(diǎn)一旦成為擴(kuò)展結(jié)點(diǎn),就一次性產(chǎn)生所有兒子結(jié)點(diǎn)。在這些兒子結(jié)點(diǎn)中,導(dǎo)致不可行解或?qū)е路亲顑?yōu)解的兒子結(jié)點(diǎn)被剪掉,其余兒子結(jié)點(diǎn)被加入活結(jié)點(diǎn)表中。此后,從活結(jié)點(diǎn)表中取下一結(jié)點(diǎn)成為當(dāng)前擴(kuò)展結(jié)點(diǎn),并重復(fù)上述結(jié)點(diǎn)擴(kuò)展過程。這個(gè)過程一直持續(xù)到找到滿足約束條件的解或活結(jié)點(diǎn)表為空時(shí)為止。73.常見的兩種分支限界法(1)隊(duì)列式(FIFO)分支限界法按照隊(duì)列先進(jìn)先出(FIFO)原則選取下一個(gè)結(jié)點(diǎn)成為擴(kuò)展結(jié)點(diǎn)。(隊(duì)列)
(2)優(yōu)先隊(duì)列式分支限界法按照優(yōu)先隊(duì)列中規(guī)定的優(yōu)先級選取優(yōu)先級最高的結(jié)點(diǎn)成為當(dāng)前擴(kuò)展結(jié)點(diǎn)。(利用堆排序)8堆具有如下性質(zhì):(1)堆是一棵完全二叉樹,k1為根結(jié)點(diǎn)。(2)堆的根結(jié)點(diǎn)是元素序列中的值最小或最大元素。根元素為最小元素的堆稱為最小堆,根元素為最大元素的堆稱為最大堆。(3)堆中任一子樹也是堆。
堆排序是利用堆頂記錄的關(guān)鍵值最小(或最大)的性質(zhì),從當(dāng)前待排序列中依次選取關(guān)鍵字最?。ɑ蜃畲螅┑挠涗泚磉M(jìn)行選擇排序的一種方法。在堆排序過程中,需要做兩方面的工作:(1)怎樣將給定的待排序記錄構(gòu)成一個(gè)初始堆;(2)輸出關(guān)鍵字最?。ù螅┑挠涗浐螅绾螌⑹S嘤涗浾沓梢粋€(gè)新的堆。9堆是n個(gè)元素的序列H={k1,k2,…kn},它滿足如下關(guān)系:或者根據(jù)堆的定義,堆可以看成一棵以k1為根的完全二叉樹。元素序列為{1,4,3,5,6,7,9,10,8}914356781064513210優(yōu)先隊(duì)列中規(guī)定的結(jié)點(diǎn)優(yōu)先級常用一個(gè)與該結(jié)點(diǎn)相關(guān)的數(shù)值p來表示,結(jié)點(diǎn)優(yōu)先級的高低與p值的大小相關(guān)。最大優(yōu)先隊(duì)列中規(guī)定p值較大的結(jié)點(diǎn)優(yōu)先級較高。最小優(yōu)先隊(duì)列中規(guī)定p值較小的結(jié)點(diǎn)優(yōu)先級較高。最大堆實(shí)現(xiàn)最小堆實(shí)現(xiàn)用優(yōu)先隊(duì)列式分支限界法解具體問題時(shí),根據(jù)具體問題的特點(diǎn)確定選用最大優(yōu)先或最小優(yōu)先隊(duì)列來表示解空間的活結(jié)點(diǎn)表。11用隊(duì)列式分支限界法解此問題時(shí),用一個(gè)隊(duì)列來存儲活結(jié)點(diǎn)表。隊(duì)頭隊(duì)尾活結(jié)點(diǎn)隊(duì)列起始結(jié)點(diǎn)為ABC
不可解BECFG
不可解EKFLMGNO對于n=3時(shí)的0-1背包問題,考慮下面例子:w=[16,15,15],p=[45,25,25],c=30。12隊(duì)列式分支限界法搜索解空間樹的方式與解空間樹的廣度優(yōu)先遍歷算法極為類似。唯一不同之處是隊(duì)列式分支限界法不搜索以不可行結(jié)點(diǎn)為根的子樹。優(yōu)先隊(duì)列式分支限界法也是從根結(jié)點(diǎn)A開始搜索解空間樹的。用極大堆來表示活結(jié)點(diǎn)表的優(yōu)先隊(duì)列,該優(yōu)先隊(duì)列的優(yōu)先級定義為活結(jié)點(diǎn)所獲得的價(jià)值。13w=[16,15,15],p=[45,25,25],c=30。初始堆為空,擴(kuò)展結(jié)點(diǎn)A得到它的2個(gè)兒子結(jié)點(diǎn)B,C。
價(jià)值45
價(jià)值0
不可解
價(jià)值45
不可解
價(jià)值45
01114尋求一個(gè)最優(yōu)解時(shí),類似可用剪枝函數(shù)來加速搜索。函數(shù)給出每一個(gè)可行結(jié)點(diǎn)相應(yīng)子樹可能獲得的最大價(jià)值的上界。(如此上界不會(huì)比當(dāng)前最優(yōu)值更大)說明:相應(yīng)的子樹中不含問題的最優(yōu)解,可以剪去。另一方面,可將上界函數(shù)確定的每個(gè)結(jié)點(diǎn)的上界值作為優(yōu)先級,以該優(yōu)先級的非增序抽取當(dāng)前擴(kuò)展結(jié)點(diǎn)??筛杆俚恼业阶顑?yōu)解。15旅行售貨員問題:ABCDEFGHIJKLMNOPQ12343444433322221432301020456
初始擴(kuò)展結(jié)點(diǎn)CDECFGDHIEJKFL
費(fèi)用為5916ABCDEFGHIJKLMNOPQ1234344443332222用極小堆來存儲活結(jié)點(diǎn)表,其優(yōu)先級是結(jié)點(diǎn)當(dāng)前的費(fèi)用。
初始擴(kuò)展結(jié)點(diǎn)1432301020456結(jié)點(diǎn)E被擴(kuò)展。17可以用一個(gè)限界函數(shù)在搜索過程中裁剪子樹,減少活結(jié)點(diǎn)。此剪枝函數(shù)是當(dāng)前結(jié)點(diǎn)擴(kuò)展后得到的最小費(fèi)用的一個(gè)下界。如果在當(dāng)前擴(kuò)展結(jié)點(diǎn)處,這個(gè)下界不比當(dāng)前最優(yōu)值更小,則以該結(jié)點(diǎn)為根的子樹可以剪去。另一方面,也可以把每個(gè)結(jié)點(diǎn)的下界作為優(yōu)先級,依非減序從活結(jié)點(diǎn)優(yōu)先隊(duì)列中抽取下一個(gè)擴(kuò)展結(jié)點(diǎn)。186.2 單源最短路徑問題單源最短路徑問題:在下圖所給的有向圖G中,每一邊都有一個(gè)非負(fù)邊權(quán)。求圖G的從源頂點(diǎn)①到目標(biāo)頂點(diǎn)⑤之間的最短路徑。123452144358111113323445Dijkstra算法過程19隊(duì)列式(FIFO)分支限界法123452144358135254452488936511隊(duì)列:41325455520優(yōu)先隊(duì)列式分支限界法123452144358123545428365923524552555利用堆依據(jù)優(yōu)先級選擇21算法從圖G的源頂點(diǎn)s和空優(yōu)先隊(duì)列開始。結(jié)點(diǎn)s被擴(kuò)展后,它的兒子結(jié)點(diǎn)被依次插入堆中。此后,算法從堆中取出具有最小當(dāng)前路長的結(jié)點(diǎn)作為當(dāng)前擴(kuò)展結(jié)點(diǎn),并依次檢查與當(dāng)前擴(kuò)展結(jié)點(diǎn)相鄰的所有頂點(diǎn)。如果從當(dāng)前擴(kuò)展結(jié)點(diǎn)i到頂點(diǎn)j有邊可達(dá),且從源出發(fā),途經(jīng)頂點(diǎn)i再到頂點(diǎn)j的所相應(yīng)的路徑的長度小于當(dāng)前最優(yōu)路徑長度,則將該頂點(diǎn)作為活結(jié)點(diǎn)插入到活結(jié)點(diǎn)優(yōu)先隊(duì)列中。這個(gè)結(jié)點(diǎn)的擴(kuò)展過程一直繼續(xù)到活結(jié)點(diǎn)優(yōu)先隊(duì)列為空時(shí)為止。22下圖是用優(yōu)先隊(duì)列式分支限界法解有向圖G的單源最短路徑問題產(chǎn)生的解空間樹。其中,每一個(gè)結(jié)點(diǎn)旁邊的數(shù)字表示該結(jié)點(diǎn)所對應(yīng)的當(dāng)前路長。23剪枝策略在算法擴(kuò)展結(jié)點(diǎn)的過程中,一旦發(fā)現(xiàn)一個(gè)結(jié)點(diǎn)的下界不小于當(dāng)前找到的最短路長,則算法剪去以該結(jié)點(diǎn)為根的子樹。在算法中,利用結(jié)點(diǎn)間的控制關(guān)系進(jìn)行剪枝。從源頂點(diǎn)s出發(fā),2條不同路徑到達(dá)圖G的同一頂點(diǎn)。由于兩條路徑的路長不同,因此可以將路長長的路徑所對應(yīng)的樹中的結(jié)點(diǎn)為根的子樹剪去。24float[]dist:從源點(diǎn)到各頂點(diǎn)的最短路徑int[]p:路徑中當(dāng)前頂點(diǎn)的前驅(qū)結(jié)點(diǎn)初始化堆,dist[]=∞;while(true){for(j=1;j<n;j++){if(頂點(diǎn)i到頂點(diǎn)j可達(dá),且更短
){dist[j]=保留路徑長度;p[j]=i;
將頂點(diǎn)j加入堆中;
}}if(堆空)break;else出堆;}偽語言優(yōu)先隊(duì)列式分支限界法25
while(true){//搜索問題的解空間
for(intj=1;j<=n;j++){if(a[enode.i][j]<MAX_VALUE&&enode.length+a[enode.i][j]<dist[j]){//頂點(diǎn)i到頂點(diǎn)j可達(dá),且滿足控制約束
dist[j]=enode.length+a[enode.i][j];p[j]=enode.i;HeapNode*node=newHeapNode(j,dist[j]);heap.put(&node);//加入活結(jié)點(diǎn)優(yōu)先隊(duì)列}
}if(heap.isEmpty())break;elseenode=(HeapNode)heap.removeMin();}路徑長度length結(jié)點(diǎn)編號i堆結(jié)點(diǎn)結(jié)構(gòu)266.3裝載問題1.問題描述有n個(gè)集裝箱要裝上2艘載重量分別為C1和C2的輪船,其中集裝箱i的重量為Wi,且裝載問題要求確定是否有一個(gè)合理的裝載方案可以將這些集裝箱裝上這2艘輪船。如果有,找出一種裝載方案。27可以證明:如果裝載問題有解,則采用下面的策略可得到裝載方案。(1)首先將第1艘輪船盡可能裝滿;(2)將剩余的集裝箱裝上第2艘輪船。282.隊(duì)列式分支限界法在算法中,不斷重復(fù)下列操作,直到隊(duì)列空為止。檢測當(dāng)前擴(kuò)展結(jié)點(diǎn)的左兒子結(jié)點(diǎn)是否為可行結(jié)點(diǎn)。if(可行)將其加入到活結(jié)點(diǎn)隊(duì)列中;將其右兒子結(jié)點(diǎn)加入到活結(jié)點(diǎn)隊(duì)列中(右兒子結(jié)點(diǎn)一定是可行結(jié)點(diǎn))。注意:當(dāng)2個(gè)兒子都產(chǎn)生后,當(dāng)前擴(kuò)展結(jié)點(diǎn)被舍棄。29舉例:w=[3,5,2,1]c=7012ew=3ew=03478ew=51314ew=61516ew=4561020ew=6ew=5919ew=7ew=81122ew=321ew=2122423ew=11817ew=830建立一個(gè)用于存放活結(jié)點(diǎn)的隊(duì)列queue,又稱為活結(jié)點(diǎn)隊(duì)列。隊(duì)列中元素的值表示活結(jié)點(diǎn)對應(yīng)的當(dāng)前載重量(ew)。為了便于處理,在解空間樹中,在同層最后一個(gè)結(jié)點(diǎn)之后,在隊(duì)列中添加一個(gè)-1。31活結(jié)點(diǎn)隊(duì)列中的隊(duì)首元素被取出作為當(dāng)前擴(kuò)展結(jié)點(diǎn),由于隊(duì)列中每一層結(jié)點(diǎn)之后都有一個(gè)尾部標(biāo)記-1,故在取隊(duì)首元素時(shí),活結(jié)點(diǎn)隊(duì)列一定不空。當(dāng)取出的元素是-1時(shí),再判斷當(dāng)前隊(duì)列是否為空。如果隊(duì)列非空,則將尾部標(biāo)記-1加入活結(jié)點(diǎn)隊(duì)列,算法開始處理下一層的活結(jié)點(diǎn)。32while(true){
if(ew+w[i]<=c)enQueue(ew+w[i],i);//檢查左兒子結(jié)點(diǎn)
enQueue(ew,i);ew=queue.front();//取下一擴(kuò)展結(jié)點(diǎn)queue.pop();
if(ew==-1){if(queue.isEmpty())returnbestw;queue.push(-1);//同層結(jié)點(diǎn)尾部標(biāo)志
ew=queue.front();//取下一擴(kuò)展結(jié)點(diǎn)queue.pop();
i++;//進(jìn)入下一層
}}voidenQueue(intwt,inti){if(i==n){//到葉子結(jié)點(diǎn)更新bestwif(wt>bestw)bestw=wt;}elsequeue.push(wt);}33舉例:n=3,w=[8,6,2],W=1234舉例:n=3,w=[8,6,2],W=12初始化隊(duì)列如圖(a)所示。此時(shí),隊(duì)列非空,節(jié)點(diǎn)B和C依次進(jìn)入隊(duì)列。如圖(b)所示。值得注意的是,實(shí)際進(jìn)入隊(duì)列的是數(shù)值8和0,這里用節(jié)點(diǎn)B和C分別代替8和0,每個(gè)節(jié)點(diǎn)所代表的數(shù)值見其旁邊矩形中的數(shù)字,也就是約束函數(shù)值。B節(jié)點(diǎn)約束函數(shù)值為8,表示當(dāng)前目標(biāo)函數(shù)的下界為8。-1出隊(duì)列,而且此時(shí)隊(duì)列非空,因此-1進(jìn)隊(duì)列,同時(shí)節(jié)點(diǎn)B出隊(duì)列,如圖(c)所示。展開節(jié)點(diǎn)B,由于B節(jié)點(diǎn)的1分支節(jié)點(diǎn)的約束函數(shù)值為14,大于船的載重量12,因此1分支被剪支,B節(jié)點(diǎn)的0分支節(jié)點(diǎn)E無條件進(jìn)隊(duì)列,如圖(d)所示。分支限界C節(jié)點(diǎn)出隊(duì)列,該節(jié)點(diǎn)為擴(kuò)展節(jié)點(diǎn),如圖(e)所示。展開節(jié)點(diǎn)C,C節(jié)點(diǎn)的兩個(gè)分支節(jié)點(diǎn)F和G均可以進(jìn)入隊(duì)列,如圖(f)所示。從隊(duì)列中取出擴(kuò)展節(jié)點(diǎn)E,如圖(g)所示。將節(jié)點(diǎn)E展開,其兩個(gè)分支節(jié)點(diǎn)J和K均為葉節(jié)點(diǎn),不再展開。如圖(h)所示。此時(shí),E節(jié)點(diǎn)的1分支節(jié)點(diǎn)J的約束函數(shù)值為10,表示當(dāng)前目標(biāo)函數(shù)值的下界更新為10,得到一個(gè)解[1,0,1],其重量為10。從隊(duì)列中依次取出擴(kuò)展節(jié)點(diǎn)F和G,將其展開,其分支節(jié)點(diǎn)為葉子,如圖(i)所示。此時(shí)隊(duì)列為空,搜索停止。如圖(j)所示。373.算法的改進(jìn)結(jié)點(diǎn)的左子樹表示將此集裝箱裝上船,右子樹表示不將此集裝箱裝上船。設(shè)bestw是當(dāng)前最優(yōu)解;ew是當(dāng)前擴(kuò)展結(jié)點(diǎn)所相應(yīng)的重量;r是剩余集裝箱的重量。當(dāng)ew+r>bestw時(shí),才有可能存在更優(yōu)解,否則將其右子樹剪去。38算法的改進(jìn)//檢查左兒子結(jié)點(diǎn)intwt=ew+w[i];if(wt<=c){//可行結(jié)點(diǎn)//加入活結(jié)點(diǎn)隊(duì)列
if(i<n)queue.push(wt);}//檢查右兒子結(jié)點(diǎn)
if(ew+r>bestw&&i<n)//可能含最優(yōu)解
queue.push(ew);ew=queue.front();queue.pop();//取下一擴(kuò)展結(jié)點(diǎn)
……..;39算法的改進(jìn)//檢查左兒子結(jié)點(diǎn)intwt=ew+w[i];if(wt<=c){//可行結(jié)點(diǎn)
if(wt>bestw)bestw=wt;
//加入活結(jié)點(diǎn)隊(duì)列
if(i<n)queue.push(wt);}//檢查右兒子結(jié)點(diǎn)
if(ew+r>bestw&&i<n)//可能含最優(yōu)解
queue.push(ew);ew=queue.front();queue.pop();//取下一擴(kuò)展結(jié)點(diǎn)
……….;為了盡早剪掉無用的右子樹,可以在每次進(jìn)入左子樹時(shí)更新bestw的值。40舉例(同前例):n=3,w=[8,6,2],W=1241舉例:n=3,w=[8,6,2],W=12最初解空間樹如圖(a)所示。圖(b)中,兩個(gè)節(jié)點(diǎn)B和C是活節(jié)點(diǎn),B的最大收益值是16,因此B是擴(kuò)展節(jié)點(diǎn)。優(yōu)先擴(kuò)展B,得到圖(c)。由于節(jié)點(diǎn)D不滿足約束條件,因此不會(huì)放入活節(jié)點(diǎn)表,即它被殺死,當(dāng)前活節(jié)點(diǎn)為C和E。由于E具有更大的上界函數(shù)值,因此E被優(yōu)先擴(kuò)展,得到圖(d)。E的1分支節(jié)點(diǎn)J已經(jīng)是葉節(jié)點(diǎn),J不會(huì)放入活節(jié)點(diǎn)表,被殺死。此時(shí)J獲得載重量為10,等于其上界函數(shù)值10,而J的上界函數(shù)值是當(dāng)前活節(jié)點(diǎn)中上界值最大的,因此,擴(kuò)展其他節(jié)點(diǎn)不會(huì)得到比10還大的載重量。因此,分支限界搜索被終止。獲得最優(yōu)解[1,0,1],其最優(yōu)載重量為10。434.構(gòu)造最優(yōu)解為了在算法結(jié)束后能構(gòu)造出最優(yōu)解,必須存儲相應(yīng)子集樹中從活結(jié)點(diǎn)到根的路徑。為此,可在每個(gè)結(jié)點(diǎn)處設(shè)置指向父結(jié)點(diǎn)的指針,同時(shí)設(shè)置左、右兒子標(biāo)志。
structQNode{
QNodeparent;//父結(jié)點(diǎn)booleanleftChild;//左兒子標(biāo)志intweight;//結(jié)點(diǎn)所相應(yīng)的載重量};44找到最優(yōu)值后,可以根據(jù)parent,從葉子結(jié)點(diǎn)回溯到根結(jié)點(diǎn),找到最優(yōu)解。//構(gòu)造當(dāng)前最優(yōu)解for(intj=n;j>0;j--){bestx[j]=(e.leftChild)?1:0;e=e.parent;}455.優(yōu)先隊(duì)列式分支限界法解裝載問題的優(yōu)先隊(duì)列式分支限界法用最大優(yōu)先隊(duì)列存儲活結(jié)點(diǎn)表。活結(jié)點(diǎn)x在優(yōu)先隊(duì)列中的優(yōu)先級定義為ew+r。46優(yōu)先隊(duì)列中優(yōu)先級最大的活結(jié)點(diǎn)成為下一個(gè)擴(kuò)展結(jié)點(diǎn)。以結(jié)點(diǎn)x為根的子樹中所有結(jié)點(diǎn)相應(yīng)的路徑的載重量不超過它的優(yōu)先級。子集樹中葉結(jié)點(diǎn)所相應(yīng)的載重量與其優(yōu)先級相同。在優(yōu)先隊(duì)列式分支限界法中,一旦有一個(gè)葉結(jié)點(diǎn)成為當(dāng)前擴(kuò)展結(jié)點(diǎn),則可以斷言該葉結(jié)點(diǎn)所相應(yīng)的解即為最優(yōu)解。此時(shí)終止算法。47舉例:n=3,w=[8,6,2],W=1248舉例:n=3,w=[8,6,2],W=12496.40-1背包問題算法的思想首先,對輸入數(shù)據(jù)進(jìn)行預(yù)處理,將各物品依其單位重量價(jià)值從大到小進(jìn)行排列。
在優(yōu)先隊(duì)列分支限界法中,結(jié)點(diǎn)的優(yōu)先級為:
由已裝入的物品價(jià)值+剩余的最大單位重量價(jià)值的物品裝滿剩余容量的價(jià)值和。
50算法處理過程:首先檢查當(dāng)前擴(kuò)展結(jié)點(diǎn)的左兒子結(jié)點(diǎn)是否可行。如果左兒子是可行結(jié)點(diǎn),將其加入到活結(jié)點(diǎn)優(yōu)先隊(duì)列中。當(dāng)前擴(kuò)展結(jié)點(diǎn)的右兒子結(jié)點(diǎn)一定是可行結(jié)點(diǎn),僅當(dāng)右兒子結(jié)點(diǎn)滿足上界約束時(shí)才將它加入到活結(jié)點(diǎn)優(yōu)先隊(duì)列。當(dāng)擴(kuò)展到葉結(jié)點(diǎn)時(shí)得到問題的最優(yōu)值。51計(jì)算上界函數(shù)bound(i)//n表示物品總數(shù),cleft為剩余重量=c-cwwhile(i<=n&&w[i]<=cleft){cleft-=w[i];//w[i]表示i所占空間b+=p[i];//p[i]表示i的價(jià)值i++;}
//裝填剩余容量裝滿背包if(i<=n)b+=p[i]/w[i]*cleft;returnb;//b為上界值52
while(i<=n){//非葉結(jié)點(diǎn)wt=cw+w[i];if(wt<=c){//左兒子結(jié)點(diǎn)為可行結(jié)點(diǎn)
if(cp+p[i]>bestp)bestp=cp+p[i];addLiveNode(up,cp+p[i],cw+w[i],i+1,enode,true);}up=bound(i+1);if(up>=bestp)//檢查右兒子結(jié)點(diǎn)addLiveNode(up,cp,cw,i+1,enode,false);
//取下一個(gè)擴(kuò)展節(jié)點(diǎn)(略)}bestp:當(dāng)前最優(yōu)價(jià)值cp:當(dāng)前總價(jià)值cw:當(dāng)前總重量536.5貨郎擔(dān)問題1.問題描述
某售貨員要到若干城市去推銷商品,已知各城市之間的路程(或旅費(fèi))。要選定一條從駐地出發(fā),經(jīng)過每個(gè)城市一次,最后回到駐地的路線,使總的路程(或總旅費(fèi))最小。
54路線是一個(gè)帶權(quán)圖。圖中各邊的費(fèi)用(權(quán))為正數(shù)。圖的一條周游路線是包括V中的每個(gè)頂點(diǎn)在內(nèi)的一條回路。周游路線的費(fèi)用是這條路線上所有邊的費(fèi)用之和。
123430620105455貨郎擔(dān)問題的解空間可以組織成一棵排列樹,從樹的根結(jié)點(diǎn)到任一葉結(jié)點(diǎn)的路徑定義了圖的一條周游路線。貨郎擔(dān)問題要在圖G中找出費(fèi)用最小的周游路線。56
4城市貨郎但問題的解空間是一棵排列樹。利用優(yōu)先隊(duì)列式分支限界法求解,可用一極小堆來存儲活結(jié)點(diǎn)表。其優(yōu)先級是結(jié)點(diǎn)的當(dāng)前費(fèi)用。算法從排列樹的結(jié)點(diǎn)B和空優(yōu)先隊(duì)列開始。結(jié)點(diǎn)B被擴(kuò)展后,他的3個(gè)兒子結(jié)點(diǎn)被一次插入堆中。此時(shí),由于E是堆中具有最小當(dāng)前費(fèi)用的結(jié)點(diǎn),所以處于堆頂?shù)奈恢?,他自然成為下一個(gè)擴(kuò)展結(jié)點(diǎn)。結(jié)點(diǎn)E被擴(kuò)展后,其兒子結(jié)點(diǎn)J和K被插入當(dāng)前堆中,他們的費(fèi)用分別為14和24。此時(shí)堆頂元素為D,他成為下一個(gè)擴(kuò)展結(jié)點(diǎn)。他的2個(gè)兒子結(jié)點(diǎn)被插入堆中。此時(shí)堆中含有結(jié)點(diǎn)C,H,I,J,K。結(jié)點(diǎn)H具有最小費(fèi)用,從而成為下一個(gè)擴(kuò)展結(jié)點(diǎn)。擴(kuò)展結(jié)點(diǎn)H后得到一條回路(1,3,2,4,1),相應(yīng)的費(fèi)用為25。接下來結(jié)點(diǎn)J成為擴(kuò)展結(jié)點(diǎn),由此得到另一條費(fèi)用25的回路(1,4,2,3,1)。此后的兩個(gè)擴(kuò)展結(jié)點(diǎn)是K和I。由結(jié)點(diǎn)k得到的可行解費(fèi)用高于當(dāng)前最優(yōu)解,結(jié)點(diǎn)I、C本身的費(fèi)用已高于當(dāng)前最優(yōu)解,從而他們都不能得到更好的解。最后,優(yōu)先隊(duì)列為空,算法終止。463010520572.算法描述(最小權(quán)值分支界限法)
首先,創(chuàng)建一個(gè)最小堆,用于表示活結(jié)點(diǎn)優(yōu)先隊(duì)列。堆中每個(gè)結(jié)點(diǎn)存儲從根結(jié)點(diǎn)到該活結(jié)點(diǎn)的相應(yīng)路徑長度。堆結(jié)點(diǎn)中包括:
int[]x:用于記錄當(dāng)前解
s:結(jié)點(diǎn)在排序樹中的層次,從0到s的路徑為x[0:s]
cc:表示當(dāng)前費(fèi)用
lcost:子樹費(fèi)用的下界,是隊(duì)列的優(yōu)先級
rcost:是x[s:n-1]中最小出邊費(fèi)用和58在實(shí)現(xiàn)過程中,用鄰接矩陣表示給的圖G。每個(gè)結(jié)點(diǎn)的lcost作為優(yōu)先隊(duì)列的優(yōu)先級?;咎幚磉^程為:計(jì)算圖中每個(gè)頂點(diǎn)的最小費(fèi)用出邊并用minout記錄。如果所給的有向圖中某個(gè)頂點(diǎn)沒有出邊,則該圖不可能有回路,算法結(jié)束,否則繼續(xù)后續(xù)的處理。59//第一個(gè)擴(kuò)展結(jié)點(diǎn)是Bwhile(沒有到葉子結(jié)點(diǎn)){//完成對排列樹內(nèi)部結(jié)點(diǎn)的擴(kuò)展。
if(擴(kuò)展結(jié)點(diǎn)是葉子結(jié)點(diǎn)的父結(jié)點(diǎn)(n-2)){
if(有回路且更優(yōu)){記錄最優(yōu)值,并將該葉結(jié)點(diǎn)插入到優(yōu)先隊(duì)列中
}
}else{依次產(chǎn)生當(dāng)前擴(kuò)展結(jié)點(diǎn)的所有兒子結(jié)點(diǎn)。由于當(dāng)前擴(kuò)展結(jié)點(diǎn)所相應(yīng)的路徑是x[0:s],其可行兒子結(jié)點(diǎn)從剩余頂點(diǎn)x[s+1:n-1]中選取x[i],且(x[s],x[i])是所給有向圖G中的一條邊。對于當(dāng)前擴(kuò)展結(jié)點(diǎn)的每一個(gè)可行兒子結(jié)點(diǎn),如果有可能產(chǎn)生更優(yōu)解,將其插入優(yōu)先隊(duì)列中。
}
從優(yōu)先隊(duì)列中取下一個(gè)結(jié)點(diǎn)作為新的擴(kuò)展結(jié)點(diǎn)}606.6作業(yè)分配問題n個(gè)操作員以n種不同時(shí)間完成n種不同作業(yè)。要求分配每位操作員完成一項(xiàng)工作,使完成n項(xiàng)工作的總時(shí)間最少。利用分支限界法解作業(yè)分配問題。方便起見,把n個(gè)操作員編號為0,1,...,n-1,把n個(gè)作業(yè)也編號為0,1,...,n-1。用矩陣c來描述每位操作員完成每個(gè)作業(yè)時(shí)所需的時(shí)間。例如,元素cij
表示第i位操作員完成第j號作業(yè)所需的時(shí)間。下圖是4個(gè)操作員完成4個(gè)作業(yè)所需的時(shí)間表。求解作業(yè)最優(yōu)分配方案。
613841291213587931276801230123(作業(yè))
第0行的4個(gè)數(shù)據(jù)分別表示第0位操作員完成4個(gè)作業(yè)所需時(shí)間。當(dāng)把第0號作業(yè)分配給第0位操作員時(shí),c00=3.
而1號作業(yè)分別由其余3位操作員單獨(dú)完成時(shí),最短時(shí)間是7,第2號作業(yè)最短時(shí)間為6,第3號作業(yè)最短時(shí)間為3。因此當(dāng)把第0號作業(yè)分配給第0位操作員時(shí),所需時(shí)間至少不會(huì)少于3+7+6+3=19,可以把它看成是在根節(jié)點(diǎn)下第0個(gè)兒子節(jié)點(diǎn)的下界。如果把第0號作業(yè)分配給第1位操作員時(shí),所需時(shí)間至少不會(huì)小于9+7+4+3=23,可以把它看成是在根節(jié)點(diǎn)下第1個(gè)兒子節(jié)點(diǎn)的下界。62令tik表示在某個(gè)搜索深度k下,把作業(yè)k分配給操作員i時(shí)的時(shí)間下界。則當(dāng)k=0時(shí),有t00=3+7+6+3=19t10=9+7+4+3=23t20=8+7+4+5=24t30=12+7+4+3=26于是在根節(jié)點(diǎn)下建立4個(gè)兒子節(jié)點(diǎn)2、3、4、5,對應(yīng)于把第0號作業(yè)分別分配給第0、1、2、3號操作員,其下界分別為19,23,24,26。把這些節(jié)點(diǎn)都插入最小堆中,這時(shí)節(jié)點(diǎn)2的下界最小。把它從堆頂取下,并由它向下繼續(xù)搜索,生成3個(gè)兒子節(jié)點(diǎn),分別為6、7、8。……524316211234311020301923242678112100229101232211113213841291213587931276801230123636.7布線問題問題的提出:印刷電路板將布線區(qū)域劃分成n*m個(gè)方格陣列,要求確定連接方格a的中點(diǎn)到方格b的中點(diǎn)的最短布線方案。在布線時(shí),電路只能沿直線或直角布線,為了避免線路相交,已布了線的方格做了封鎖標(biāo)記,其他線路不允許穿過被封鎖的方格。ab641.算法思想討論用隊(duì)列分支限界法來解布線問題。布線問題的解空間是一個(gè)圖。解此問題的隊(duì)列式分支限界法從起始位置a開始將它作為第一個(gè)擴(kuò)展結(jié)點(diǎn)。與該擴(kuò)展結(jié)點(diǎn)相鄰并且可達(dá)的方格成為可行結(jié)點(diǎn)被加入到活結(jié)點(diǎn)隊(duì)列中,并且將這些方格標(biāo)記為1,即從起始方格a到這些方格的距離為1。65接著,算法從活結(jié)點(diǎn)隊(duì)列中取出隊(duì)首結(jié)點(diǎn)作為下一個(gè)擴(kuò)展結(jié)點(diǎn),并將與當(dāng)前擴(kuò)展結(jié)點(diǎn)相鄰且未標(biāo)記過的方格標(biāo)記為2,并存入活結(jié)點(diǎn)隊(duì)列。這個(gè)過程一直繼續(xù)到算法搜索到目標(biāo)方格b或活結(jié)點(diǎn)隊(duì)列為空時(shí)為止。即加入剪枝的廣度優(yōu)先搜索。66Positionoffset[4];offset[0].row=0;offset[0].col=1;//右
offset[1].row=1;offset[1].col=0;//下
offset[2].row=0;offset[2].col=-1;//左
offset[3].row=-1;offset[3].col=0;//上定義移動(dòng)方向的相對位移67設(shè)置邊界的圍墻
for(inti=0;i<=m+1;i++)grid[0][i]=grid[n+1][i]=1;//頂部和底部
for(inti=0;i<=n+1;i++)grid[i][0]=grid[i][m+1]=1;//左翼和右翼68for(inti=0;i<NumOfNbrs;i++){nbr.row=here.row+offs
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度蟲草收購與品牌合作戰(zhàn)略合同3篇
- 二零二五年度建筑玻璃幕墻節(jié)能改造工程合同6篇
- 2025年度國際運(yùn)輸設(shè)備租賃與貨運(yùn)管理合同
- 2025年度股權(quán)債權(quán)投資顧問服務(wù)合同
- 2025年租賃結(jié)束時(shí)的結(jié)算合同
- 2025年度人工智能教育培訓(xùn)合同授權(quán)委托書范本
- 2025版選礦廠承包合同及資源回收利用合作協(xié)議3篇
- 2025年度智能農(nóng)業(yè)物聯(lián)網(wǎng)解決方案采購合同
- 2025年度國際旅游團(tuán)隊(duì)國際公路貨物運(yùn)輸合同范本
- 二零二五年度會(huì)展中心場地租賃合同(含廣告位租賃)
- 護(hù)理人文知識培訓(xùn)課件
- 建筑工程施工安全管理課件
- 2025年春新人教版數(shù)學(xué)七年級下冊教學(xué)課件 7.2.3 平行線的性質(zhì)(第1課時(shí))
- 安徽省合肥市2025年高三第一次教學(xué)質(zhì)量檢測地理試題(含答案)
- 2025年新合同管理工作計(jì)劃
- 統(tǒng)編版八年級下冊語文第三單元名著導(dǎo)讀《經(jīng)典常談》閱讀指導(dǎo) 學(xué)案(含練習(xí)題及答案)
- 風(fēng)光儲儲能項(xiàng)目PCS艙、電池艙吊裝方案
- TTJSFB 002-2024 綠色融資租賃項(xiàng)目評價(jià)指南
- 全新車位轉(zhuǎn)讓協(xié)議模板下載(2024版)
- 高中英語原版小說整書閱讀指導(dǎo)《奇跡男孩》(wonder)-Part one 講義
- GB/T 4745-2012紡織品防水性能的檢測和評價(jià)沾水法
評論
0/150
提交評論