• 沒有找到結果。

第四章 系統實作與結果分析

N/A
N/A
Protected

Academic year: 2021

Share "第四章 系統實作與結果分析 "

Copied!
16
0
0

加載中.... (立即查看全文)

全文

(1)

第四章 系統實作與結果分析

第一節 系統實作

為了實現「基因重整繁衍」演算法,並且落實唯一解的篩檢與重複性的 篩檢,在本論文中實作一套名為「17 個提示數之數獨盤面產生器(Generator for the set of 17 hints) 」的程式,利用現有三萬多筆 17 個提示數之數獨盤面 [10],繁衍出超過 20 萬筆具唯一解且不重複的 17 個提示數之數獨盤面。本 研究實作環境之軟、硬體規格如下:

項次 規格名稱 規格描述

1 程式開發語言 Java SDK 1.4.0.2-09

2 作業系統 Windows XP Professional Version 2002 Service Pack 2 3 主機 CPU Pentium 4 CPU 1.80GHz

4 記憶體 RAM 512 MB 5 硬碟容量 40G

表一 系統規格

17 個提示數之數獨盤面產生器(Generator for the set of 17 hints) 的程 式,將讀入的母體資料做基因重整繁衍產生子代候選盤面檔案後,再去篩檢 唯一解以及重複性,確認每個盤面皆具備有效性以及獨特性後產出優生子 代。每個優生子代又可成為下一代的母代,透過相同流程產生孫代,代代相 傳創造無數子代,便是開發「17 個提示數之數獨盤面產生器」的最終目標。

系統流程圖如下:

(2)

讀入下一個子 代候選盤面

開始

基因重整繁衍 產出子代候 選盤面檔案 讀入母代資料

判別唯一解 刪除盤面

寫入唯一解子代 候選盤面檔案

讀入所有祖先資料及唯 一解子代候選盤面

排序性重整

分別存入子代Hash table

與祖先代Hash table

讀入子代Hash table

Key 值

寫入優生 子代檔案

兩代的 Value 是否相同 祖先代是否

有相同 Key 刪除子代 Value

結束 取完畢 取完畢

Yes

No

Yes Yes

No No

圖九 母代產生子代之流程圖

程式一開始,首先讀入母代的資料,將網路上所獲得的 36628 筆 17 個提

(3)

示數之數獨盤面設定為第一代--G1,而利用 G1 繁衍出的第二代則稱為 G2;

母代 G1 的資料讀入到程式後,將被轉換為 Hash Table 的資料結構存放,利 用 Hash Table 的特性,將每筆盤面依 Key 值作為分類,相同 Key 值所對應 到的所有盤面都存放在 Value 之中,協助後續演算法中快速的比對及運作。

其中 Key 值存放的是每組盤面根據其內含的提示數與格位數相乘所產生的 數值;Value 值則是存放該盤面的相關資料,如圖十所示。由於盤面成千上 萬筆,所計算出來的 Key 值有可能會重複,所以在 Value 的型態上必須設定 為 Vector,使得每次取得新盤面時,相同的 Key 值會累加在相同的 Value 位置而不被覆蓋。Hash Table 的 size 預設為 10,000,目前累計至八代資料仍 然足夠使用,每代增長的幅度不大。

Key Value

圖十 Hash Table Key 存放每個

盤面的 hint 值

×格位數

Value 存放盤面資訊,以 Vector 型態存放,裡頭包含 資訊有:

int [] hints int [] hint_index int [] empty_index int [] entries

每個數獨盤面都以整數陣列格式存放,在本論文中將存放完整盤面的 陣列命名為「entries」(原始盤面陣列),以圖十一的盤面為例:

(4)

3 5 2 9 1 7

6 7 1

2 9

1 6

4 2 9 3

圖十一 數獨提示盤面

盤面中有 81 個格位,第一個格位數中的提示數將會存放於陣列的第一 個位置,如果格位內並無提示數,則提示數以“0”取代,儲存陣列如下圖:

格位數

提示數 陣列位址

圖十二 數獨盤面所存放之陣列格式

依照圖十二的儲存陣列,將格位數與提示數相乘:1×3 + 2×5 + 3×0 +…+

