【算法學習筆記十二】回溯法(二)

回溯法(一)

應用分支限界法的關鍵問題

如何確定合適的限界函數

        常見方法是先對整個問題估計出下界(最小化問題)或上界(最大化問題),而限界函數是在部分解的基礎上對剩餘的未知部分進行界的重新估計

如何組織待處理結點表

如何確定最優解中的各個分量   

       分支限界法對問題的解空間樹中結點的處理是跳躍式的,回溯也不是單純地沿着雙親結點一層一層向上回溯,因此,當搜索到某個葉子結點且該葉子結點的目標函數值在表PT中最大時(假設求解最大化問題),求得了問題的最優值,但是,卻無法求得該葉子結點對應的最優解中的各個分量。這個問題可以用如下方法解決:

        –對每個擴展結點保存該結點到根結點的路徑;

        –在搜索過程中構建搜索經過的樹結構,在求得最優解時,從葉子結點不斷回溯到根結點,以確定最優解中的各個分量

例如0/1揹包問題,爲了對每個擴展結點保存該結點到根結點的路徑,將部分解(x1, …, xi)和該部分解的目標函數值都存儲在待處理結點表PT中,在搜索過程中表PT的狀態如圖所示。

對0/1揹包問題,爲了在搜索過程中構建搜索經過的樹結構,設一個表ST,在表PT中取出最優值結點進行擴充時,將最優值結點存儲到表ST中,表PT和表ST的數據結構爲(物品i-1的選擇結果,<物品i, 物品i的選擇結果>ub),在搜索過程中表PT和表ST的狀態如下所示。 

分支限界法的時間性能

分支限界法和回溯法實際上都屬於蠻力窮舉法,當然不能指望它有很好的最壞時間複雜性,遍歷具有指數階個結點的解空間樹,在最壞情況下,時間複雜性肯定爲指數階。

與回溯法不同的是,分支限界法首先擴展解空間樹中的上層結點,並採用限界函數,有利於實行大範圍剪枝,同時,根據限界函數不斷調整搜索方向,選擇最有可能取得最優解的子樹優先進行搜索。所以,如果選擇了結點的合理擴展順序以及設計了一個好的限界函數,分支界限法可以快速得到問題的解。

分支限界法的較高效率是以付出一定代價爲基礎的:

–一個更好的限界函數通常需要花費更多的時間計算相應的目標函數值,而且對於具體的問題實例,通常需要進行大量實驗,才能確定一個好的限界函數;

–由於分支限界法對解空間樹中結點的處理是跳躍式的,因此,在搜索到某個葉子結點得到最優值時,爲了從該葉子結點求出對應的最優解中的各個分量,需要對每個擴展結點保存該結點到根結點的路徑,或者在搜索過程中構建搜索經過的樹結構,這使得算法的設計較爲複雜;

–算法要維護一個待處理結點表PT,並且需要在表PT中快速查找取得極值的結點,等等。這都需要較大的存儲空間,在最壞情況下,分支限界法需要的空間複雜性是指數階。

TSP問題:

TSP問題是指要訪問n個城市,要求各個城市經歷且僅經歷一次然後回到出發城市,並要求所走的路程最短。

採用貪心法求得近似解爲1→3→5→4→2→1,其路徑長度爲1+2+3+7+3=16,這可以作爲TSP問題的上界。

把矩陣中每一行最小的元素相加,可以得到一個簡單的下界,其路徑長度爲1+3+1+3+2=10,但是還有一個信息量更大的下界:考慮一個TSP問題的完整解,在每條路徑上,每個城市都有兩條鄰接邊,一條是進入這個城市的,另一條是離開這個城市的,那麼,如果把矩陣中每一行最小的兩個元素相加再除以2,如果圖中所有的代價都是整數,再對這個結果向上取整,就得到了一個合理的下界。

lb=((1+3)+(3+6)+(1+2)+(3+4)+(2+3))/2=14

於是,得到了目標函數的界[14, 16]。

需要強調的是,這個解並不是一個合法的選擇(可能沒有構成哈密頓迴路),它僅僅給出了一個參考下界。

 c表示已得的合法解

例如圖示無向圖,如果部分解包含邊(1, 4),則該部分解的下界是lb=(5*2+(1+3)+((3+6)+(1+2)+(2+3)))/2=16。

或者: lb=((1+5)+(5+3)+((3+6)+(1+2)+(2+3)))/2=16(按上述進入和離開城市的方式計算)

搜索過程:

