第四章 即時電容配置
4.4 模擬退火法
在加入即時電容之後,為了要得到一個比較好的版面規劃結果,我們必需仰 賴模擬退火法[42]來改進,在模擬退火法中,每一次均會挑一個有加入電容的區 塊來做攪亂的動作,然而一個攪亂的動作,我們可以將它細分為三個步驟:
步驟一:重新調配區塊的大小
因為即時電容與區塊結合時,電容會包在硬的區塊外面,所以我們可以稍微 調整區塊的外形,但是在重新調整區塊的大小時,一定要滿足之前所定義的三個 條件式。圖 4_12 為重新調整區塊的一個例子,假設原本區塊的面積為 50*20,
所要加入的電容大小為 50,利用電容包住原本區塊的概念,可以有無限多種組 合,其中兩種如圖 4_12 所示。
50
20
+
50=
21 52
50 1050
1050
20.1
圖 4_12 重新調配區塊大小
步驟二:版面規劃的分離
在選定區塊做完重新調配大小後,我們可以根據區塊的位置將版面規劃分成 兩個區域,其分法就是以選定的區塊為起始點,遞回地往區塊的上左以及右下去 界線住相鄰的區塊,這些被界線住的區塊大部份都位於起始區塊的右上邊,其餘
沒有被界線住的區塊都位於起始區塊的左下邊,因此可以用此方法將版面規劃分 離,分成右上邊與左下邊,位於右上邊集合內的區塊,也許會因為區塊重新調配 大小之後,改變原本的相鄰關係,因此需要重新做擺放的動作,而位於左下邊集 合內的區塊,並不會因為區塊重新調配大小而改變原本的相鄰關係,因此不需要 重新做擺放的動作。圖 4_13 中,區塊D 重新調整了大小,區塊 E、區塊 G 以及 區塊F 可能會因此改變相鄰關係,所以會被分配到右上邊的集合內,而區塊 A、
區塊B 以及區塊 C 則不會因為區塊 D 重新調整了大小而有所改變相鄰關係,因 此被分到左下邊的集點中。
A C
B D
E
F G
A C
B
D E
F G
LB
RT
圖 4_13 版面規劃分離
步驟三:向左_向下的擺放
在步驟二我們將版面規劃分成兩個部份,一個部份為可能會改變相鄰關係的 區塊集合,另一部份為不會改變相鄰關係區塊集合,對於可能會改變相鄰關係的 區塊而言,我們必需將他重新做一次擺放的動作,擺放的時候,先找到一個擺放 的順序,然後利用LBPacking()的方式,將集合內的區塊一一擺放回來。整個攪 亂動作,可以用圖 4_14 完全表示出來,其中區塊 8 被選擇來做攪亂的區塊,因 此區塊 8 在調整完大小之後,它的形狀由原來的比較寬的長方形變成比較瘦的長 方形,再來就是根據區塊 8 的位置,將版面規劃分成兩個集合,一個是屬於可能
B9 B12
B7
B2
B3
B4 B5
B6
B10
B11
B L
B1
B8
B9 B12
B7
B2
B3
B4 B5
B6
B10
B11
B L
B1
B8
B B9 B12
B7
B2
B3
B4 B5
B6
B10
B11
L
B1
B8
B9 B12
B7
B2
B3
B4 B5
B6
B10
B11
B1
B8
B L
B9 B12
B7
B2
B3
B4 B5
B6
B10
B11
B1
B8
B L
B9 B12
B7
B2
B3
B4 B5
B6
B10
B11
B1
B8
B L
LB list
RT list
圖 4_14 攪亂的操作
會改變的,以這個例子來說,包含了
{
B4,B5,B6,B7,B11}
,另一個是屬於不會改變 原本的區塊大小的,以這個例子來說,包含了{
B1,B2,B3,B9,B10,B12}
,最後我們 需要將可能會改變的區塊一個一個的根據原本的相鄰關係儘量地擺放回來,這樣 就是一個完整的攪亂動作。整個模擬退火法中,設我們做了一個攪亂的動作,所得到最後的版面劃的面 積稱為新的解(NewSolution),而原本還沒作攪亂之前的解稱為解(Solution),若新 的解比原本的解好,我們就會接受這一個攪亂的動作,反之我們就會有條件地接 受不好的結果,直到溫度降到終止溫度為止,整個演算法如下所示:
SA_Floorplan()
{ Set initial temperature, Temp ;
Set initial solution, Solution = Initial DBL from one original compacted floorplan;
while ( Temp > Stop_Temperature ){
Random select one of the modcule to do the perturbation
operations,BlockResizing;
NewSolution = One new DBL from the perturbation operation for the original compacted floorplan;
△C = Cost(NewSolution) – Cost(Solution);
if (△C < 0 )
Solution = NewSolution;
else if (RANDOM(0, 1) < Temp
C
e
− Δ
) Solution =NewSolution;
Temp = γ*Temp;
}//end while loop }//end SA_Floorplan()