第四章 避開障礙物之最長路徑
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