(1)在根結點1,根據限界函數計算目標函數的值爲lb=((1+3)+(3+6)+(1+2)+(3+4)+(2+3))/2=14;

(2)在結點2,從城市1到城市2,路徑長度爲3,目標函數的值爲((1+3)+(3+6)+(1+2)+(3+4)+(2+3))/2=14,將結點2加入待處理結點表PT中;在結點3,從城市1到城市3,路徑長度爲1,目標函數的值爲((1+3)+(3+6)+(1+2)+(3+4)+(2+3))/2=14,將結點3加入表PT中;在結點4,從城市1到城市4,路徑長度爲5,目標函數的值爲((1+5)+(3+6)+(1+2)+(3+5)+(2+3))/2=16,將結點4加入表PT中;在結點5,從城市1到城市5,路徑長度爲8,目標函數的值爲((1+8)+(3+6)+(1+2)+(3+5)+(2+8))/2=19,超出目標函數的界,將結點5丟棄;

(3)在表PT中選取目標函數值極小的結點2優先進行搜索;

(4)在結點6,從城市2到城市3,目標函數值爲((1+3)+(3+6)+(1+6)+(3+4)+(2+3))/2=16,將結點6加入表PT中;在結點7,從城市2到城市4,目標函數值爲((1+3)+(3+7)+(1+2)+(3+7)+(2+3))/2=16,將結點7加入表PT中;在結點8,從城市2到城市5,目標函數值爲((1+3)+(3+9)+(1+2)+(3+4)+(2+9))/2=19,超出目標函數的界,將結點8丟棄;

(5)在表PT中選取目標函數值極小的結點3優先進行搜索;

(6)在結點9,從城市3到城市2,目標函數值爲((1+3)+(3+6)+(1+6)+(3+4)+(2+3))/2=16,將結點9加入表PT中;在結點10,從城市3到城市4,目標函數值爲((1+3)+(3+6)+(1+4)+(3+4)+(2+3))/2=15,將結點10加入表PT中;在結點11,從城市3到城市5,目標函數值爲((1+3)+(3+6)+(1+2)+(3+4)+(2+3))/2=14,將結點11加入表PT中;

(7)在表PT中選取目標函數值極小的結點11優先進行搜索;

(8)在結點12,從城市5到城市2,目標函數值爲((1+3)+(3+9)+(1+2)+(3+4)+(2+9))/2=19,超出目標函數的界,將結點12丟棄;在結點13,從城市5到城市4,目標函數值爲((1+3)+(3+6)+(1+2)+(3+4)+(2+3))/2=14,將結點13加入表PT中;

(9)在表PT中選取目標函數值極小的結點13優先進行搜索;

(10)在結點14,從城市4到城市2,目標函數值爲((1+3)+(3+7)+(1+2)+(3+7)+(2+3))/2=16,最後從城市2回到城市1,目標函數值爲((1+3)+(3+7)+(1+2)+(3+7)+(2+3))/2=16,由於結點14爲葉子結點,得到一個可行解,其路徑長度爲16;

(11)在表PT中選取目標函數值極小的結點10優先進行搜索;

(12)在結點15,從城市4到城市2,目標函數的值爲((1+3)+(3+7)+(1+4)+(7+4)+(2+3))/2=18,超出目標函數的界,將結點15丟棄;在結點16,從城市4到城市5,目標函數值爲((1+3)+(3+6)+(1+4)+(3+4)+(2+3))/2=15,將結點16加入表PT中;

(13)在表PT中選取目標函數值極小的結點16優先進行搜索;

(14)在結點17,從城市5到城市2,目標函數的值爲((1+3)+(3+9)+(1+4)+(3+4)+(9+3))/2=20,超出目標函數的界,將結點17丟棄;

(15)表PT中目標函數值均爲16,且有一個是葉子結點14,所以,結點14對應的解1→3→5→4→2→1即是TSP問題的最優解,搜索過程結束。

    1.根據限界函數計算目標函數的下界down;採用貪心法得到上界up;
    2.將待處理結點表PT初始化爲空;
    3.for (i=1; i<=n; i++)
             x[i]=0;
    4.k=1; x[1]=1;  //從頂點1出發求解TSP問題
    5.while (k>=1)
          5.1 i=k+1;
          5.2 x[i]=1;
          5.3 while (x[i]<=n)
               5.3.1 如果路徑上頂點不重複,則
                       5.3.1.1 計算目標函數值lb;
                       5.3.1.2 if (lb<=up) 將路徑上的頂點和lb值存儲在表PT中;
               5.3.2 x[i]=x[i]+1;
         5.4 若i=n且葉子結點的目標函數值在表PT中最小
               則將該葉子結點對應的最優解輸出;
         5.5否則,若i=n,則在表PT中取葉子結點的目標函數值最小的結點lb,
               令up=lb,將表PT中目標函數值lb超出up的結點刪除;
         5.6 k=表PT中lb最小的路徑上頂點個數;