80×9+ 81×3 = 2929,則 2929 就代表此數獨盤面特有的編號,在本論文中將 此編號設為 Key,提示數陣列則存入 Value 中的 Vector。

除了整個盤面的陣列外,另一個整數陣列專門存放提示數的內容,在本 論文中稱之為「hint」(提示數陣列),以圖十一的數獨提示盤面為例,盤面 共有 17 個提示數,則逐一將提示數存放到 hint 陣列中,第一個提示數為 3,

第二個提示數為 5,以此類推,紀錄所有的提示數,陣列長度為 17,如圖十 三。

(5)

3 5 2 9 1 7 6 7 1 2 9 1 6 4 2 9 3

圖十三 hints 陣列

而另一個整數陣列專門存放提示數的所在格位數,在本論文中稱之為

「hint_index」(提示數格位陣列),舉例而言,仍舊是以圖十一的數獨提示盤 面為例,第一個提示數(非 0 之提示數)—3 的所在格位數為 1,所以 hint_index 陣列所存放的第一個值就是 1,第二個提示數—5 的所在格位數為 2,所以 hint_index 陣列所存放的第一個值就是 2,以此類推,紀錄所有提示數的所 在格位數如圖十四。

1 2 4 6 15 16 31 32 34 37 46 56 59 70 71 80 81

圖十四 hint_index 陣列

最後一個整數陣列存放的則是非提示數的所在格位數,也就是 0 所存放 的格位數,在本論文中稱之為「empty_index」(空格數格位陣列),以圖十一 的數獨提示盤面為例,格位數 3 中所存放的正是非提示數(也就是 0),所以 empty_index 陣列所存放的第一個值就是 3,第二個值為 5,以此類推,紀錄 所有非提示數的所在格位數,陣列長度為 64,如圖十五所示。

3 5 7 8 9 10 11 12 13 14 17 18 19 20 78 79

陣列長度= 64

圖十五 empty_index 陣列

將所有的盤面資料讀入並且轉換成上述的資料結構之後,接著就要開始 執行「基因重整繁衍」演算法,在第二章第二節中有提到,此演算法有兩類 基因組合方式;第一類基因組合為:刪除一個基因,之後在其它 64 個空格 中補一個基因,擷取部份程式碼如下:

(6)

16 ENDFOR 15 ENDFOR

14 ENDFOR 12 ENDIF

13 ENDFOR

11 的該格位中;

09 ELSE

10 填入“原始盤面陣列該格位中的數值"於新生盤面陣 08 填入數值“0"於新生盤面陣列的該格位中;

07 ELSE IF 格位數等同於提示基因格位陣列中的數值 THEN 06 填入“1 到 9 的每個數值"於新生盤面陣列的該格位中;

05 IF 該格位數等同於空格基因格位陣列中的數值 THEN 04 FOR 81 個格位中的每個格位 //81 grids

03 FOR 數字 1 到 9 的每個數值 //9 candidates 02 FOR 每個空格基因格位陣列中的數值 //64 empty_index 01 FOR 每個提示基因格位陣列中的數值 //17 hint_index

圖十六 基因重整繁衍法之第一類基因組合程式碼

圖十六中的程式虛擬碼描述的是基因重整繁衍法中的第一類基因組合,

主要目的就是在提示基因中依序挑選出一個提示基因使之變成空白基因,之 後再依序挑選一個空白基因並填入數字 1~9 使之成為提示基因。利用巢狀廻 圈的方式,逐一搜尋每個提示基因格位陣列(hint_index)中的數值,也就是提 示基因的格位數,以及每個空白基因格位陣列(empty_index)中的數值,也就 是空白基因的格位數,在每輪中掃描所有(81 個)格位,將提示基因一一替換 為空白基因,另外空白基因也逐一由數字 1~9 取代成為新的提示基因,並將

(7)

新的基因組合存放到「新生盤面陣列」中。

由於提示基因會輪流變成空白基因,所以有 17 種組合;空白基因的個數 有 64 個( = 81 – 17),而每個空白基因都可再被填入 1~9 的數字,故每個空 白基因要轉換成提示基因的過程中會衍生成 9 個不同的提示基因,綜合來 看,每個母體盤面會製造出 17×64×9=9792 個新的盤面。

