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

下載本文檔

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

文檔簡介

1第6章分支限界法學(xué)習(xí)要點理解分支限界法的剪枝搜索策略。掌握分支限界法的算法框架(1)隊列式(FIFO)分支限界法(2)優(yōu)先隊列式分支限界法通過應(yīng)用范例學(xué)習(xí)分支限界法的設(shè)計策略。2第6章分支限界法6.1分支界限法的基本思想6.2單源最短路徑問題6.3裝載問題6.40-1背包問題6.5貨郎擔(dān)問題36.1 分支限界法的基本思想1.分支限界法與回溯法的不同(1)求解策略:回溯法的求解過程屬于盲目搜索,而分支限界法的求解過程是有選擇地朝有利于獲得問題解或最優(yōu)解的方向搜索。4(2)適用場合:回溯法適用于尋找滿足約束條件的所有解,而分支界限法適用于尋找滿足約束條件的一個解,或是在滿足約束條件的解中找出在某種意義下的最優(yōu)解。(3)搜索方式:回溯法以深度優(yōu)先的方式搜索解空間樹;分支限界法以廣度優(yōu)先或以最小耗費優(yōu)先的方式搜索解空間樹。5分支限界法的搜索策略是:在擴(kuò)展結(jié)點處,先生成其所有的兒子結(jié)點(分支),——從當(dāng)前的活結(jié)點表中選擇下一個擴(kuò)展結(jié)點。為有效選擇下一擴(kuò)展結(jié)點,加速搜索的進(jìn)程,在每一活結(jié)點處,計算一個函數(shù)值(限界),并根據(jù)這些已計算出的函數(shù)值,從當(dāng)前活結(jié)點表中選擇一個最有利的結(jié)點作為擴(kuò)展結(jié)點,使搜索朝著解空間樹上有最優(yōu)解的分支推進(jìn),盡快找出一個最優(yōu)解。62.分支限界法基本思想分支限界法采用廣度優(yōu)先或最小耗費(最大效益)優(yōu)先的方式搜索問題的解空間樹。在分支限界法中,每一個活結(jié)點只有一次成為擴(kuò)展結(jié)點的機(jī)會。活結(jié)點一旦成為擴(kuò)展結(jié)點,就一次性產(chǎn)生所有兒子結(jié)點。在這些兒子結(jié)點中,導(dǎo)致不可行解或?qū)е路亲顑?yōu)解的兒子結(jié)點被剪掉,其余兒子結(jié)點被加入活結(jié)點表中。此后,從活結(jié)點表中取下一結(jié)點成為當(dāng)前擴(kuò)展結(jié)點,并重復(fù)上述結(jié)點擴(kuò)展過程。這個過程一直持續(xù)到找到滿足約束條件的解或活結(jié)點表為空時為止。73.常見的兩種分支限界法(1)隊列式(FIFO)分支限界法按照隊列先進(jìn)先出(FIFO)原則選取下一個結(jié)點成為擴(kuò)展結(jié)點。(隊列)

(2)優(yōu)先隊列式分支限界法按照優(yōu)先隊列中規(guī)定的優(yōu)先級選取優(yōu)先級最高的結(jié)點成為當(dāng)前擴(kuò)展結(jié)點。(利用堆排序)8堆具有如下性質(zhì):(1)堆是一棵完全二叉樹,k1為根結(jié)點。(2)堆的根結(jié)點是元素序列中的值最小或最大元素。根元素為最小元素的堆稱為最小堆,根元素為最大元素的堆稱為最大堆。(3)堆中任一子樹也是堆。