多段圖的最短路徑問題

設圖G=(V, E)是一個帶權有向連通圖,如果把頂點集合V劃分成k個互不相交的子集Vi(2≤kn, 1≤ik),使得E中的任何一條邊(u, v),必有uVivVi+m(1≤ik, 1<i+mk),則稱圖G爲多段圖,稱sV1爲源點,tVk爲終點。

多段圖的最短路徑問題是求從源點到終點的最小代價路徑。

對圖示多段圖求得近似解爲0→2→5→8→9,其路徑代價爲2+7+6+3=18,這可以作爲多段圖最短路徑問題的上界。把每一段最小的代價相加,可以得到一個非常簡單的下界,其路徑長度爲2+4+5+3=14。於是,得到了目標函數的界[14, 18]。

由於多段圖將頂點劃分爲k個互不相交的子集,所以,多段圖劃分爲k段,一旦某條路徑的一些段被確定後,就可以併入這些信息並計算部分解的目標函數值的下界。一般情況下,對於一個正在生成的路徑,假設已經確定了i段(1≤ik),其路徑爲(r1, r2, …, ri, ri+1),此時,該部分解的目標函數值的計算方法即限界函數如下:

 搜索過程:

(1)在根結點1,根據限界函數計算目標函數的值爲18;

(2)在結點2,第1段選擇邊<0, 1>,目標函數值爲lb=4+8+5+3=20,超出目標函數的界,將結點2丟棄;在結點3,第1段選擇邊<0, 2>,目標函數值爲lb=2+6+5+3=16,將結點3加入待處理結點表PT中;在結點4,第1段選擇邊<0, 3>,目標函數值爲lb=3+4+5+3=15,將結點4加入表PT中;

(3)在表PT中選取目標函數值極小的結點4優先進行搜索;

(4)在結點5,第2段選擇邊<3, 5>,目標函數值爲lb=3+4+6+3=16,將結點5加入表PT中;在結點6,第2段選擇邊<3, 6>,目標函數值爲lb=3+7+5+3=18,將結點6加入表PT中;

(5)在表PT中選取目標函數值極小的結點3優先進行搜索;

(6)在結點7,第2段選擇邊<2, 4>,目標函數值爲lb=2+6+5+3=16,將結點7加入表PT中;在結點8,第2段選擇邊<2, 5>,目標函數值爲lb=2+7+6+3=18,將結點8加入表PT中;在結點9,第2段選擇邊<2, 6>,目標函數值爲lb=2+8+5+3=18,將結點9加入表PT中;

(7)在表PT中選取目標函數值極小的結點5優先進行搜索;

(8)在結點10,第3段選擇邊<5, 7>,可直接確定第4段的邊<7, 9>,目標函數值爲lb=3+4+8+7=22,爲一個可行解但超出目標函數的界,將其丟棄;在結點11,第3段選擇邊<5, 8>,可直接確定第4段的邊<8, 9>,目標函數值爲lb=3+4+6+3=16,爲一個較好的可行解。由於結點11是葉子結點,並且其目標函數值是表PT中最小的,所以,結點11代表的解即是問題的最優解,搜索過程結束。

   1.根據限界函數計算目標函數的下界down;採用貪心法得到上界up;
   2.將待處理結點表PT初始化爲空;
   3.for (i=1; i<=k; i++)
             x[i]=0;
   4.i=1; u=0;       //求解第i段
   5.while (i>=1)
         5.1 對頂點u的所有鄰接點v
               5.1.1 計算目標函數值lb;
               5.1.2 若lb<=up,則將i,<u,v>,lb存儲在表PT中;
         5.2 如果i= =k-1且葉子結點的lb值在表PT中最小,
               則輸出該葉子結點對應的最優解;
         5.3 否則,如果i= =k-1且表PT中的葉子結點的lb值不是最小,則
               5.3.1 up=表PT中的葉子結點最小的lb值;
               5.3.2 將表PT中目標函數值超出up的結點刪除;
         5.4  u=表PT中lb最小的結點的v值;
         5.5  i=表PT中lb最小的結點的i值;i++;

