版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
主要內(nèi)容:理解分支限界法的剪枝搜索策略。掌握分支限界法的算法框架隊列式(FIFO)分支限界法優(yōu)先隊列式分支限界法
通過應用范例學習分支限界法的設(shè)計策略。單源最短路徑問題裝載問題;布線問題0-1背包問題;最大團問題;旅行售貨員問題電路板排列問題批處理作業(yè)調(diào)度問題主要內(nèi)容:理解分支限界法的剪枝搜索策略。9.1 分支限界法的基本思想1.分支限界法與回溯法的不同(1)求解目標:回溯法的求解目標是找出解空間樹中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的一個解,或是在滿足約束條件的解中找出在某種意義下的最優(yōu)解。
(2)搜索方式的不同:回溯法以深度優(yōu)先的方式搜索解空間樹,而分支限界法則以廣度優(yōu)先或以最小耗費優(yōu)先的方式搜索解空間樹。
9.1 分支限界法的基本思想1.分支限界法與回溯法的不同9.1 分支限界法的基本思想2.分支限界法基本思想
分支限界法常以廣度優(yōu)先或以最小耗費(最大效益)優(yōu)先的方式搜索問題的解空間樹。
在分支限界法中,每一個活結(jié)點只有一次機會成為擴展結(jié)點。活結(jié)點一旦成為擴展結(jié)點,就一次性產(chǎn)生其所有兒子結(jié)點。在這些兒子結(jié)點中,導致不可行解或?qū)е路亲顑?yōu)解的兒子結(jié)點被舍棄,其余兒子結(jié)點被加入活結(jié)點表中。
此后,從活結(jié)點表中取下一結(jié)點成為當前擴展結(jié)點,并重復上述結(jié)點擴展過程。這個過程一直持續(xù)到找到所需的解或活結(jié)點表為空時為止。
9.1 分支限界法的基本思想2.分支限界法基本思想9.1 分支限界法的基本思想3.常見的兩種分支限界法(1)隊列式(FIFO)分支限界法
按照隊列先進先出(FIFO)原則選取下一個節(jié)點為擴展節(jié)點。
(2)優(yōu)先隊列式分支限界法
按照優(yōu)先隊列中規(guī)定的優(yōu)先級選取優(yōu)先級最高的節(jié)點成為當前擴展節(jié)點。9.1 分支限界法的基本思想3.常見的兩種分支限界法9.2 單源最短路徑問題1.問題描述
下面以一個例子來說明單源最短路徑問題:在下圖所給的有向圖G中,每一邊都有一個非負邊權(quán)。要求圖G的從源頂點s到目標頂點t之間的最短路徑。
9.2 單源最短路徑問題1.問題描述下面以一個9.2 單源最短路徑問題
下圖是用優(yōu)先隊列式分支限界法解有向圖G的單源最短路徑問題產(chǎn)生的解空間樹。其中,每一個結(jié)點旁邊的數(shù)字表示該結(jié)點所對應的當前路長。9.2 單源最短路徑問題下圖是用優(yōu)先隊列式分支限界法9.2 單源最短路徑問題2.算法思想
解單源最短路徑問題的優(yōu)先隊列式分支限界法用一極小堆來存儲活結(jié)點表。其優(yōu)先級是結(jié)點所對應的當前路長。
算法從圖G的源頂點s和空優(yōu)先隊列開始。結(jié)點s被擴展后,它的兒子結(jié)點被依次插入堆中。此后,算法從堆中取出具有最小當前路長的結(jié)點作為當前擴展結(jié)點,并依次檢查與當前擴展結(jié)點相鄰的所有頂點。如果從當前擴展結(jié)點i到頂點j有邊可達,且從源出發(fā),途經(jīng)頂點i再到頂點j的所相應的路徑的長度小于當前最優(yōu)路徑長度,則將該頂點作為活結(jié)點插入到活結(jié)點優(yōu)先隊列中。這個結(jié)點的擴展過程一直繼續(xù)到活結(jié)點優(yōu)先隊列為空時為止。9.2 單源最短路徑問題2.算法思想9.2 單源最短路徑問題3.剪枝策略
在算法擴展結(jié)點的過程中,一旦發(fā)現(xiàn)一個結(jié)點的下界不小于當前找到的最短路長,則算法剪去以該結(jié)點為根的子樹。
在算法中,利用結(jié)點間的控制關(guān)系進行剪枝。從源頂點s出發(fā),2條不同路徑到達圖G的同一頂點。由于兩條路徑的路長不同,因此可以將路長長的路徑所對應的樹中的結(jié)點為根的子樹剪去。
9.2 單源最短路徑問題3.剪枝策略9.2 單源最短路徑問題
while(true){//搜索問題的解空間for(intj=1;j<=n;j++)if(a[enode.i][j]<Float.MAX_VALUE&&enode.length+a[enode.i][j]<dist[j]){//頂點i到頂點j可達,且滿足控制約束dist[j]=enode.length+a[enode.i][j];p[j]=enode.i;HeapNodenode=newHeapNode(j,dist[j]);heap.put(node);//加入活結(jié)點優(yōu)先隊列}
if(heap.isEmpty())break;elseenode=(HeapNode)heap.removeMin();}頂點I和j間有邊,且此路徑長小于原先從原點到j的路徑長
9.2 單源最短路徑問題while(true)頂點I和j9.2多段圖問題1.問題的描述
●在多段圖中求從s到t的一條最小成本的路徑,可以看作是在k-2個段作出某種決策的結(jié)果。
●第i次決策決定Vi+1中的哪個結(jié)點在這條路徑上,這里1≤i≤k-2;
●最優(yōu)性原理對多段圖問題成立9.2多段圖問題1.問題的描述2.向前處理策略求解
設(shè)P(i,j)是一條從Vi中的結(jié)點j到匯點t的最小成本路徑,
COST(i,j)是這條路徑的成本。1)向前遞推式2)遞推過程
★第k-1段c(j,t)<j,t>∈ECOST(k-1,j)=
∞2.向前處理策略求解l1l2...lpi+1t…jViVi+1l1l2.lpi+1t…jViVi+112345678910111297324227111181456356425V1V2V3V4V55段圖123456789101112973242271111814★各遞推結(jié)果第4段COST(4,9)=c(9,12)=4
COST(4,10)=c(10,12)=2COST(4,11)=c(11,12)=5第3段COST(3,6)=min{6+COST(4,9),5+COST(4,10)}=7COST(3,7)=min{4+COST(4,9),3+COST(4,10)}=5COST(3,8)=min{5+COST(4,10),6+COST(4,11)}=7第2段COST(2,2)=min{4+COST(3,6),2+COST(3,7),1+COST(3,8)}=7COST(2,3)=9COST(2,4)=18COST(2,5)=15第1段COST(1,1)=min{9+COST(2,2),7+COST(2,3),3+COST(2,4),2+COST(2,5)}=16S到t的最小成本路徑的成本
=16★各遞推結(jié)果★最小成本路徑的求取
記D(i,j)=每一COST(i,j)的決策
即,使c(j,l)+COST(i+1,l)取得最小值的l值。
例:D(3,6)=10,D(3,7)=10D(3,8)=10D(2,2)=7,D(2,3)=6,D(2,4)=8,D(2,5)=8D(1,1)=2
根據(jù)D(1,1)的決策值向后遞推求取最小成本路徑:
●v2=D(1,1)=2●v3=D(2,D(1,1))=7●v4=D(3,D(2,D(1,1)))=D(3,7)=10
故由s到t的最小成本路徑是:1→2→7→10→12
★最小成本路徑的求取3)算法描述★結(jié)點的編號規(guī)則
源點s編號為1,然后依次對V2、V3…Vk-1中的結(jié)點編號,匯點t編號為n。
目的:使對COST和D的計算僅按n-1,n-2,…,1的次序計算即可,無需考慮標示結(jié)點所在段的第一個下標?!锼惴枋?)算法描述算法4.1多段圖的向前處理算法procedureFGRAPH(E,k,n,P)//輸入是按段的順序給結(jié)點編號的,有n個結(jié)點的k段圖。E是邊
集,c(i,j)是邊<i,j>的成本。P(1:k)帶出最小成本路徑//realCOST(n);integerD(n-1),P(k),r,j,k,nCOST(n)←0forj←n-1to1by-1do//計算COST(j)//
設(shè)r是具有性質(zhì):<j,r>∈E且使c(j,r)+COST(r)取最小值的結(jié)點COST(j)←c(j,r)+COST(r)D(j)←r//記錄決策值//repeatP(1)←1;P(k)←nforj←2tok-1do//找路徑上的第j個結(jié)點//P(j)←D(P(j-1))//回溯求出該路徑//repeatendFGRAPH算法4.1多段圖的向前處理算法算法的時間復雜度
若G采用鄰接表表示,總計算時間為:算法的時間復雜度3.向后處理策略求解
設(shè)BP(i,j)是一條從源點s到Vi中的結(jié)點j的最小成本路徑,
BCOST(i,j)是這條路徑的成本。1)向后遞推式2)遞推過程
★第2段c(1,j)<1,j>∈ECOST(2,j)=
∞3.向后處理策略求解12345678910111297324227111181456356425V1V2V3V4V55段圖123456789101112973242271111814★各遞推結(jié)果第2段
BCOST(2,2)=9BCOST(2,3)=7BCOST(2,4)=3BCOST(2,5)=2第3段BCOST(3,6)=min{BCOST(2,2)+4,BCOST(2,3)+2}=9BCOST(3,7)=min{BCOST(2,2)+2,BCOST(2,3)+7,BCOST(2,5)+11}=11BCOST(3,8)=min{BCOST(2,4)+11,BCOST(2,5)+8}=10第4段BCOST(4,9)=min{BCOST(3,6)+6,BCOST(3,7)+4}=15BCOST(4,10)=min{BCOST(3,6)+5,BCOST(3,7)+3,BCOST(3,8)+5}=14BCOST(4,11)=min{BCOST(3,8)+6}=16第5段BCOST(5,12)=min{BCOST(4,9)+4,BCOST(4,10)+2,BCOST(4,11)+5}=16S到t的最小成本路徑的成本
=
16★各遞推結(jié)果★最小成本路徑的求取
記BD(i,j)=每一COST(i,j)的決策
即,使COST(i-1,l)+c(l,j)取得最小值的l值。
例:BD(3,6)=3,BD(3,7)=2,BD(3,8)=5BD(4,9)=6,BD(4,10)=7,BD(4,11)=8BD(5,12)=10
根據(jù)D(5,12)的決策值向前遞推求取最小成本路徑:
●v4=BD(5,12)=10●v3=BD(4,BD(5,12))=7●v2=BD(3,BD(4,BD(5,12)))=BD(3,7)=2
故由s到t的最小成本路徑是:1→2→7→10→12
★最小成本路徑的求取算法4.2多段圖的向后處理算法procedureBGRAPH(E,k,n,P)//輸入是按段的順序給結(jié)點編號的,有n個結(jié)點的k段圖。E是邊
集,c(i,j)是邊<i,j>的成本。P(1:k)帶出最小成本路徑//realBCOST(n);integerBD(n-1),P(k),r,j,k,nBCOST(1)←0forj←2tondo//計算BCOST(j)//
設(shè)r是具有<r,j>∈E且使BCOST(r)+c(r,j)取最小值性質(zhì)的結(jié)點BCOST(j)←BCOST(r)+c(r,j)BD(j)←r//記錄決策值//repeatP(1)←1;P(k)←nforj←k-1to2by-1do//找路徑上的第j個結(jié)點//P(j)←D(P(j+1))//回溯求出該路徑//repeatendBGRAPH算法4.2多段圖的向后處理算法4.多段圖問題的應用實例-資源的分配問題
將n個資源分配給r個項目的問題:如果把j個資源,0≤j≤n,分配給項目i,可以獲得N(i,j)的凈利。
問題:如何將這n個資源分配給r個項目才能使各項目獲得的凈利之和達到最大。
轉(zhuǎn)換成一個多段圖問題求解。4.多段圖問題的應用實例-資源的分配問題
用r+1段圖描述該問題:
段:1到r之間的每個段i表示項目i。
結(jié)點:i=1時,只有一個結(jié)點——源點s=V(1,0)
當2≤i≤r時,每段有n+1個結(jié)點,每個結(jié)點具有形式
V(i,j):表示到項目i之前為止,共把j個資源分配給了
前i-1個項目,j=0,1,…,n。
匯點t=V(r+1,n)
邊的一般形式:<V(i,j),V(i+1,l)>,j≤l,1≤i≤r
成本:★當j≤l且1≤i≤r時,邊<V(i,j),V(i+1,l)>賦予成本N(i,l-j),表示給項目i分配l-j個資源所可能獲得的凈利?!锂攋≤n且i=r時,此時的邊為:<V(r,j),V(r+1,n)>,該邊賦
予成本:指向匯點的邊注,并不是分給的資源越多,得到的凈利就越大用r+1段圖描述該問題:指向匯點的邊注,并不是實例:將4個資源分配給3個項目。構(gòu)成一個4段圖。
問題的解:資源的最優(yōu)分配方案由一條s到t的最大成本路徑給出——改變邊成本的符號,從而將問題轉(zhuǎn)換成為求取最小成本路徑問題。實例:將4個資源分配給3個項目。構(gòu)成一個4段圖。9.3裝載問題1.問題描述有一批共個集裝箱要裝上2艘載重量分別為C1和C2的輪船,其中集裝箱i的重量為Wi,且裝載問題要求確定是否有一個合理的裝載方案可將這個集裝箱裝上這2艘輪船。如果有,找出一種裝載方案。
容易證明:如果一個給定裝載問題有解,則采用下面的策略可得到最優(yōu)裝載方案。
(1)首先將第一艘輪船盡可能裝滿;(2)將剩余的集裝箱裝上第二艘輪船。
9.3裝載問題1.問題描述有一批共個集裝箱要裝上2艘載重9.3裝載問題2.隊列式分支限界法
在算法的while循環(huán)中,首先檢測當前擴展結(jié)點的左兒子結(jié)點是否為可行結(jié)點。如果是則將其加入到活結(jié)點隊列中。然后將其右兒子結(jié)點加入到活結(jié)點隊列中(右兒子結(jié)點一定是可行結(jié)點)。2個兒子結(jié)點都產(chǎn)生后,當前擴展結(jié)點被舍棄。
活結(jié)點隊列中的隊首元素被取出作為當前擴展結(jié)點,由于隊列中每一層結(jié)點之后都有一個尾部標記-1,故在取隊首元素時,活結(jié)點隊列一定不空。當取出的元素是-1時,再判斷當前隊列是否為空。如果隊列非空,則將尾部標記-1加入活結(jié)點隊列,算法開始處理下一層的活結(jié)點。9.3裝載問題2.隊列式分支限界法9.3裝載問題2.隊列式分支限界法while(true){if(ew+w[i]<=c)enQueue(ew+w[i],i);//檢查左兒子結(jié)點enQueue(ew,i);//右兒子結(jié)點總是可行的ew=((Integer)queue.remove()).intValue();//取下一擴展結(jié)點if(ew==-1){if(queue.isEmpty())returnbestw;queue.put(newInteger(-1));//同層結(jié)點尾部標志ew=((Integer)queue.remove()).intValue();//取下一擴展結(jié)點i++;//進入下一層}}9.3裝載問題2.隊列式分支限界法while(true9.3裝載問題3.算法的改進
節(jié)點的左子樹表示將此集裝箱裝上船,右子樹表示不將此集裝箱裝上船。設(shè)bestw是當前最優(yōu)解;ew是當前擴展結(jié)點所相應的重量;r是剩余集裝箱的重量。則當ew+rbestw時,可將其右子樹剪去,因為此時若要船裝最多集裝箱,就應該把此箱裝上船。
另外,為了確保右子樹成功剪枝,應該在算法每一次進入左子樹的時候更新bestw的值。9.3裝載問題3.算法的改進9.3裝載問題3.算法的改進//檢查左兒子結(jié)點intwt=ew+w[i];if(wt<=c){//可行結(jié)點if(wt>bestw)bestw=wt;
//加入活結(jié)點隊列if(i<n)queue.put(newInteger(wt));}提前更新bestw
//檢查右兒子結(jié)點
if(ew+r>bestw&&i<n)//可能含最優(yōu)解queue.put(newInteger(ew));
ew=((Integer)queue.remove()).intValue();//取下一擴展結(jié)點
右兒子剪枝
9.3裝載問題3.算法的改進//檢查左兒子結(jié)點提前更新9.3裝載問題4.構(gòu)造最優(yōu)解
為了在算法結(jié)束后能方便地構(gòu)造出與最優(yōu)值相應的最優(yōu)解,算法必須存儲相應子集樹中從活結(jié)點到根結(jié)點的路徑。為此目的,可在每個結(jié)點處設(shè)置指向其父結(jié)點的指針,并設(shè)置左、右兒子標志。
privatestaticclassQNode{QNodeparent;//父結(jié)點booleanleftChild;//左兒子標志intweight;//結(jié)點所相應的載重量9.3裝載問題4.構(gòu)造最優(yōu)解9.3裝載問題找到最優(yōu)值后,可以根據(jù)parent回溯到根節(jié)點,找到最優(yōu)解。//構(gòu)造當前最優(yōu)解for(intj=n;j>0;j--){bestx[j]=(e.leftChild)?1:0;e=e.parent;}9.3裝載問題找到最優(yōu)值后,可以根據(jù)parent回溯到根節(jié)9.3裝載問題5.優(yōu)先隊列式分支限界法
解裝載問題的優(yōu)先隊列式分支限界法用最大優(yōu)先隊列存儲活結(jié)點表?;罱Y(jié)點x在優(yōu)先隊列中的優(yōu)先級定義為從根結(jié)點到結(jié)點x的路徑所相應的載重量再加上剩余集裝箱的重量之和。
優(yōu)先隊列中優(yōu)先級最大的活結(jié)點成為下一個擴展結(jié)點。以結(jié)點x為根的子樹中所有結(jié)點相應的路徑的載重量不超過它的優(yōu)先級。子集樹中葉結(jié)點所相應的載重量與其優(yōu)先級相同。
在優(yōu)先隊列式分支限界法中,一旦有一個葉結(jié)點成為當前擴展結(jié)點,則可以斷言該葉結(jié)點所相應的解即為最優(yōu)解。此時可終止算法。
9.3裝載問題5.優(yōu)先隊列式分支限界法9.4布線問題算法的思想
解此問題的隊列式分支限界法從起始位置a開始將它作為第一個擴展結(jié)點。與該擴展結(jié)點相鄰并且可達的方格成為可行結(jié)點被加入到活結(jié)點隊列中,并且將這些方格標記為1,即從起始方格a到這些方格的距離為1。
接著,算法從活結(jié)點隊列中取出隊首結(jié)點作為下一個擴展結(jié)點,并將與當前擴展結(jié)點相鄰且未標記過的方格標記為2,并存入活結(jié)點隊列。這個過程一直繼續(xù)到算法搜索到目標方格b或活結(jié)點隊列為空時為止。即加入剪枝的廣度優(yōu)先搜索。9.4布線問題算法的思想9.4布線問題Position[]offset=newPosition[4];offset[0]=newPosition(0,1);//右offset[1]=newPosition(1,0);//下offset[2]=newPosition(0,-1);//左offset[3]=newPosition(-1,0);//上
定義移動方向的相對位移for(inti=0;i<=size+1;i++){grid[0][i]=grid[size+1][i]=1;//頂部和底部grid[i][0]=grid[i][size+1]=1;//左翼和右翼}設(shè)置邊界的圍墻9.4布線問題Position[]offset=n9.4布線問題for(inti=0;i<numOfNbrs;i++){nbr.row=here.row+offset[i].row;nbr.col=here.col+offset[i].col;if(grid[nbr.row][nbr.col]==0){//該方格未標記grid[nbr.row][nbr.col]=grid[here.row][here.col]+1;if((nbr.row==finish.row)&&(nbr.col==finish.col))break;q.put(newPosition(nbr.row,nbr.col));}}找到目標位置后,可以通過回溯方法找到這條最短路徑。9.4布線問題for(inti=0;i<nu9.50-1背包問題算法的思想
首先,要對輸入數(shù)據(jù)進行預處理,將各物品依其單位重量價值從大到小進行排列。
在下面描述的優(yōu)先隊列分支限界法中,節(jié)點的優(yōu)先級由已裝袋的物品價值加上剩下的最大單位重量價值的物品裝滿剩余容量的價值和。
算法首先檢查當前擴展結(jié)點的左兒子結(jié)點的可行性。如果該左兒子結(jié)點是可行結(jié)點,則將它加入到子集樹和活結(jié)點優(yōu)先隊列中。當前擴展結(jié)點的右兒子結(jié)點一定是可行結(jié)點,僅當右兒子結(jié)點滿足上界約束時才將它加入子集樹和活結(jié)點優(yōu)先隊列。當擴展到葉節(jié)點時為問題的最優(yōu)值。9.50-1背包問題算法的思想9.50-1背包問題上界函數(shù)while(i<=n&&w[i]<=cleft)//n表示物品總數(shù),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為上界函數(shù)9.50-1背包問題上界函數(shù)9.50-1背包問題while(i!=n+1){//
非葉結(jié)點doublewt=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);
//取下一個擴展節(jié)點(略)}分支限界搜索過程9.50-1背包問題while(i!=n+9.6最大團問題問題描述
給定無向圖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的最大團。
9.6最大團問題問題描述9.6最大團問題2.上界函數(shù)
用變量cliqueSize表示與該結(jié)點相應的團的頂點數(shù);level表示結(jié)點在子集空間樹中所處的層次;用cliqueSize+n-level+1作為頂點數(shù)上界upperSize的值。
在此優(yōu)先隊列式分支限界法中,upperSize實際上也是優(yōu)先隊列中元素的優(yōu)先級。算法總是從活結(jié)點優(yōu)先隊列中抽取具有最大upperSize值的元素作為下一個擴展元素。
9.6最大團問題2.上界函數(shù)9.6最大團問題3.算法思想
子集樹的根結(jié)點是初始擴展結(jié)點,對于這個特殊的擴展結(jié)點,其cliqueSize的值為0。
算法在擴展內(nèi)部結(jié)點時,首先考察其左兒子結(jié)點。在左兒子結(jié)點處,將頂點i加入到當前團中,并檢查該頂點與當前團中其他頂點之間是否有邊相連。當頂點i與當前團中所有頂點之間都有邊相連,則相應的左兒子結(jié)點是可行結(jié)點,將它加入到子集樹中并插入活結(jié)點優(yōu)先隊列,否則就不是可行結(jié)點。
接著繼續(xù)考察當前擴展結(jié)點的右兒子結(jié)點。當upperSize>bestn時,右子樹中可能含有最優(yōu)解,此時將右兒子結(jié)點加入到子集樹中并插入到活結(jié)點優(yōu)先隊列中。9.6最大團問題3.算法思想9.6最大團問題
算法的while循環(huán)的終止條件是遇到子集樹中的一個葉結(jié)點(即n+1層結(jié)點)成為當前擴展結(jié)點。
對于子集樹中的葉結(jié)點,有upperSize=cliqueSize。此時活結(jié)點優(yōu)先隊列中剩余結(jié)點的upperSize值均不超過當前擴展結(jié)點的upperSize值,從而進一步搜索不可能得到更大的團,此時算法已找到一個最優(yōu)解。
9.6最大團問題算法的while循環(huán)的終止條9.7旅行售貨員問題1.問題描述
某售貨員要到若干城市去推銷商品,已知各城市之間的路程(或旅費)。他要選定一條從駐地出發(fā),經(jīng)過每個城市一次,最后回到駐地的路線,使總的路程(或總旅費)最小。
路線是一個帶權(quán)圖。圖中各邊的費用(權(quán))為正數(shù)。圖的一條周游路線是包括V中的每個頂點在內(nèi)的一條回路。周游路線的費用是這條路線上所有邊的費用之和。
旅行售貨員問題的解空間可以組織成一棵樹,從樹的根結(jié)點到任一葉結(jié)點的路徑定義了圖的一條周游路線。旅行售貨員問題要在圖G中找出費用最小的周游路線。
9.7旅行售貨員問題1.問題描述9.7旅行售貨員問題2.算法描述
算法開始時創(chuàng)建一個最小堆,用于表示活結(jié)點優(yōu)先隊列。堆中每個結(jié)點的子樹費用的下界lcost值是優(yōu)先隊列的優(yōu)先級。接著算法計算出圖中每個頂點的最小費用出邊并用minout記錄。如果所給的有向圖中某個頂點沒有出邊,則該圖不可能有回路,算法即告結(jié)束。如果每個頂點都有出邊,則根據(jù)計算出的minout作算法初始化。
算法的while循環(huán)體完成對排列樹內(nèi)部結(jié)點的擴展。對于當前擴展結(jié)點,算法分2種情況進行處理:9.7旅行售貨員問題2.算法描述9.7旅行售貨員問題1、首先考慮s=n-2的情形,此時當前擴展結(jié)點是排列樹中某個葉結(jié)點的父結(jié)點。如果該葉結(jié)點相應一條可行回路且費用小于當前最小費用,則將該葉結(jié)點插入到優(yōu)先隊列中,否則舍去該葉結(jié)點。2、當s<n-2時,算法依次產(chǎn)生當前擴展結(jié)點的所有兒子結(jié)點。由于當前擴展結(jié)點所相應的路徑是x[0:s],其可行兒子結(jié)點是從剩余頂點x[s+1:n-1]中選取的頂點x[i],且(x[s],x[i])是所給有向圖G中的一條邊。對于當前擴展結(jié)點的每一個可行兒子結(jié)點,計算出其前綴(x[0:s],x[i])的費用cc和相應的下界lcost。當lcost<bestc時,將這個可行兒子結(jié)點插入到活結(jié)點優(yōu)先隊列中。
9.7旅行售貨員問題1、首先考慮s=n-2的情形,9.7旅行售貨員問題
算法中while循環(huán)的終止條件是排列樹的一個葉結(jié)點成為當前擴展結(jié)點。當s=n-1時,已找到的回路前綴是x[0:n-1],它已包含圖G的所有n個頂點。因此,當s=n-1時,相應的擴展結(jié)點表示一個葉結(jié)點。此時該葉結(jié)點所相應的回路的費用等于cc和lcost的值。剩余的活結(jié)點的lcost值不小于已找到的回路的費用。它們都不可能導致費用更小的回路。因此已找到的葉結(jié)點所相應的回路是一個最小費用旅行售貨員回路,算法可以結(jié)束。
算法結(jié)束時返回找到的最小費用,相應的最優(yōu)解由數(shù)組v給出。
9.7旅行售貨員問題算法中while循環(huán)的終止條件是9.8電路板排列問題算法描述
算法開始時,將排列樹的根結(jié)點置為當前擴展結(jié)點。在do-while循環(huán)體內(nèi)算法依次從活結(jié)點優(yōu)先隊列中取出具有最小cd值的結(jié)點作為當前擴展結(jié)點,并加以擴展。
首先考慮s=n-1的情形,當前擴展結(jié)點是排列樹中的一個葉結(jié)點的父結(jié)點。x表示相應于該葉結(jié)點的電路板排列。計算出與x相應的密度并在必要時更新當前最優(yōu)值和相應的當前最優(yōu)解。
當s<n-1時,算法依次產(chǎn)生當前擴展結(jié)點的所有兒子結(jié)點。對于當前擴展結(jié)點的每一個兒子結(jié)點node,計算出其相應的密度node.cd。當node.cd<bestd時,將該兒子結(jié)點N插入到活結(jié)點優(yōu)先隊列中。9.8電路板排列問題算法描述9.8電路板排列問題算法描述doif(enode.s==n-1){//僅一個兒子結(jié)點intld=0;//最后一塊電路板的密度for(intj=1;j<=m;j++)ld+=board[enode.x[n]][j];if(ld<bestd){//找到密度更小的電路板排列x=enode.x;bestd=Math.max(ld,enode.cd);
}}S=n-1的情況,計算出此時的密度和bestd進行比較。9.8電路板排列問題算法描述doS=n-1的情況,計算出此9.8電路板排列問題算法描述else{//產(chǎn)生當前擴展結(jié)點的所有兒子結(jié)點for(inti=enode.s+1;i<=n;i++){HeapNodenode=newHeapNode(0,newint[m+1],0,newint[n+1]);for(intj=1;j<=m;j++)
//新插入的電路板node.now[j]=enode.now[j]+board[enode.x[i]][j];9.8電路板排列問題算法描述else9.8電路板排列問題intld=0;//新插入電路板的密度for(intj=1;j<=m;j++)if(node.now[j]>0&&total[j]!=node.now[j])ld++;node.cd=Math.max(ld,enode.cd);if(node.cd<bestd){//可能產(chǎn)生更好的葉結(jié)點node.s=enode.s+1;for(intj=1;j<=n;j++)node.x[j]=enode.x[j];node.x[node.s]=enode.x[i];node.x[i]=enode.x[node.s];heap.put(node);}}}
算法描述9.8電路板排列問題intld=0;//新插入9.9批處理作業(yè)問題1.問題的描述
給定n個作業(yè)的集合J={J1,J2,…,Jn}。每一個作業(yè)Ji都有2項任務要分別在2臺機器上完成。每一個作業(yè)必須先由機器1處理,然后再由機器2處理。作業(yè)Ji需要機器j的處理時間為tji,i=1,2,…,n;j=1,2。對于一個確定的作業(yè)調(diào)度,設(shè)是Fji是作業(yè)i在機器j上完成處理的時間。則所有作業(yè)在機器2上完成處理的時間和稱為該作業(yè)調(diào)度的完成時間和。批處理作業(yè)調(diào)度問題要求對于給定的n個作業(yè),制定最佳作業(yè)調(diào)度方案,使其完成時間和達到最小。9.9批處理作業(yè)問題1.問題的描述給定n個作業(yè)的集合9.9批處理作業(yè)問題2.限界函數(shù)在結(jié)點E處相應子樹中葉結(jié)點完成時間和的下界是:注意到如果選擇Pk,使t1pk在k>=r+1時依非減序排列,S1則取得極小值。同理如果選擇Pk使t2pk依非減序排列,則S2取得極小值。
這可以作為優(yōu)先隊列式分支限界法中的限界函數(shù)。
9.9批處理作業(yè)問題2.限界函數(shù)在結(jié)點E處相應子樹中葉結(jié)9.9批處理作業(yè)問題3.算法描述
算法的while循環(huán)完成對排列樹內(nèi)部結(jié)點的有序擴展。在while循環(huán)體內(nèi)算法依次從活結(jié)點優(yōu)先隊列中取出具有最小bb值(完成時間和下界)的結(jié)點作為當前擴展結(jié)點,并加以擴展。
首先考慮enode.s=n的情形,當前擴展結(jié)點enode是排列樹中的葉結(jié)點。enode.sf2是相應于該葉結(jié)點的完成時間和。當enode.sf2<bestc時更新當前最優(yōu)值bestc和相應的當前最優(yōu)解bestx。
9.9批處理作業(yè)問題3.算法描述算法的while9.9批處理作業(yè)問題3.算法描述
當enode.s<n時,算法依次產(chǎn)生當前擴展結(jié)點enode的所有兒子結(jié)點。對于當前擴展結(jié)點的每一個兒子結(jié)點node,計算出其相應的完成時間和的下界bb。當bb<bestc時,將該兒子結(jié)點插入到活結(jié)點優(yōu)先隊列中。而當bbbestc時,可將結(jié)點node舍去。
9.9批處理作業(yè)問題3.算法描述當enode.s9.9批處理作業(yè)問題do{if(enode.s==n){//葉結(jié)點if(enode.sf2<bestc){bestc=enode.sf2;for(inti=0;i<n;i++)bestx[i]=enode.x[i];}}3.算法描述
當enode.sf2<bestc時,更新當前最優(yōu)值beste和相應的最優(yōu)解bestx9.9批處理作業(yè)問題do3.算法描述當en9.9批處理作業(yè)問題3.算法描述else//產(chǎn)生當前擴展結(jié)點的兒子結(jié)點for(inti=enode.s;i<n;i++){MyMath.swap(enode.x,enode.s,i);int[]f=newint[3];intbb=bound(enode,f);if(bb<bestc){HeapNodenode=newHeapNode(enode,f,bb,n);heap.put(node);}MyMath.swap(enode.x,enode.s,i);}//完成結(jié)點擴展9.9批處理作業(yè)問題3.算法描述else//產(chǎn)生當前SeeyouSeeyou主要內(nèi)容:理解分支限界法的剪枝搜索策略。掌握分支限界法的算法框架隊列式(FIFO)分支限界法優(yōu)先隊列式分支限界法
通過應用范例學習分支限界法的設(shè)計策略。單源最短路徑問題裝載問題;布線問題0-1背包問題;最大團問題;旅行售貨員問題電路板排列問題批處理作業(yè)調(diào)度問題主要內(nèi)容:理解分支限界法的剪枝搜索策略。9.1 分支限界法的基本思想1.分支限界法與回溯法的不同(1)求解目標:回溯法的求解目標是找出解空間樹中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的一個解,或是在滿足約束條件的解中找出在某種意義下的最優(yōu)解。
(2)搜索方式的不同:回溯法以深度優(yōu)先的方式搜索解空間樹,而分支限界法則以廣度優(yōu)先或以最小耗費優(yōu)先的方式搜索解空間樹。
9.1 分支限界法的基本思想1.分支限界法與回溯法的不同9.1 分支限界法的基本思想2.分支限界法基本思想
分支限界法常以廣度優(yōu)先或以最小耗費(最大效益)優(yōu)先的方式搜索問題的解空間樹。
在分支限界法中,每一個活結(jié)點只有一次機會成為擴展結(jié)點?;罱Y(jié)點一旦成為擴展結(jié)點,就一次性產(chǎn)生其所有兒子結(jié)點。在這些兒子結(jié)點中,導致不可行解或?qū)е路亲顑?yōu)解的兒子結(jié)點被舍棄,其余兒子結(jié)點被加入活結(jié)點表中。
此后,從活結(jié)點表中取下一結(jié)點成為當前擴展結(jié)點,并重復上述結(jié)點擴展過程。這個過程一直持續(xù)到找到所需的解或活結(jié)點表為空時為止。
9.1 分支限界法的基本思想2.分支限界法基本思想9.1 分支限界法的基本思想3.常見的兩種分支限界法(1)隊列式(FIFO)分支限界法
按照隊列先進先出(FIFO)原則選取下一個節(jié)點為擴展節(jié)點。
(2)優(yōu)先隊列式分支限界法
按照優(yōu)先隊列中規(guī)定的優(yōu)先級選取優(yōu)先級最高的節(jié)點成為當前擴展節(jié)點。9.1 分支限界法的基本思想3.常見的兩種分支限界法9.2 單源最短路徑問題1.問題描述
下面以一個例子來說明單源最短路徑問題:在下圖所給的有向圖G中,每一邊都有一個非負邊權(quán)。要求圖G的從源頂點s到目標頂點t之間的最短路徑。
9.2 單源最短路徑問題1.問題描述下面以一個9.2 單源最短路徑問題
下圖是用優(yōu)先隊列式分支限界法解有向圖G的單源最短路徑問題產(chǎn)生的解空間樹。其中,每一個結(jié)點旁邊的數(shù)字表示該結(jié)點所對應的當前路長。9.2 單源最短路徑問題下圖是用優(yōu)先隊列式分支限界法9.2 單源最短路徑問題2.算法思想
解單源最短路徑問題的優(yōu)先隊列式分支限界法用一極小堆來存儲活結(jié)點表。其優(yōu)先級是結(jié)點所對應的當前路長。
算法從圖G的源頂點s和空優(yōu)先隊列開始。結(jié)點s被擴展后,它的兒子結(jié)點被依次插入堆中。此后,算法從堆中取出具有最小當前路長的結(jié)點作為當前擴展結(jié)點,并依次檢查與當前擴展結(jié)點相鄰的所有頂點。如果從當前擴展結(jié)點i到頂點j有邊可達,且從源出發(fā),途經(jīng)頂點i再到頂點j的所相應的路徑的長度小于當前最優(yōu)路徑長度,則將該頂點作為活結(jié)點插入到活結(jié)點優(yōu)先隊列中。這個結(jié)點的擴展過程一直繼續(xù)到活結(jié)點優(yōu)先隊列為空時為止。9.2 單源最短路徑問題2.算法思想9.2 單源最短路徑問題3.剪枝策略
在算法擴展結(jié)點的過程中,一旦發(fā)現(xiàn)一個結(jié)點的下界不小于當前找到的最短路長,則算法剪去以該結(jié)點為根的子樹。
在算法中,利用結(jié)點間的控制關(guān)系進行剪枝。從源頂點s出發(fā),2條不同路徑到達圖G的同一頂點。由于兩條路徑的路長不同,因此可以將路長長的路徑所對應的樹中的結(jié)點為根的子樹剪去。
9.2 單源最短路徑問題3.剪枝策略9.2 單源最短路徑問題
while(true){//搜索問題的解空間for(intj=1;j<=n;j++)if(a[enode.i][j]<Float.MAX_VALUE&&enode.length+a[enode.i][j]<dist[j]){//頂點i到頂點j可達,且滿足控制約束dist[j]=enode.length+a[enode.i][j];p[j]=enode.i;HeapNodenode=newHeapNode(j,dist[j]);heap.put(node);//加入活結(jié)點優(yōu)先隊列}
if(heap.isEmpty())break;elseenode=(HeapNode)heap.removeMin();}頂點I和j間有邊,且此路徑長小于原先從原點到j的路徑長
9.2 單源最短路徑問題while(true)頂點I和j9.2多段圖問題1.問題的描述
●在多段圖中求從s到t的一條最小成本的路徑,可以看作是在k-2個段作出某種決策的結(jié)果。
●第i次決策決定Vi+1中的哪個結(jié)點在這條路徑上,這里1≤i≤k-2;
●最優(yōu)性原理對多段圖問題成立9.2多段圖問題1.問題的描述2.向前處理策略求解
設(shè)P(i,j)是一條從Vi中的結(jié)點j到匯點t的最小成本路徑,
COST(i,j)是這條路徑的成本。1)向前遞推式2)遞推過程
★第k-1段c(j,t)<j,t>∈ECOST(k-1,j)=
∞2.向前處理策略求解l1l2...lpi+1t…jViVi+1l1l2.lpi+1t…jViVi+112345678910111297324227111181456356425V1V2V3V4V55段圖123456789101112973242271111814★各遞推結(jié)果第4段COST(4,9)=c(9,12)=4
COST(4,10)=c(10,12)=2COST(4,11)=c(11,12)=5第3段COST(3,6)=min{6+COST(4,9),5+COST(4,10)}=7COST(3,7)=min{4+COST(4,9),3+COST(4,10)}=5COST(3,8)=min{5+COST(4,10),6+COST(4,11)}=7第2段COST(2,2)=min{4+COST(3,6),2+COST(3,7),1+COST(3,8)}=7COST(2,3)=9COST(2,4)=18COST(2,5)=15第1段COST(1,1)=min{9+COST(2,2),7+COST(2,3),3+COST(2,4),2+COST(2,5)}=16S到t的最小成本路徑的成本
=16★各遞推結(jié)果★最小成本路徑的求取
記D(i,j)=每一COST(i,j)的決策
即,使c(j,l)+COST(i+1,l)取得最小值的l值。
例:D(3,6)=10,D(3,7)=10D(3,8)=10D(2,2)=7,D(2,3)=6,D(2,4)=8,D(2,5)=8D(1,1)=2
根據(jù)D(1,1)的決策值向后遞推求取最小成本路徑:
●v2=D(1,1)=2●v3=D(2,D(1,1))=7●v4=D(3,D(2,D(1,1)))=D(3,7)=10
故由s到t的最小成本路徑是:1→2→7→10→12
★最小成本路徑的求取3)算法描述★結(jié)點的編號規(guī)則
源點s編號為1,然后依次對V2、V3…Vk-1中的結(jié)點編號,匯點t編號為n。
目的:使對COST和D的計算僅按n-1,n-2,…,1的次序計算即可,無需考慮標示結(jié)點所在段的第一個下標?!锼惴枋?)算法描述算法4.1多段圖的向前處理算法procedureFGRAPH(E,k,n,P)//輸入是按段的順序給結(jié)點編號的,有n個結(jié)點的k段圖。E是邊
集,c(i,j)是邊<i,j>的成本。P(1:k)帶出最小成本路徑//realCOST(n);integerD(n-1),P(k),r,j,k,nCOST(n)←0forj←n-1to1by-1do//計算COST(j)//
設(shè)r是具有性質(zhì):<j,r>∈E且使c(j,r)+COST(r)取最小值的結(jié)點COST(j)←c(j,r)+COST(r)D(j)←r//記錄決策值//repeatP(1)←1;P(k)←nforj←2tok-1do//找路徑上的第j個結(jié)點//P(j)←D(P(j-1))//回溯求出該路徑//repeatendFGRAPH算法4.1多段圖的向前處理算法算法的時間復雜度
若G采用鄰接表表示,總計算時間為:算法的時間復雜度3.向后處理策略求解
設(shè)BP(i,j)是一條從源點s到Vi中的結(jié)點j的最小成本路徑,
BCOST(i,j)是這條路徑的成本。1)向后遞推式2)遞推過程
★第2段c(1,j)<1,j>∈ECOST(2,j)=
∞3.向后處理策略求解12345678910111297324227111181456356425V1V2V3V4V55段圖123456789101112973242271111814★各遞推結(jié)果第2段
BCOST(2,2)=9BCOST(2,3)=7BCOST(2,4)=3BCOST(2,5)=2第3段BCOST(3,6)=min{BCOST(2,2)+4,BCOST(2,3)+2}=9BCOST(3,7)=min{BCOST(2,2)+2,BCOST(2,3)+7,BCOST(2,5)+11}=11BCOST(3,8)=min{BCOST(2,4)+11,BCOST(2,5)+8}=10第4段BCOST(4,9)=min{BCOST(3,6)+6,BCOST(3,7)+4}=15BCOST(4,10)=min{BCOST(3,6)+5,BCOST(3,7)+3,BCOST(3,8)+5}=14BCOST(4,11)=min{BCOST(3,8)+6}=16第5段BCOST(5,12)=min{BCOST(4,9)+4,BCOST(4,10)+2,BCOST(4,11)+5}=16S到t的最小成本路徑的成本
=
16★各遞推結(jié)果★最小成本路徑的求取
記BD(i,j)=每一COST(i,j)的決策
即,使COST(i-1,l)+c(l,j)取得最小值的l值。
例:BD(3,6)=3,BD(3,7)=2,BD(3,8)=5BD(4,9)=6,BD(4,10)=7,BD(4,11)=8BD(5,12)=10
根據(jù)D(5,12)的決策值向前遞推求取最小成本路徑:
●v4=BD(5,12)=10●v3=BD(4,BD(5,12))=7●v2=BD(3,BD(4,BD(5,12)))=BD(3,7)=2
故由s到t的最小成本路徑是:1→2→7→10→12
★最小成本路徑的求取算法4.2多段圖的向后處理算法procedureBGRAPH(E,k,n,P)//輸入是按段的順序給結(jié)點編號的,有n個結(jié)點的k段圖。E是邊
集,c(i,j)是邊<i,j>的成本。P(1:k)帶出最小成本路徑//realBCOST(n);integerBD(n-1),P(k),r,j,k,nBCOST(1)←0forj←2tondo//計算BCOST(j)//
設(shè)r是具有<r,j>∈E且使BCOST(r)+c(r,j)取最小值性質(zhì)的結(jié)點BCOST(j)←BCOST(r)+c(r,j)BD(j)←r//記錄決策值//repeatP(1)←1;P(k)←nforj←k-1to2by-1do//找路徑上的第j個結(jié)點//P(j)←D(P(j+1))//回溯求出該路徑//repeatendBGRAPH算法4.2多段圖的向后處理算法4.多段圖問題的應用實例-資源的分配問題
將n個資源分配給r個項目的問題:如果把j個資源,0≤j≤n,分配給項目i,可以獲得N(i,j)的凈利。
問題:如何將這n個資源分配給r個項目才能使各項目獲得的凈利之和達到最大。
轉(zhuǎn)換成一個多段圖問題求解。4.多段圖問題的應用實例-資源的分配問題
用r+1段圖描述該問題:
段:1到r之間的每個段i表示項目i。
結(jié)點:i=1時,只有一個結(jié)點——源點s=V(1,0)
當2≤i≤r時,每段有n+1個結(jié)點,每個結(jié)點具有形式
V(i,j):表示到項目i之前為止,共把j個資源分配給了
前i-1個項目,j=0,1,…,n。
匯點t=V(r+1,n)
邊的一般形式:<V(i,j),V(i+1,l)>,j≤l,1≤i≤r
成本:★當j≤l且1≤i≤r時,邊<V(i,j),V(i+1,l)>賦予成本N(i,l-j),表示給項目i分配l-j個資源所可能獲得的凈利?!锂攋≤n且i=r時,此時的邊為:<V(r,j),V(r+1,n)>,該邊賦
予成本:指向匯點的邊注,并不是分給的資源越多,得到的凈利就越大用r+1段圖描述該問題:指向匯點的邊注,并不是實例:將4個資源分配給3個項目。構(gòu)成一個4段圖。
問題的解:資源的最優(yōu)分配方案由一條s到t的最大成本路徑給出——改變邊成本的符號,從而將問題轉(zhuǎn)換成為求取最小成本路徑問題。實例:將4個資源分配給3個項目。構(gòu)成一個4段圖。9.3裝載問題1.問題描述有一批共個集裝箱要裝上2艘載重量分別為C1和C2的輪船,其中集裝箱i的重量為Wi,且裝載問題要求確定是否有一個合理的裝載方案可將這個集裝箱裝上這2艘輪船。如果有,找出一種裝載方案。
容易證明:如果一個給定裝載問題有解,則采用下面的策略可得到最優(yōu)裝載方案。
(1)首先將第一艘輪船盡可能裝滿;(2)將剩余的集裝箱裝上第二艘輪船。
9.3裝載問題1.問題描述有一批共個集裝箱要裝上2艘載重9.3裝載問題2.隊列式分支限界法
在算法的while循環(huán)中,首先檢測當前擴展結(jié)點的左兒子結(jié)點是否為可行結(jié)點。如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版土地使用權(quán)出讓居間合同規(guī)范文本-城市綜合體開發(fā)3篇
- 二零二五版住宅小區(qū)車位產(chǎn)權(quán)轉(zhuǎn)移及使用權(quán)購買合同3篇
- 2025版住宅小區(qū)消防設(shè)備設(shè)施定期檢查與維護合同范本2篇
- 2025年度木門行業(yè)環(huán)保認證與推廣合同3篇
- 2025年度國際物流合作解約及責任分擔協(xié)議書
- 二零二五年度美容店轉(zhuǎn)讓合同包括美容院品牌授權(quán)及區(qū)域代理權(quán)
- 2025年度二零二五年度大型活動臨時工人搬運服務承包協(xié)議
- 2025年度私人承包廠房租賃合同安全責任追究協(xié)議
- 二零二五板材行業(yè)數(shù)據(jù)分析與市場預測合同3篇
- 二零二五年度鏟車清雪作業(yè)安全責任保險合同
- 中考模擬考試化學試卷與答案解析(共三套)
- 新人教版五年級小學數(shù)學全冊奧數(shù)(含答案)
- 風電場升壓站培訓課件
- 收納盒注塑模具設(shè)計(論文-任務書-開題報告-圖紙)
- 博弈論全套課件
- CONSORT2010流程圖(FlowDiagram)【模板】文檔
- 腦電信號處理與特征提取
- 高中數(shù)學知識點全總結(jié)(電子版)
- GB/T 10322.7-2004鐵礦石粒度分布的篩分測定
- 2023新譯林版新教材高中英語必修一重點詞組歸納總結(jié)
- 蘇教版四年級數(shù)學下冊第3單元第2課時“常見的數(shù)量關(guān)系”教案
評論
0/150
提交評論