堆排序是利用堆頂記錄的關(guān)鍵值最小(或最大)的性質(zhì),從當(dāng)前待排序列中依次選取關(guān)鍵字最小(或最大)的記錄來進(jìn)行選擇排序的一種方法。在堆排序過程中,需要做兩方面的工作:(1)怎樣將給定的待排序記錄構(gòu)成一個初始堆;(2)輸出關(guān)鍵字最小(大)的記錄后,如何將剩余記錄整理成一個新的堆。9堆是n個元素的序列H={k1,k2,…kn},它滿足如下關(guān)系:或者根據(jù)堆的定義,堆可以看成一棵以k1為根的完全二叉樹。元素序列為{1,4,3,5,6,7,9,10,8}914356781064513210優(yōu)先隊列中規(guī)定的結(jié)點優(yōu)先級常用一個與該結(jié)點相關(guān)的數(shù)值p來表示,結(jié)點優(yōu)先級的高低與p值的大小相關(guān)。最大優(yōu)先隊列中規(guī)定p值較大的結(jié)點優(yōu)先級較高。最小優(yōu)先隊列中規(guī)定p值較小的結(jié)點優(yōu)先級較高。最大堆實現(xiàn)最小堆實現(xiàn)用優(yōu)先隊列式分支限界法解具體問題時,根據(jù)具體問題的特點確定選用最大優(yōu)先或最小優(yōu)先隊列來表示解空間的活結(jié)點表。11用隊列式分支限界法解此問題時,用一個隊列來存儲活結(jié)點表。隊頭隊尾活結(jié)點隊列起始結(jié)點為ABC

不可解BECFG

不可解EKFLMGNO對于n=3時的0-1背包問題,考慮下面例子:w=[16,15,15],p=[45,25,25],c=30。12隊列式分支限界法搜索解空間樹的方式與解空間樹的廣度優(yōu)先遍歷算法極為類似。唯一不同之處是隊列式分支限界法不搜索以不可行結(jié)點為根的子樹。優(yōu)先隊列式分支限界法也是從根結(jié)點A開始搜索解空間樹的。用極大堆來表示活結(jié)點表的優(yōu)先隊列,該優(yōu)先隊列的優(yōu)先級定義為活結(jié)點所獲得的價值。13w=[16,15,15],p=[45,25,25],c=30。初始堆為空,擴(kuò)展結(jié)點A得到它的2個兒子結(jié)點B,C。

價值45

價值0

不可解

價值45

不可解

價值45

01114尋求一個最優(yōu)解時,類似可用剪枝函數(shù)來加速搜索。函數(shù)給出每一個可行結(jié)點相應(yīng)子樹可能獲得的最大價值的上界。(如此上界不會比當(dāng)前最優(yōu)值更大)說明:相應(yīng)的子樹中不含問題的最優(yōu)解,可以剪去。另一方面,可將上界函數(shù)確定的每個結(jié)點的上界值作為優(yōu)先級,以該優(yōu)先級的非增序抽取當(dāng)前擴(kuò)展結(jié)點??筛杆俚恼业阶顑?yōu)解。15旅行售貨員問題:ABCDEFGHIJKLMNOPQ12343444433322221432301020456

初始擴(kuò)展結(jié)點CDECFGDHIEJKFL

費用為5916ABCDEFGHIJKLMNOPQ1234344443332222用極小堆來存儲活結(jié)點表,其優(yōu)先級是結(jié)點當(dāng)前的費用。

