• 沒有找到結果。

產生避開障礙物之最長路徑

在文檔中 中 華 大 學 碩 士 論 文 (頁 43-49)

第四章 避開障礙物之最長路徑

4.2 產生避開障礙物之最長路徑

33

34

分支邊上的權重也是 1(相鄰格子為 1),那麼這類型的切割區域就是要被排除的區域,

如圖 4-8 所示,我們依序的排除 V5以及 V4,以得到圖 4-7 右邊的圖形。

圖 4-7 排除無法繞線之區域

排除無法繞之區域的演算法流程如下所示:

排除無法繞線之區域:

while( 有無法繞線之區域 ){

設定沒有無法繞線之區域;

for(每一個在相鄰關係圖中的區域){

if( 該區域僅與 1 區域相鄰且相鄰格子為 1 ){

從相鄰關係圖中移除該區域;

設定有無法繞線之區域;

} } }

4.2.2 產生初始路徑

在此,利用深度優先搜尋法(Depth-First Search)[23],從起點 VS開始到 VT結束,

找出一個從起點到終點經過最少區域的初始路徑(Initial Path),如果初始路徑(Initial Path)有數條的話,那麼應當優先選擇不會額外造成不可繞之區域(Dead Region)的路

35

徑。以圖 4-8 為例,以深度搜尋(Depth-First Search)會找到兩條路徑分別是 VS、V8到 VT以及 VS、V3到 VT。如果選擇了 VS、V8到 VT那麼 V3就會變成不可繞線之區域(Dead Region),反觀 VS、V3到 VT則不會造成任何不可繞線之區域(Dead Region),所以在 此選擇 VS、V3到 VT這條路徑,如圖 4-8(a)所示,再分別將 VS、V3以及 VT套入無障 礙物矩形的繞線方式(Rectangular Pattern Detouring)以求得最後的初始路徑(Initial Path),如圖 4-8(b)所示。

(a) (b)

圖 4-8 相鄰關係圖上初始路徑以及初始路徑的繞線 產生初始路徑的演算法流程如下所示:

產生初始路徑:

當前串列 = 起點;

while( 找到終點 ){

與當前串列相鄰之區域新增至當前串列的後面;

}

while( 找到起點 ){

從終點往前找與終點相鄰之區域直到起點為止;

}

if(有多條初始路徑)

選擇不會製造不可繞之區域的路徑;

將初始路徑套用矩形迴繞形式;

36

4.2.3 增加外部繞線

增加外部繞線的部分,依據初始路徑的區域,利用廣度優先搜尋法(Breath-First Search)[24],依序地增加鄰近區域的繞線長度。在此延伸[18]中所使用的 R-flip 以及 C-flip 兩種增加繞線之方式的概念,用以增加外部繞線,說明如下:

 R-flip:當兩相鄰區域之相鄰格子大於 1 個的時候,利用 R-flip 增加該相鄰 區域的繞線長度。

 C-flip:一條起點終點在同一個切割區域(Partition Region)的迴路(Cycle),利 用 C-flip 將整條迴路(Cycle)串接起來以增加繞線長度。

利用 R-flip 或 C-flip 增加繞線長度的時候,由於 R-flip 比較不會破壞原本的繞線 方式,所以我們盡可能的使用 R-flip 增加外部的繞線,但如果 R-flip 和 C-flip 同時存 在且 R-flip 可能會照成其他區域變成不可繞線之區域(Dead Region),或者 C-flip 包含 該 R-flip 的區域,此時我們優先使用 C-flip 增加繞線長度。最後,在做 R-flip 或 C-flip 增加繞線方法之前,我們根據先前在無障礙物矩形之繞線方式(Rectangular Pattern Detouring)的分析,可以預先計算出無法繞到的格子(Unreachable Grids)數有多少,如 果大於 2 的話,則放棄該次的 R-flip 或 C-flip。

觀察完成初始路徑的繞線平面,如圖 4-8(b),以及相鄰關係圖(Adjacent Graph),

如圖 4-8(a),利用廣度優先搜尋法(Breath-First Search)去增加繞線的長度第一次會找 到 V2、V8以及 V6可以做 R-flip;第二次會找到 V1可以做 R-flip 和 V7及 V9可以做 C-flip,但是由於 VS、V7、V9再回到 VS的迴路(Cycle)所剩餘的格子數太多,因此放 棄這次的 C-flip,結果如圖 4-9(a)所示。最後會找到 V7可以做 R-flip 以及 V8、V10、 V7、V9再回到 V8的迴路可以做 C-flip,此時由於 C-flip 包含 R-flip 之區域,故所以 優先使用 C-flip 增加繞線的方法,結果如圖 4-9(b)所示。

37

(a)

(b)

圖 4-9 R-flip 及 C-flip 增加外部繞線

增加外部繞線的演算法流程如下所示:

增加外部繞線:

路徑區域 = 初始路徑區域;

剩餘區域 = 排除不可繞之區域後的區域 – 初始路徑區域;

while(還有剩餘區域){

for( 每個與初始路徑相鄰之區域 ){

從剩餘區域中移除;

if( 相鄰格子大於 2 )

R-flip 增加長度,且將該區域加入路徑區域;

else

加入新增區域;

}

if( 新增區域與路徑區域中有迴路且預估剩餘格子數小於 2 ) C-flip 增加長度,且迴路經過的區域加入路徑區域中;

}

38

4.2.4 增加內部繞線

C-flip 繞線方法串接數個區域,但是在起點和終點所在之區域中,原兩端點間的 路徑由於延伸數個區域而消失。所以在該區域中,使用[3]所提出的 R-flip 將消失的原 路徑盡可能地加回來。由圖 4-9(b)可得知,區域 R8因為 R8、R10、R7、R9到 R8的 C-flip 增加繞線中,使得區域中間產生一些空白區域。因此,從起點到終點原路經間找尋一 個可以使用 R-flip 之 2x2 的區域盡可能地增加線段長度,如圖 4-10 所示。在所有切 割區域(Partition Region)的繞線都被增加且因為 C-flip 增加繞線而消失的長度也被加 回來之後,就完成了避開障礙物之最長路徑(Obstacle-Aware Longest Path)。而整個演 算法的時間複雜度為 O(mn),且利用這產生最長路徑的演算法,延伸至匯流排繞線中 產生每條線段符合長度限制之路靜。

圖 4-10 避開障礙物之最長路徑

增加內部繞線的演算法流程如下所示:

增加內部繞線:

每次 C-flip 之後執行;

for( C-flip 起點終點之間 ){

原路徑每 2 空白格子執行 1 次 R-flip;

}

39

在文檔中 中 華 大 學 碩 士 論 文 (頁 43-49)

相關文件