第二類基因組合則是將提出來的提示數設定為非提示數的另外 8 個數 字,也就是在原始被刪除的提示數位置中填入與原提示數不同的其它 8 個數 字。每個盤面會有 17×8=136 個新盤面,擷取部份程式碼如下:

圖十七 基因重整繁衍法之第二類基因組合 程式碼 11 ENDFOR

12 ENDFOR

10 ENDIF

08 填入“1 到 9 不同於提示基因的每個數值"於新生盤面陣 09 列的該格位中;

07 ENDFOR

05 填入“原始盤面陣列中該格位數的數值"於新生盤 06 面陣列的該格位中;

04 FOR 81 個格位中的每個格位

03 IF 數字 1 到 9 的數值與提示基因陣列中的數值不同 THEN 02 FOR 數字 1 到 9 的每個數值 //9 candidates

01 FOR 每個提示基因格位陣列中的數值 //17 hint_index

圖十七描述的是基因重整繁衍法中的第二類基因組合,主要目的就是將 原提示基因由其它數字取代成為新的提示基因。作法為挑選出一個提示基 因,再從數字 1~9 中剔除與原提示基因相同之數字,將其餘 8 個可能數字依 序填入提示基因,產生的新組合存放於新生盤面陣列之中。

(8)

上述兩種基因組合相加起來,就形成 17 個提示數之候選數獨盤面,每 一個母體盤面總共會形成 9792 + 136 = 9928 個 17 個提示數之候選數獨盤面。

產出子代候選盤面後,利用 Quick_solver 作為「唯一解」之篩檢器;

Quick_solver 是改寫 Solver 程式而來,主要是利用 Solver 能夠針對每一筆輸 入的盤面,去計算出屬於該盤面的所有解答之功能。由於 Solver 程式是以 C 語言開發,而本論文所發表的「17 個提示數之數獨盤面產生器」則是以 Java 語言開發,故為了要整合兩種語言程式的開發,在本論文中將 Quick_solver 最 終 產 生 的 執 行 檔 , 包 在 BAT 檔 案 內 , 並 使 用 Java 所 提 供 的 函 式 Runtime.getRuntime().exec(),才能順利將兩者不同語言之程式結合。透過 Quick_solver 的篩檢,會將具有多個解或者無解的盤面剔除,僅剩下具有唯 一解的盤面,在本論文中稱這些子代為「具唯一解之子代候選盤面」。

接下來便是「重複性」之篩檢了,由於基因重整的方式,有可能會產生 與祖先代相同的盤面,所以必須特別做重複性的篩檢動作。而除了盤面完全 相同者必須篩檢之外,特別必須注意「數字 1~9 的對稱性組合」,乍看之下 完全不相同的兩個盤面,實質上可能是數字對稱性組合而成的,其實是完全 相同的盤面,所以必須被篩檢出來。在本文第三章第二節中提到「排序性的 重整」,也就是將每個提示數,依照順序將其重新編號,使得數字 1~9 的所 有對稱性組合盤面得以用一個序列性編號作為代表,擷取部份程式碼如下:

(9)

01 FOR 原始盤面中的每一個基因 02 IF 基因不為空白基因 THEN 03 FOR 數字 1~9

04 IF 原始盤面中的基因與數字 1~9 的序號對應提示數相同 THEN 05 將“該數字所代表的序號"填入排序盤面相對於原始盤 06 面的相同格位中;

07 ENDIF

08 IF 數字 1~9 之廻圏數等於 9 THEN

09 序號加一;//代表掃過一次目前所有已找到的數字 1~9 序號 10 對應提示

11 將“序號"填入排序盤面相對於原始盤面的相同格位中;

12 將“原始盤面的提示基因數"填入數字 1~9 的序號對應中;

13 ENDIF 14 ENDFOR 15 ELSE

16 將“0"填入排序盤面相對於原始盤面的相同格位中;

17 END IF 18 ENDFOR

圖十八 排序性重整程式碼