初始擴(kuò)展結(jié)點1432301020456結(jié)點E被擴(kuò)展。17可以用一個限界函數(shù)在搜索過程中裁剪子樹,減少活結(jié)點。此剪枝函數(shù)是當(dāng)前結(jié)點擴(kuò)展后得到的最小費用的一個下界。如果在當(dāng)前擴(kuò)展結(jié)點處,這個下界不比當(dāng)前最優(yōu)值更小,則以該結(jié)點為根的子樹可以剪去。另一方面,也可以把每個結(jié)點的下界作為優(yōu)先級,依非減序從活結(jié)點優(yōu)先隊列中抽取下一個擴(kuò)展結(jié)點。186.2 單源最短路徑問題單源最短路徑問題:在下圖所給的有向圖G中,每一邊都有一個非負(fù)邊權(quán)。求圖G的從源頂點①到目標(biāo)頂點⑤之間的最短路徑。123452144358111113323445Dijkstra算法過程19隊列式(FIFO)分支限界法123452144358135254452488936511隊列:41325455520優(yōu)先隊列式分支限界法123452144358123545428365923524552555利用堆依據(jù)優(yōu)先級選擇21算法從圖G的源頂點s和空優(yōu)先隊列開始。結(jié)點s被擴(kuò)展后,它的兒子結(jié)點被依次插入堆中。此后,算法從堆中取出具有最小當(dāng)前路長的結(jié)點作為當(dāng)前擴(kuò)展結(jié)點,并依次檢查與當(dāng)前擴(kuò)展結(jié)點相鄰的所有頂點。如果從當(dāng)前擴(kuò)展結(jié)點i到頂點j有邊可達(dá),且從源出發(fā),途經(jīng)頂點i再到頂點j的所相應(yīng)的路徑的長度小于當(dāng)前最優(yōu)路徑長度,則將該頂點作為活結(jié)點插入到活結(jié)點優(yōu)先隊列中。這個結(jié)點的擴(kuò)展過程一直繼續(xù)到活結(jié)點優(yōu)先隊列為空時為止。22下圖是用優(yōu)先隊列式分支限界法解有向圖G的單源最短路徑問題產(chǎn)生的解空間樹。其中,每一個結(jié)點旁邊的數(shù)字表示該結(jié)點所對應(yīng)的當(dāng)前路長。23剪枝策略在算法擴(kuò)展結(jié)點的過程中,一旦發(fā)現(xiàn)一個結(jié)點的下界不小于當(dāng)前找到的最短路長,則算法剪去以該結(jié)點為根的子樹。在算法中,利用結(jié)點間的控制關(guān)系進(jìn)行剪枝。從源頂點s出發(fā),2條不同路徑到達(dá)圖G的同一頂點。由于兩條路徑的路長不同,因此可以將路長長的路徑所對應(yīng)的樹中的結(jié)點為根的子樹剪去。24float[]dist:從源點到各頂點的最短路徑int[]p:路徑中當(dāng)前頂點的前驅(qū)結(jié)點初始化堆,dist[]=∞;while(true){for(j=1;j<n;j++){if(頂點i到頂點j可達(dá),且更短

){dist[j]=保留路徑長度;p[j]=i;

將頂點j加入堆中;

}}if(堆空)break;else出堆;}偽語言優(yōu)先隊列式分支限界法25