任務分配問題:

任務分配問題要求把n項任務分配給n個人,每個人完成每項任務的成本不同,要求分配總成本最小的最優分配方案。圖示是一個任務分配的成本矩陣。

考慮任意一個可行解,例如矩陣中的對角線是一個合法的選擇,表示將任務1分配給人員a、任務2分配給人員b、任務3分配給人員c、任務4分配給人員d,其成本是9+4+1+4=18;或者應用貪心法求得一個近似解:將任務2分配給人員a、任務3分配給人員b、任務1分配給人員c、任務4分配給人員d,其成本是2+3+5+4=14。顯然,14是一個更好的上界。

爲了獲得下界,考慮人員a執行所有任務的最小代價是2,人員b執行所有任務的最小代價是3,人員c執行所有任務的最小代價是1,人員d執行所有任務的最小代價是4。因此,將每一行的最小元素加起來就得到解的下界,其成本是2+3+1+4=10。需要強調的是,這個解並不是一個合法的選擇(3和1來自於矩陣的同一列),它僅僅給出了一個參考下界,這樣,最優值一定是[10, 14]之間的某個值。

設當前已對人員1~i分配了任務,並且獲得了成本v,則限界函數可以定義爲:

 搜索過程:

(1)在根結點1,沒有分配任務,根據限界函數估算目標函數值爲2+3+1+4=10;

(2)在結點2,將任務1分配給人員a,獲得的成本爲9,目標函數值爲9 + (3+1+4)=17,超出目標函數的界[10, 14],將結點2丟棄;在結點3,將任務2分配給人員a,獲得的成本爲2,目標函數值爲2 + (3+1+4)=10,將結點3加入待處理結點表PT中;在結點4,將任務3分配給人員a,獲得的成本爲7,目標函數值爲7 + (3+1+4)=15,超出目標函數的界[10, 14],將結點4丟棄;在結點5,將任務4分配給人員a,獲得的成本爲8,目標函數值爲8 + (3+1+4)=16,超出目標函數的界[10, 14],將結點5丟棄;

(3)在表PT中選取目標函數值極小的結點3優先進行搜索;

(4)在結點6,將任務1分配給人員b,獲得的成本爲2+6=8,目標函數值爲8+(1+4)=13,將結點6加入表PT中;在結點7,將任務3分配給人員b,獲得的成本爲2+3=5,目標函數值爲5+(1+4)=10,將結點7加入表PT中;在結點8。將任務4分配給人員b,獲得的成本爲2+7=9,目標函數值爲9+(1+4)=14,將結點8加入表PT中;

(5)在表PT中選取目標函數值極小的結點7優先進行搜索;

(6)在結點9,將任務1分配給人員c,獲得的成本爲5+5=10,目標函數值爲10+4=14,將結點9加入表PT中;在結點10,將任務4分配給人員c,獲得的成本爲5+8=13,目標函數值爲13+4=17,超出目標函數的界[10, 14],將結點10丟棄;

(7)在表PT中選取目標函數值極小的結點6優先進行搜索;

(8)在結點11,將任務3分配給人員c,獲得的成本爲8+1=9,目標函數值爲9+4=13,將結點11加入表PT中;在結點12,將任務4分配給人員c,獲得的成本爲8+8=16,目標函數值爲16+4=20,超出目標函數的界[10, 14],將結點12丟棄;

(9)在表PT中選取目標函數值極小的結點11優先進行搜索;

(10)在結點13,將任務4分配給人員d,獲得的成本爲9+4=13,目標函數值爲13,由於結點13是葉子結點,同時結點13的目標函數值是表PT中的極小值,所以,結點13對應的解即是問題的最優解,搜索結束。

    1.根據限界函數計算目標函數的下界down;採用貪心法得到上界up;
    2.將待處理結點表PT初始化爲空;
    3.for (i=1; i<=n; i++)
             x[i]=0;
    4.k=1; i=0;      //爲第k個人分配任務,i爲第k-1個人分配的任務
    5.while (k>=1)
          5.1 x[k]=1;
          5.2 while (x[k]<=n)
                5.2.1 如果人員k分配任務x[k]不發生衝突,則
                        5.2.1.1 計算目標函數值lb;
                        5.2.1.2 若lb<=up,則將i,<x[k], k>lb存儲在表PT中;
                5.2.2 x[k]=x[k]+1;
          5.3 如果k= =n且葉子結點的lb值在表PT中最小,
                則輸出該葉子結點對應的最優解;
          5.4 否則,如果k= =n且表PT中的葉子結點的lb值不是最小,則
                5.4.1 up=表PT中的葉子結點最小的lb值;
                5.4.2 將表PT中超出目標函數界的結點刪除;
          5.5  i=表PT中lb最小的結點的x[k]值;
          5.6  k=表PT中lb最小的結點的k值;k++;