排序性重整是利用提示數被發現的順序,存入「數字 1~9 序號對應陣列」

中,「數字 1~9 序號對應陣列」簡而言之就是存放序號 1~9 所對應到的提示 數數字的陣列,利用廻圈掃過原始盤面的每個基因,一旦提示基因與數字 1~9 序號對應陣列中所存放的數字相同時,則提出該數字所代表的序號,填 入排序盤面中;至於空白基因則不改變其基因內容與所在格位數,直接填入 排序盤面中,將原始盤面完整掃過一遍後,最終會得到一個排序盤面 (order_set)。

圖十八中的排序盤面(order_set)會形成排序重整過後的盤面,依序將所遇 到 的 提 示 基 因 轉 換 為 排 序 性 數 字 , 例 如 原 始 盤 面 若 設 定 為 {700400000,000000200,000000000,010050009,050000060,000300080,8046000 00,000090100,300000500} , 經 過 排 序 性 重 整 的 正 規 化 程 序 則 會 變 成

(10)

{100200000,000000300,000000000,040050006,050000070,000800090,9027000 00,000060400,800000500};

將所有的盤面皆轉換為排序性重整過的正規化盤面後,便可剔除因數字 1~9

重複性比對的方式,先對子代候選盤面做一次重複性檢查,由於不同的 母代

圖十九 同代間重複狀況

上圖中有兩個不同的母代盤面,經由「基因重整繁衍法」挑選一個提示 基因

剔除同代間的重複後,接著則是比對子代與祖先代的重複性,利用 Hash Tab

對稱性組合所造成的重複性盤面,子代同代間先做一次重複性比對後,

再將新生子代與所有祖孫代盤面做重複性比對,剔除相同的盤面後便是最終 的優生子代。

可能會因基因重整的過程,產生出相同的子代,所以必須刪減掉同代的 重複性盤面,同代間產生重複盤面的狀況如圖十九:

母代 1:

母代 2:

子代 1:

子代 2:

“E"將其刪除變成空白基因後,又填入新的替代提示基因“F",就 會產生出兩個相同的子代。

le 中的 Key 值,在本論文中將子代候選盤面存放到子代的 Hash table 中,

並且運用與母代相同的方式給定每個盤面一個 Key 值,再拿子代雜湊表的 Key 值與母代雜湊表的 Key 值比對,由於 Key 值的計算方式相同,所以如 果子代雜湊表中的 Key 值,母代也有,那麼便有可能是有重複的盤面存在,

但由於計算方法中也會有不同盤面但相同 Key 值的碰撞機會,所以必須再

(11)

做更進一步的檢查,將兩者 Key 值中的 Value 拿來比對,Value 中存放的是 相同 Key 值的數獨盤面陣列群,拿子代 Value 中的數獨盤面陣列群與母代 Value 中的數獨盤面陣列群逐一比對,如果有相同的盤面,則刪除子代盤面。

第二節 結果分析

在本論文中實作了「17 個提示數之數獨盤面產生器」之後,實際上經過 約一

本研究中的數獨盤面產生器主要是母代利用自體繁殖的方式產生出子 代(G

個月的時間,成功繁衍出 8 代新生子代,平均每個新生子代的產生時間 為 4 天,累計有超過 20 萬筆以上的 17 個提示數之數獨盤面,而這 20 萬個 新生的盤面,皆是目前最難解的數獨題目,如果以人工每天解一個最困難的 17 個提示數之數獨盤面,則至少得花上 550 年才有機會將這些題目解完。

1G2),再將子代當成下一代的母代,以同樣的方式,進一步繁衍 (G2G ),代代相傳而成,而已經繁衍過的母代並不會再成為孫代的母代,

因為基因重整繁衍法的過程中已經置換掉母代裡的所有提示數,如果已經繁 衍過的母代在成為孫代的母代,則會造成大量重複的盤面,故每一代都只會 繁衍一次,而傳承的工作就交由新生的子代去完成。經由這種繁衍的方式,

本研究所得到的 17 個提示數之數獨盤面就能夠不斷的累加,使得資料庫內 的資料不斷的增長,如圖二十。附錄 A 中分別舉出經過基因重整繁衍法產 生的一些盤面。

