• 沒有找到結果。

加速相似運算

第四章、 其它加速方法

第三節、 加速相似運算

在初始化、計算分支度跟回溯程序裡加入了比較盤面是否為已存在盤面的相

似盤面,如果單純將盤面用十六種旋轉及對稱運算再比較有沒有出現相似盤面,

那麼在整個程式執行的時間上不僅沒有減少反而會增加計算時間,因為一個經過

雙方移動一、兩棋子就會輸的盤面,在初始化階段會先經過十六種旋轉及對稱運

度的時候又會至少再經過十六種旋轉及對稱運算。如果沒有辦法加速該運算,反

而會造成程式執行時間的增加。

如何加速旋轉及對稱運算?主要的想法在程式開始時建立一個旋轉及對稱

的表格,將相似盤面統一成一個基礎盤面,只要記錄相似盤面需要運用哪一種相

似運算到達基礎盤面,如此就不需要做十六次的盤面重排的動作,然而總共存在

有 282429536481(=324)個盤面,一個盤面的資訊用 1 Byte 來儲存也需要 282

GBytes 的空間,於是開始思考能不能以小部分的盤面就可以知道其相似盤面。觀 察旋轉及對稱的方式發現到對大部分的相似盤面來說,將位於中間的正方形拿

掉,對 16 種相似運算沒有影響。

圖4-6 去掉中間正方形不會改變相似運算的例子

因此可以只需要看最外圈和最內圈的正方形上棋子分布決定需要使用哪一

種相似運算,這樣一來就能夠將 282 GBytes 的記憶體空間需求減少為 43 Mbytes

的記憶體空間需求。

但是對小部分盤面來說,以最外圈和最內圈的正方形來判斷就會影響到其相

似運算種類,特別觀察此類小部分盤面會發現到一個特點,此類盤面若只看最外

圈和最內圈的正方形,看到的其實是相同盤面,而若以整體來看,則是看到不一

樣的盤面。也就是說只看最外圈和最內圈的正方形時,此類盤面具有經過運算是

會回到原本盤面的特性,因此特別為那些在看最外圈和內圈正方形時,經過旋轉

運算會回到自己的盤面,作一個分類記錄。

圖4-7 掉中間正方形影響到相似運算

表二 有相似計算跟沒相似計算的比較 8 4 83705798 1338557220 0.062534344 9 4 111597612 1784742960 0.062528675 5 5 30914424 494236512 0.062549859 6 5 72116072 1153218528 0.062534611 7 5 133910896 2141691552 0.062525762 8 5 200852988 3212537328 0.062521604 9 5 245479248 3926434512 0.062519634 6 6 156229360 2498640144 0.062525754 7 6 267793288 4283383104 0.062519107 8 6 368205516 5889651768 0.062517366 9 6 409106740 6544057520 0.062515762 7 7 420793096 6731030592 0.062515404 8 7 525919400 8413788240 0.06250685 9 7 525919400 8413788240 0.06250685

分類的目的是為了清楚有哪幾種相似運算會轉回原本的盤面,在進行相似盤

面比較時,只需要額外確認分類存在的相似運算是不是會產生相似盤面。改進之

後的相似盤面比較,在大部分盤面的情況下,只需要重排盤面一次,而需要重排

16 次的盤面只有 19638 個盤面。將各個資料庫經過旋轉及對稱運算之後,縮小的 比例製成表二。

經由旋轉及對稱運算的幫助使得需要用到的記憶體空間幾乎減少為原本的

十六分之一,大部分的盤面只看最內圈正方形和最外圈正方形就足夠決定旋轉及

對稱的方式,因此使用旋轉及對稱運算能提昇程式執行的速度。

相關文件