while(true){//搜索問題的解空間

for(intj=1;j<=n;j++){if(a[enode.i][j]<MAX_VALUE&&enode.length+a[enode.i][j]<dist[j]){//頂點i到頂點j可達(dá),且滿足控制約束

dist[j]=enode.length+a[enode.i][j];p[j]=enode.i;HeapNode*node=newHeapNode(j,dist[j]);heap.put(&node);//加入活結(jié)點優(yōu)先隊列}

}if(heap.isEmpty())break;elseenode=(HeapNode)heap.removeMin();}路徑長度length結(jié)點編號i堆結(jié)點結(jié)構(gòu)266.3裝載問題1.問題描述有n個集裝箱要裝上2艘載重量分別為C1和C2的輪船,其中集裝箱i的重量為Wi,且裝載問題要求確定是否有一個合理的裝載方案可以將這些集裝箱裝上這2艘輪船。如果有,找出一種裝載方案。27可以證明:如果裝載問題有解,則采用下面的策略可得到裝載方案。(1)首先將第1艘輪船盡可能裝滿;(2)將剩余的集裝箱裝上第2艘輪船。282.隊列式分支限界法在算法中,不斷重復(fù)下列操作,直到隊列空為止。檢測當(dāng)前擴(kuò)展結(jié)點的左兒子結(jié)點是否為可行結(jié)點。if(可行)將其加入到活結(jié)點隊列中;將其右兒子結(jié)點加入到活結(jié)點隊列中(右兒子結(jié)點一定是可行結(jié)點)。注意:當(dāng)2個兒子都產(chǎn)生后,當(dāng)前擴(kuò)展結(jié)點被舍棄。29舉例:w=[3,5,2,1]c=7012ew=3ew=03478ew=51314ew=61516ew=4561020ew=6ew=5919ew=7ew=81122ew=321ew=2122423ew=11817ew=830建立一個用于存放活結(jié)點的隊列queue,又稱為活結(jié)點隊列。隊列中元素的值表示活結(jié)點對應(yīng)的當(dāng)前載重量(ew)。為了便于處理,在解空間樹中,在同層最后一個結(jié)點之后,在隊列中添加一個-1。31活結(jié)點隊列中的隊首元素被取出作為當(dāng)前擴(kuò)展結(jié)點,由于隊列中每一層結(jié)點之后都有一個尾部標(biāo)記-1,故在取隊首元素時,活結(jié)點隊列一定不空。當(dāng)取出的元素是-1時,再判斷當(dāng)前隊列是否為空。如果隊列非空,則將尾部標(biāo)記-1加入活結(jié)點隊列,算法開始處理下一層的活結(jié)點。32while(true){

if(ew+w[i]<=c)enQueue(ew+w[i],i);//檢查左兒子結(jié)點

enQueue(ew,i);ew=queue.front();//取下一擴(kuò)展結(jié)點queue.pop();

if(ew==-1){if(queue.isEmpty())returnbestw;queue.push(-1);//同層結(jié)點尾部標(biāo)志

ew=queue.front();//取下一擴(kuò)展結(jié)點queue.pop();

i++;//進(jìn)入下一層

}}voidenQueue(intwt,inti){if(i==n){//到葉子結(jié)點更新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初始化隊列如圖(a)所示。此時,隊列非空,節(jié)點B和C依次進(jìn)入隊列。如圖(b)所示。值得注意的是,實際進(jìn)入隊列的是數(shù)值8和0,這里用節(jié)點B和C分別代替8和0,每個節(jié)點所代表的數(shù)值見其旁邊矩形中的數(shù)字,也就是約束函數(shù)值。B節(jié)點約束函數(shù)值為8,表示當(dāng)前目標(biāo)函數(shù)的下界為8。-1出隊列,而且此時隊列非空,因此-1進(jìn)隊列,同時節(jié)點B出隊列,如圖(c)所示。展開節(jié)點B,由于B節(jié)點的1分支節(jié)點的約束函數(shù)值為14,大于船的載重量12,因此1分支被剪支,B節(jié)點的0分支節(jié)點E無條件進(jìn)隊列,如圖(d)所示。分支限界C節(jié)點出隊列,該節(jié)點為擴(kuò)展節(jié)點,如圖(e)所示。展開節(jié)點C,C節(jié)點的兩個分支節(jié)點F和G均可以進(jìn)入隊列,如圖(f)所示。從隊列中取出擴(kuò)展節(jié)點E,如圖(g)所示。將節(jié)點E展開,其兩個分支節(jié)點J和K均為葉節(jié)點,不再展開。如圖(h)所示。此時,E節(jié)點的1分支節(jié)點J的約束函數(shù)值為10,表示當(dāng)前目標(biāo)函數(shù)值的下界更新為10,得到一個解[1,0,1],其重量為10。從隊列中依次取出擴(kuò)展節(jié)點F和G,將其展開,其分支節(jié)點為葉子,如圖(i)所示。此時隊列為空,搜索停止。如圖(j)所示。373.算法的改進(jìn)結(jié)點的左子樹表示將此集裝箱裝上船,右子樹表示不將此集裝箱裝上船。設(shè)bestw是當(dāng)前最優(yōu)解;ew是當(dāng)前擴(kuò)展結(jié)點所相應(yīng)的重量;r是剩余集裝箱的重量。當(dāng)ew+r>bestw時,才有可能存在更優(yōu)解,否則將其右子樹剪去。38算法的改進(jìn)//檢查左兒子結(jié)點intwt=ew+w[i];if(wt<=c){//可行結(jié)點//加入活結(jié)點隊列

if(i<n)queue.push(wt);}//檢查右兒子結(jié)點

if(ew+r>bestw&&i<n)//可能含最優(yōu)解

queue.push(ew);ew=queue.front();queue.pop();//取下一擴(kuò)展結(jié)點

……..;39算法的改進(jìn)//檢查左兒子結(jié)點intwt=ew+w[i];if(wt<=c){//可行結(jié)點

if(wt>bestw)bestw=wt;

//加入活結(jié)點隊列

if(i<n)queue.push(wt);}//檢查右兒子結(jié)點

if(ew+r>bestw&&i<n)//可能含最優(yōu)解

queue.push(ew);ew=queue.front();queue.pop();//取下一擴(kuò)展結(jié)點

……….;為了盡早剪掉無用的右子樹,可以在每次進(jìn)入左子樹時更新bestw的值。40舉例(同前例):n=3,w=[8,6,2],W=1241舉例:n=3,w=[8,6,2],W=12最初解空間樹如圖(a)所示。圖(b)中,兩個節(jié)點B和C是活節(jié)點,B的最大收益值是16,因此B是擴(kuò)展節(jié)點。優(yōu)先擴(kuò)展B,得到圖(c)。由于節(jié)點D不滿足約束條件,因此不會放入活節(jié)點表,即它被殺死,當(dāng)前活節(jié)點為C和E。由于E具有更大的上界函數(shù)值,因此E被優(yōu)先擴(kuò)展,得到圖(d)。E的1分支節(jié)點J已經(jīng)是葉節(jié)點,J不會放入活節(jié)點表,被殺死。此時J獲得載重量為10,等于其上界函數(shù)值10,而J的上界函數(shù)值是當(dāng)前活節(jié)點中上界值最大的,因此,擴(kuò)展其他節(jié)點不會得到比10還大的載重量。因此,分支限界搜索被終止。獲得最優(yōu)解[1,0,1],其最優(yōu)載重量為10。434.構(gòu)造最優(yōu)解為了在算法結(jié)束后能構(gòu)造出最優(yōu)解,必須存儲相應(yīng)子集樹中從活結(jié)點到根的路徑。為此,可在每個結(jié)點處設(shè)置指向父結(jié)點的指針,同時設(shè)置左、右兒子標(biāo)志。

structQNode{

QNodeparent;//父結(jié)點booleanleftChild;//左兒子標(biāo)志intweight;//結(jié)點所相應(yīng)的載重量};44找到最優(yōu)值后,可以根據(jù)parent,從葉子結(jié)點回溯到根結(jié)點,找到最優(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)先隊列式分支限界法解裝載問題的優(yōu)先隊列式分支限界法用最大優(yōu)先隊列存儲活結(jié)點表?;罱Y(jié)點x在優(yōu)先隊列中的優(yōu)先級定義為ew+r。46優(yōu)先隊列中優(yōu)先級最大的活結(jié)點成為下一個擴(kuò)展結(jié)點。以結(jié)點x為根的子樹中所有結(jié)點相應(yīng)的路徑的載重量不超過它的優(yōu)先級。子集樹中葉結(jié)點所相應(yīng)的載重量與其優(yōu)先級相同。在優(yōu)先隊列式分支限界法中,一旦有一個葉結(jié)點成為當(dāng)前擴(kuò)展結(jié)點,則可以斷言該葉結(jié)點所相應(yīng)的解即為最優(yōu)解。此時終止算法。47舉例:n=3,w=[8,6,2],W=1248舉例:n=3,w=[8,6,2],W=12496.40-1背包問題算法的思想首先,對輸入數(shù)據(jù)進(jìn)行預(yù)處理,將各物品依其單位重量價值從大到小進(jìn)行排列。

在優(yōu)先隊列分支限界法中,結(jié)點的優(yōu)先級為:

由已裝入的物品價值+剩余的最大單位重量價值的物品裝滿剩余容量的價值和。

50算法處理過程:首先檢查當(dāng)前擴(kuò)展結(jié)點的左兒子結(jié)點是否可行。如果左兒子是可行結(jié)點,將其加入到活結(jié)點優(yōu)先隊列中。當(dāng)前擴(kuò)展結(jié)點的右兒子結(jié)點一定是可行結(jié)點,僅當(dāng)右兒子結(jié)點滿足上界約束時才將它加入到活結(jié)點優(yōu)先隊列。當(dāng)擴(kuò)展到葉結(jié)點時得到問題的最優(yōu)值。51計算上界函數(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的價值i++;}

//裝填剩余容量裝滿背包if(i<=n)b+=p[i]/w[i]*cleft;returnb;//b為上界值52

while(i<=n){//非葉結(jié)點wt=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],i+1,enode,true);}up=bound(i+1);if(up>=bestp)//檢查右兒子結(jié)點addLiveNode(up,cp,cw,i+1,enode,false);

//取下一個擴(kuò)展節(jié)點(略)}bestp:當(dāng)前最優(yōu)價值cp:當(dāng)前總價值cw:當(dāng)前總重量536.5貨郎擔(dān)問題1.問題描述

某售貨員要到若干城市去推銷商品,已知各城市之間的路程(或旅費)。要選定一條從駐地出發(fā),經(jīng)過每個城市一次,最后回到駐地的路線,使總的路程(或總旅費)最小。

54路線是一個帶權(quán)圖。圖中各邊的費用(權(quán))為正數(shù)。圖的一條周游路線是包括V中的每個頂點在內(nèi)的一條回路。周游路線的費用是這條路線上所有邊的費用之和。

123430620105455貨郎擔(dān)問題的解空間可以組織成一棵排列樹,從樹的根結(jié)點到任一葉結(jié)點的路徑定義了圖的一條周游路線。貨郎擔(dān)問題要在圖G中找出費用最小的周游路線。56

4城市貨郎但問題的解空間是一棵排列樹。利用優(yōu)先隊列式分支限界法求解,可用一極小堆來存儲活結(jié)點表。其優(yōu)先級是結(jié)點的當(dāng)前費用。算法從排列樹的結(jié)點B和空優(yōu)先隊列開始。結(jié)點B被擴(kuò)展后,他的3個兒子結(jié)點被一次插入堆中。此時,由于E是堆中具有最小當(dāng)前費用的結(jié)點,所以處于堆頂?shù)奈恢?,他自然成為下一個擴(kuò)展結(jié)點。結(jié)點E被擴(kuò)展后,其兒子結(jié)點J和K被插入當(dāng)前堆中,他們的費用分別為14和24。此時堆頂元素為D,他成為下一個擴(kuò)展結(jié)點。他的2個兒子結(jié)點被插入堆中。此時堆中含有結(jié)點C,H,I,J,K。結(jié)點H具有最小費用,從而成為下一個擴(kuò)展結(jié)點。擴(kuò)展結(jié)點H后得到一條回路(1,3,2,4,1),相應(yīng)的費用為25。接下來結(jié)點J成為擴(kuò)展結(jié)點,由此得到另一條費用25的回路(1,4,2,3,1)。此后的兩個擴(kuò)展結(jié)點是K和I。由結(jié)點k得到的可行解費用高于當(dāng)前最優(yōu)解,結(jié)點I、C本身的費用已高于當(dāng)前最優(yōu)解,從而他們都不能得到更好的解。最后,優(yōu)先隊列為空,算法終止。463010520572.算法描述(最小權(quán)值分支界限法)

首先,創(chuàng)建一個最小堆,用于表示活結(jié)點優(yōu)先隊列。堆中每個結(jié)點存儲從根結(jié)點到該活結(jié)點的相應(yīng)路徑長度。堆結(jié)點中包括:

int[]x:用于記錄當(dāng)前解

s:結(jié)點在排序樹中的層次,從0到s的路徑為x[0:s]

cc:表示當(dāng)前費用

lcost:子樹費用的下界,是隊列的優(yōu)先級

rcost:是x[s:n-1]中最小出邊費用和58在實現(xiàn)過程中,用鄰接矩陣表示給的圖G。每個結(jié)點的lcost作為優(yōu)先隊列的優(yōu)先級。基本處理過程為:計算圖中每個頂點的最小費用出邊并用minout記錄。如果所給的有向圖中某個頂點沒有出邊,則該圖不可能有回路,算法結(jié)束,否則繼續(xù)后續(xù)的處理。59//第一個擴(kuò)展結(jié)點是Bwhile(沒有到葉子結(jié)點){//完成對排列樹內(nèi)部結(jié)點的擴(kuò)展。

if(擴(kuò)展結(jié)點是葉子結(jié)點的父結(jié)點(n-2)){

if(有回路且更優(yōu)){記錄最優(yōu)值,并將該葉結(jié)點插入到優(yōu)先隊列中

}

}else{依次產(chǎn)生當(dāng)前擴(kuò)展結(jié)點的所有兒子結(jié)點。由于當(dāng)前擴(kuò)展結(jié)點所相應(yīng)的路徑是x[0:s],其可行兒子結(jié)點從剩余頂點x[s+1:n-1]中選取x[i],且(x[s],x[i])是所給有向圖G中的一條邊。對于當(dāng)前擴(kuò)展結(jié)點的每一個可行兒子結(jié)點,如果有可能產(chǎn)生更優(yōu)解,將其插入優(yōu)先隊列中。

}

從優(yōu)先隊列中取下一個結(jié)點作為新的擴(kuò)展結(jié)點}606.6作業(yè)分配問題n個操作員以n種不同時間完成n種不同作業(yè)。要求分配每位操作員完成一項工作,使完成n項工作的總時間最少。利用分支限界法解作業(yè)分配問題。方便起見,把n個操作員編號為0,1,...,n-1,把n個作業(yè)也編號為0,1,...,n-1。用矩陣c來描述每位操作員完成每個作業(yè)時所需的時間。例如,元素cij

表示第i位操作員完成第j號作業(yè)所需的時間。下圖是4個操作員完成4個作業(yè)所需的時間表。求解作業(yè)最優(yōu)分配方案。

613841291213587931276801230123(作業(yè))

第0行的4個數(shù)據(jù)分別表示第0位操作員完成4個作業(yè)所需時間。當(dāng)把第0號作業(yè)分配給第0位操作員時,c00=3.

而1號作業(yè)分別由其余3位操作員單獨完成時,最短時間是7,第2號作業(yè)最短時間為6,第3號作業(yè)最短時間為3。因此當(dāng)把第0號作業(yè)分配給第0位操作員時,所需時間至少不會少于3+7+6+3=19,可以把它看成是在根節(jié)點下第0個兒子節(jié)點的下界。如果把第0號作業(yè)分配給第1位操作員時,所需時間至少不會小于9+7+4+3=23,可以把它看成是在根節(jié)點下第1個兒子節(jié)點的下界。62令tik表示在某個搜索深度k下,把作業(yè)k分配給操作員i時的時間下界。則當(dāng)k=0時,有t00=3+7+6+3=19t10=9+7+4+3=23t20=8+7+4+5=24t30=12+7+4+3=26于是在根節(jié)點下建立4個兒子節(jié)點2、3、4、5,對應(yīng)于把第0號作業(yè)分別分配給第0、1、2、3號操作員,其下界分別為19,23,24,26。把這些節(jié)點都插入最小堆中,這時節(jié)點2的下界最小。把它從堆頂取下,并由它向下繼續(xù)搜索,生成3個兒子節(jié)點,分別為6、7、8?!?24316211234311020301923242678112100229101232211113213841291213587931276801230123636.7布線問題問題的提出:印刷電路板將布線區(qū)域劃分成n*m個方格陣列,要求確定連接方格a的中點到方格b的中點的最短布線方案。在布線時,電路只能沿直線或直角布線,為了避免線路相交,已布了線的方格做了封鎖標(biāo)記,其他線路不允許穿過被封鎖的方格。ab641.算法思想討論用隊列分支限界法來解布線問題。布線問題的解空間是一個圖。解此問題的隊列式分支限界法從起始位置a開始將它作為第一個擴(kuò)展結(jié)點。與該擴(kuò)展結(jié)點相鄰并且可達(dá)的方格成為可行結(jié)點被加入到活結(jié)點隊列中,并且將這些方格標(biāo)記為1,即從起始方格a到這些方格的距離為1。65接著,算法從活結(jié)點隊列中取出隊首結(jié)點作為下一個擴(kuò)展結(jié)點,并將與當(dāng)前擴(kuò)展結(jié)點相鄰且未標(biāo)記過的方格標(biāo)記為2,并存入活結(jié)點隊列。這個過程一直繼續(xù)到算法搜索到目標(biāo)方格b或活結(jié)點隊列為空時為止。即加入剪枝的廣度優(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;//上定義移動方向的相對位移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)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論