3

(12)

圖二十 G1 到 G8 繁衍示意圖

經過八代的繁衍後,產出超過 20 萬筆的新生盤面;在 20 萬筆 17 個提 示數之數獨盤面產生的同時,也有 340 萬筆 16 個提示數之數獨候選盤面被 產生,雖然目前這些候選盤面經過篩檢後發現皆不符合唯一解的條件,但持 續繁衍的結果,陸續會有更多的候選盤面有機會被挖掘為真正的 16 個提示 數之數獨盤面。

由於基因重整繁衍法主要的方法就是將提示數刪減並另外找尋其它提 示數來補足,因此子代與祖先代很容易會有重複的情況產生,只要子代選擇

(13)

刪除是祖先代所沒有的提示數,再挑選一個祖先代包含的提示數補上,則很 有可能就組成一個與祖先代完全相同的盤面,而此狀況是不可避免的,故預 估在繁衍過程中,隨著子代不斷的增長,則碰撞到祖先代相同的機會也就越 多。

在圖十九—子代生產數量趨勢圖之中,可以看到 G2 產生的數量比 G1 少了將近 5 千筆,而 G3 產生的數量也比 G2 少了將近 5 千筆,但 G4 卻出 現轉折點,沒有持續性的遞減反而為遞增的狀況,觀察其原因,發現除了重 複性會影響盤面數量之外,「唯一解」的條件成立與否,也是另一個影響盤 面數量的主要原因。當子代候選盤面被產生之後,如果唯一解的條件被滿足 的盤面比較多,則便會使得具唯一解之候選盤面增加,使得雖然重複性的盤 面被刪除數是遞增的狀況,但是具唯一解的盤面產生數量更大於因重複性要 被刪減的數量,所以導致子代產生數量有逐漸上升的趨勢。

子代產生數量趨勢圖

31,879

26,725 27,349 30,866 37,036

46,303

56,137

36,628

0 20,000 40,000 60,000

G1 G2 G3 G4 G5 G6 G7 G8

圖二十一 子代產生數量趨勢圖

本系統所採用的「基因重整繁衍法」使得每個母體盤面可以產生將近一 萬筆的候選盤面,而從圖二十的子代產生數量來看,G1 的三萬筆母體會產 出三億筆候選盤面,而這三億筆候選盤面經過篩檢後平均存留三萬筆盤面成 為真正的優生子代。因此可以推斷 17 個提示數的優生子代盤面(具唯一解且

(14)

刪除重複性的盤面)其平均產生率大約為候選盤面的萬分之ㄧ。同樣的,選 用「亂數演算法」產生候選盤面,並經過唯一解的篩檢,達到同樣的目的。

但是亂數演算法所產生的候選盤面產生出唯一解盤面的機率是多少?

在 本 論 文 中 另 外 設 計 了 一 套 亂 數 盤 面 產 生 器 , 取 名 為

「RandomSudoku」,利用簡單的亂數演算法,在 81 個格位內,任意填入 n 個數字 1~9 做為提示數,並刪除行、列、九宮格內有重複出現的數字之無效 盤面,再根據使用者輸入 m,產生出 m 個具有 n 個提示數的數獨候選盤面,

例如:輸入 n=17,代表產生提示數為 17 個的數獨盤面,再輸入 m=5000,代 表要產生 5000 筆盤面,程式結束後就會產生 5000 筆具有 17 個提示數的數 獨候選盤面。

「RandomSudoku」的主要作用,是為了計算利用亂數演算法產出的候 選盤面其產生具唯一解的優生子代盤面機率有多少?在本論文中嘗試從 17 個提示數著手,希望能從亂數演算法中取得大量的數獨候選盤面,再經過唯 一解之篩選,找到優生子代盤面,但截至目前為止,以亂數演算法產出超過 2 億筆的 17 個提示數候選盤面,都未能找到ㄧ個符合唯一解的優生子代盤 面,可以見得,雖然亂數演算法的產生方式相當簡單,但成功機率卻是微乎 其微。亂數演算法可以使用在提示個數較多的條件之下,找到符合唯一解的 優生子代盤面,一旦提示個數減少,容易形成多個解的盤面,則其成功找到 具唯一解的優生子代盤面的機率會大大降低,如圖二十二所示。