批處理作業調度問題

給定n個作業的集合J={J1, J2, …, Jn},每個作業都有3項任務分別在3臺機器上完成,作業Ji需要機器j的處理時間爲tij(1≤in, 1≤j≤3),每個作業必須先由機器1處理,再由機器2處理,最後由機器3處理。批處理作業調度問題要求確定這n個作業的最優處理順序,使得從第1個作業在機器1上處理開始,到最後一個作業在機器3上處理結束所需的時間最少。

顯然,批處理作業的一個最優調度應使機器1沒有空閒時間,且機器2和機器3的空閒時間最小。可以證明,存在一個最優作業調度使得在機器1、機器2和機器3上作業以相同次序完成。

J={J1, J2, J3, J4}是4個待處理的作業,每個作業的處理順序相同,即先在機器1上處理,然後在機器2上處理,最後在機器3上處理,需要的處理時間如圖所示。

 若處理順序爲(J2, J3, J1, J4),則從作業2在機器1處理開始到作業4在機器3處理完成的調度方案如圖所示。

 考慮理想情況,機器1和機器2無空閒,最後處理的恰好是在機器3上處理時間最短的作業。例如,以作業Ji開始的處理順序,估算處理所需的最短時間是:t_{i1}+\sum_{j=1}^{n}t_{j2}+min\{t_{k3}\}

一般情況下,對於一個已安排的作業集合Mㄈ{1, 2, …, n},|M|=k,即已安排了k個作業,設sum1[k]表示機器1完成k個作業的處理時間,sum2[k]表示機器2完成k個作業的處理時間,現在要處理作業k+1,此時,該部分解的目標函數值的下界計算方法如下:

搜索過程:

(1)在根結點,將sum1[0]和sum2[0]分別初始化爲0; 

(2)在結點2,以作業J1開始處理,則sum1[1]=5,目標函數值爲5+(7+5+9+8)+2=36,sum2[1]=5+7=12,將結點2加入待處理結點表PT中;在結點3,以作業J2開始處理, 則sum1[1]=10,目標函數值爲10+(7+5+9+8)+5=44,sum2[1]=10+2=12,將結點3加入表PT中;在結點4,以作業J3開始處理,則sum1[1]=9,目標函數值爲9+(7+5+9+8)+2=40,sum2[1]=9+9=18,將結點4加入表PT中;在結點5,以作業J4開始處理,則sum1[1]=7,目標函數值爲7+(7+5+9+8)+2=38,sum2[1]=7+8=15,將結點5加入表PT中;

(3)在表PT中選取目標函數值極小的結點2優先進行搜索;

(4)在結點6,準備處理作業J2,則sum1[2]=5+10=15,目標函數值爲15+(5+9+8)+5=42,sum2[2]=15+5=20,將結點6加入表PT中;在結點7,準備處理作業J3,則sum1[2]=5+9=14,目標函數值爲14+(5+9+8)+2=38,sum2[2]=14+9=22,將結點7加入表PT中;在結點8,準備處理作業J4,則sum1[2]=5+7=12,目標函數值爲12+(5+9+8)+2=36,sum2[2]=12+8=20,將結點8加入表PT中;

(5)在表PT中選取目標函數值極小的結點8優先進行搜索;

(6)在結點9,準備處理作業J2,則sum1[3]=12+10=22,目標函數值爲22+(5+9)+5=41,sum2[3]=22+5=27,將結點9加入表PT中;在結點10,準備處理作業J3,則sum1[3]=12+9=21,目標函數值爲21+(5+9)+2=37,sum2[3]=21+9=30,將結點10加入表PT中;

(7)在表PT中選取目標函數值極小的結點10優先進行搜索;

(8)在結點11,準備處理作業J2,則sum1[4]=21+10=31,目標函數值爲31+5=36,sum2[4]=31+5=36,由於結點11是葉子結點,並且目標函數值在表PT中最小,則結點11代表的解即是問題的最優解,sum2[4]是機器2完成所有4個作業的時間,則機器3完成所有4個作業的時間是sum2[4]+t23=36+2=38。搜索過程結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章