(15)

亂數產生N個提示數之唯一解盤面機率

0.000004% 0.0002% 0.002% 0.02%

0.3%

0.6%

0.0000000%

0.0500000%

0.1000000%

0.1500000%

0.2000000%

0.2500000%

0.3000000%

0.3500000%

0.4000000%

0.4500000%

0.5000000%

0.5500000%

0.6000000%

20 21 22 23 25 30

提示數個數(N)

% Rate

n n

圖二十二 亂數產生器產出唯一解比例圖

由圖二十二中,橫軸代表所設定的提示數個數,縱軸為成功產出具唯一解 之盤面機率;當提示個數設定為 30 時,利用亂數演算法產生出 30 個提示數 之數獨候選盤面,其成功產出具唯一解之盤面機率為 0.6%,產出 500 筆候選 盤面後,便有 3 筆具有唯一解之數獨盤面產生;提示數個數降低到 25 時,則 機率降低為 0.3%,每 5000 筆候選盤面中含有 15 筆具唯一解之數獨盤面;提 示個數越低,則產出具唯一解盤面的機率越低;提示數個數為 20 時,則需產 生五百萬筆候選盤面,才會有 2 筆具唯一解之數獨盤面產生,成功機率大大 降低到 0.000004%,可想而知,17 個提示數的成功機率遠遠低於 0.000004%。

以「基因重整繁衍法」和「亂數演算法」來比較,「基因重整繁衍法」

產生出 17 個提示數的成功機率為 0.01%,而「亂數演算法」產生 17 個提示數 的成功機率因為還未能從極大量的候選盤面中找到具唯一解的盤面,故尚不 可得知,但可以確定的是成功機率遠低於 0.000004%。由此數據可以證明,「基 因重整繁衍法」的方式比「亂數演算法」的方法得到更快、更多的 17 個提示 數之數獨盤面。

(16)

衍法」不但能有效且快速的找到 17 個提示數之數獨盤面,

且因為自體繁衍特性,使得產出數據有延伸性,單是繁衍八代就產出超過 20 萬筆的 17 個提示數之數獨盤面,後續可以推論將會有更多新生子代會被繁衍 出來,而產生的 17 個提示數之數獨盤面量將會相當驚人。

「基因重整繁

參考文獻

相關文件

密碼系統中,通常將想要保護的密碼訊息稱為 plain text。而將經過加密後產生的加密訊息稱為 cipher text。在這 中間的過程,會用到可以對外供應的 Public Key 以及私人保

(approximation)依次的進行分解,因此能夠將一個原始輸入訊號分 解成許多較低解析(lower resolution)的成分,這個過程如 Figure 3.4.1 所示,在小波轉換中此過程被稱為

微陣列玻片資料庫 (The Microarray Database,以下簡稱 TMD) 為本研究嘗 試建置的一套提供存取、分析微陣列玻片 (Microarray)

為了讓行動客戶端可以順利地取得所需的資料項,index bucket 必須能夠引 導行動客戶端一步一步的拿到所需的資料項,因此在廣播結構中的

1.在系統內:有分為在 TOP N 裡跟在 Change Table 裡,在 TOP N 裡就將票數加上去 後利用 Jump Table 作排序,在 Change Table 裡的話就將票數加上去並拉回到 TOP N

由於資料探勘 Apriori 演算法具有探勘資訊關聯性之特性,因此文具申請資 訊分析系統將所有文具申請之歷史資訊載入系統,利用

本章將對 WDPA 演算法進行實驗與結果分析,藉由改變實驗的支持度或資料 量來驗證我們所提出演算法的效率。實驗資料是以 IBM synthetic data generator

Kaiser 提出 MSA(Measure of Sampling Adequacy,資料做因 素分析適合性指標),雖然 MSA 的大小沒有統計上的判斷臨 界點,但實證經驗,當 MSA > 0.8 表示此組資料作因素分析