蒐集相關文獻,整理目前在數獨遊戲上的研究,包括一般的數獨解題法、
重複數獨盤面的定義、提示數 17 題目產生法等。第三~五章,將依據整個 研究的先後順序,一一介紹:第三章會提出一個新的解題法,從邏輯和集 合的觀點進行解題,並簡化、改進解題方法;第四章,針對基因演算法提 出改進的方式,說明如何去除過半數的排列組合,並完全且快速的檢查新 產生盤面是否重複;第五章,會針對實作後的程式,列出實驗結果及分析。
最後,第六章會提出結論、待解問題,以及未來可能的發展方向。本研究 之流程如圖 5 所示。
圖 5 研究步驟與章節配置圖 確定研究問題
研究過程陳述
分析研究成果
結論與建議
第二章、相關文獻與基礎理 第一章、前言
第三章、候選個數解題法 第四章、改良基因重整繁衍 第五章、實驗結果
第六章、結論與未來展望 蒐集、綜合文獻資料
第二章
6
以上只是直觀解題法中簡單的例子,但是在實際上卻有著不容易實作的 問題。
2.1.2. 候選數解題法
根據數獨的規則,在空格中填上可能是解答的數字-稱為候選數,再根 據候選數做邏輯的分析,填上正確答案,或是刪除錯的候選數,這就是候 選數解題法[2][5][8]。目前已知的解題法計有:唯一候選數法(Naked Singles)、數對刪除法(Naked Pair)等共九種。本研究將此九種解題法 歸納為四大類,命名為(1) Naked Series、(2) Hidden Series、(3) Locked Series、以及(4) X-Wing Series。在本研究中,為了使用之方便,因此將 每項解題法另外命名,如表 1 所示。
表 1 候選數解題法整理
分類 解題法名稱 本研究命名
Naked 系列
唯一候選數法(Naked Singles)
數對刪除法(Naked Pair)
三鏈數刪除法(Naked Triplets)
Naked 1 Naked 2 Naked 3
Hidden 系列
隱性唯一候選數(Hidden Singles)
隱性數對刪除法(Hidden Pair)
隱性三鏈數刪除法(Hidden Triplets)
Hidden 1 Hidden 2 Hidden 3 Locked 系列 區塊刪除法(Locked Candidates) Locked X-Wing 系列 矩形頂點刪除法(X-Wing)
三鏈列刪除法(Swordfish)
X-Wing 1 X-Wing 2
以下將分類介紹此解題法中常見的方法。其中,本節下列之內容所指的 9 格區域泛指符合數獨規則的一行、一列、3x3 矩陣。
Naked Naked Naked
Naked 系列系列系列 系列
7
8
(6,1)及(8,1)的候選數 4、6、8,則這三格中不可能有其他候選數,所 以其他候選數應該刪除。
9
10
11
重複數獨盤面是指將行、列、數字,予以對調轉換而產生的盤面。透過 這個定義,可以將數獨的解盤面共 6,670,903,752,021,072,936,960 個,
扣除不需要重複考慮的數獨盤面,減少至 5,472,730,538 個[3]。同理,在 產生盤面並檢查是否重複時,透過這層定義,可以縮小需要考慮的重複盤 面數量。
只要透過表 2 所指定的六個方式,將數獨盤面的行、列、數字,予以 對調轉換,所能產生的盤面都是重複盤面,文後之附錄 A 列出重複盤面的 範例。
表 2 重複盤面之對調方式 對調方式
對調方式對調方式
對調方式 組合個數組合個數 組合個數組合個數
行列對調 2
列 1/2/3 相互對調 列 4/5/6 相互對調 列 7/8/9 相互對調
(3!)3
行 1/2/3 相互對調 行 4/5/6 相互對調 行 7/8/9 相互對調
(3!)3
三大區域相互對調 列 1~3、列 4~6、列 7~9
3!
三大區域相互對調 行 1~3、行 4~6、行 7~9
3!
數字 1~9 相互對調 9!
總結以上所有的方式,總計可以產生 9! x (3!)6 x 2 共 1218998108160 種組合。如果要比對某個新產生的盤面是否重複,就必須考慮這麼多可能 的盤面,若以每千分之 1 秒的速度來比對其中一種可能,全部比對完畢約 需要 38 年的時間。
2.3. 提示數 17 題目產生法
12
自數獨解題法引起研究的熱潮後,緊接著就是題目產生法,其中也有方 法是利用重複盤面的定義,產生不同的盤面。最古老的方式為亂數產生法。
此產生法首先以現有的提示數 17 盤面,亂數隨機產生新盤面,隨後驗證盤 面是否符合數獨規則,以及驗證是否此盤面有唯一解。這種方法若用在提 示數 17 問題的產生上,總是產生牴觸規則或是多重解的盤面,效率非常差。
因此,本節將介紹幾款成功率較高之題目產生法,說明如何較有效率地產 生全新的提示數 17 盤面,並驗證是否符合數獨規則。
2.3.1. 必選集合產生法
所謂的必選集合(Unavoidable Set)[7],就是在解的盤面上之具有連鎖 反應的組合。如果這個組合中所有的數字都不是提示數字,一定會產生多 重解,如圖 11。若標示的六個位置都沒有提示數字,這個題目就至少有兩 個解。
圖 11 必選集合
一個填滿數字的數獨解盤面,都可以找到很多這樣的必選集合,為了形 成唯一解,就要設法解除這種必選集合。方法是從這些必選集合中,選擇 一個數字使成為提示數字。如圖 12,將必選集合中的其中一個候選數 3,
改為提示數字,其他五個空格就只剩下一種可能。
7 6 4 3 2 1 9 8 5 3 2 1 9 8 5 7 6 4 9 8 5 7 6 4 2 22 2 3 33 3 1 6 4 7 2 1 3 8 5 9 2 1 3 8 5 9 6 4 7 8 5 9 6 4 7 1 11 1 2 22 2 3 4 7 6 1 3 2 5 9 8 5 9 2 4 7 8 3 33 3 1 11 1 6 1 3 8 5 9 6 4 7 2
7 6 4 3 2 1 9 8 5
3 2 1 9 8 5 7 6 4
9 8 5 7 6 4 33 3 2 3 22 2 1
6 4 7 2 1 3 8 5 9
2 1 3 8 5 9 6 4 7
8 5 9 6 4 7 22 2 1 2 11 1 3
4 7 6 1 3 2 5 9 8
5 9 2 4 7 8 11 1 3 1 33 3 6
1 3 8 5 9 6 4 7 2
13
此演算法[1]利用基因繁衍的特性 可歸納為三個主要步驟
變(改變一小部份提示數字 複)。
其中,突變是此演算法
小部份提示數字,所以比較不容牴觸數獨規則 解的題目。以下分成 2
為 1),以此方式共可以產生
a. 從現有的 17 個提示數字中 b. 在剩下的 65 個空格中
最後動作,驗證是否唯一解 解題法檢驗是否唯一解
大,所以只根據「數字 中的盤面一一進行比對 超過 20 萬筆新盤面。
14
利用基因繁衍的特性,經由本研究整理、
可歸納為三個主要步驟:(1)繁衍(以現有的提示數 17 盤面為母盤 改變一小部份提示數字)、以及(3)適者生存(驗證是否唯一解
此演算法的核心,相較於亂數產生法,它僅更改母盤的一 所以比較不容牴觸數獨規則,也比較可能產生具有唯一
2 個動作解釋突變的方式(假定改變的提示數字個數 以此方式共可以產生 C117 ( C16491+C1181 ) = 9928
個提示數字中,選擇 1 個予以移除,如 個空格中,填入新的提示數字,如圖
(a) (b)
圖 14 基因重整繁衍法
驗證是否唯一解,及是否不重複之步驟,該篇論文以候選數 解題法檢驗是否唯一解。至於盤面是否重複,因為重複盤面的數量相當龐
數字 1~9 相互對調」產生對應的重複盤面 中的盤面一一進行比對。經由一個月的時間繁衍出八代新生子
。然而,本研究卻認為此演算法有兩個問題不容忽視
、綜合演算過程,
盤面為母盤)、(2)突 驗證是否唯一解、是否重
它僅更改母盤的一 也比較可能產生具有唯一 假定改變的提示數字個數 ) = 9928 種組合。
如圖 14 (a)。
14 (b)。
該篇論文以候選數 因為重複盤面的數量相當龐 產生對應的重複盤面,再與資料庫 經由一個月的時間繁衍出八代新生子,總計獲得
本研究卻認為此演算法有兩個問題不容忽視:
15
經實驗發現,此演算法每次產生的 9928 個待驗棋盤中,約 2/3 牴觸規 則,1/3 有多重解,產生的唯一解盤面個數平均只有 2 個。
根據重複盤面[3]之定義,任一盤面都有 1218998108160 種可能,但「數 字 1~9 相互對調」僅檢查出 9!,共 362880 種重複盤面,由此可發現,
此方式無法確實刪除重複盤面。
綜上所述,本章首先整理數獨常用之候選數解題法、並定義重複盤面、
最後介紹基因重整繁衍法及提出其問題。本研究將綜合這些文獻,以候選 數解題法為基礎,提出新的解題法;進一步改良基因重整繁衍法,改善新 生盤面的產生效率,並提出一個可以嚴謹且快速地檢查新生盤面是否重複
的方法。
16
第三章 第三章 第三章
第三章、 、 、 、候選個數解題法 候選個數解題法 候選個數解題法 候選個數解題法
本研究綜合文獻,提出新的數獨解題方法,命名為「候選個數解題法」。
本章第一節先定義所使用到之數學符號及算式;第二節介紹演算法內容;
第三節提出一些實作的技巧用以提昇效率。
3.1. 定義
候選個數解題法主要是建構在集合與邏輯分析上,所以先定義所有使用 到的元素。以候選數出現的位置及候選數本身作為元素,參考圖 1 定義如 下:
C 為行行行的集合,集合元素有 c1~c9。 行
R 為列列列的集合,集合元素有 r1~r9。 列
D 為候選數候選數候選數的集合,集合元素有 d1~d9。 候選數
B 為 3x33x33x33x3 區塊區塊區塊區塊的集合,集合元素有 b1~b9。
N 為 3x33x33x33x3 區塊中每一小格位置區塊中每一小格位置區塊中每一小格位置區塊中每一小格位置的集合,集合元素有 n1~n9。
以圖 15 為例,第一列上的每一行上都有候選數,所以可以得到行的集 合 C = {c1, c2, c3, c4, c5, c6, c7, c8, c9}及列的集合 R = {r1},而 出現的候選數從 1 到 9 都有出現,因此可以得到候選數的集合 D = {d1, d2, d3, d4, d5, d6, d7, d8, d9}。
圖 15 Naked 1 範例
1 2 3 4 5 6 7 8 9
1
1468
7 77 7
5789 12 45
123 456
35 89
12 489
23 489
67 89
2 3 4 5 6 7 8 9
17 果也可以由公式推導出來,例如:CollectD({c1,c2,c3}),{r1}) = D(c1,r1)
∪ D(c2,r1) ∪ D(c3,r1) = {d1,d3,d6,d8} ∪ {d7} ∪ {d5,d7,d8,d9} = {d1,d4,d5,d6,d7,d9}
本研究中定義 |F(x)| 代表 F(x)這個集合內的元素個數。以圖 15 為 例,第 3 行第 1 列有候選數 5、7、8、9 共 4 個,這句話可表示為|D(c3,r1)|
= |{d5,d7,d8,d9}| = 4。依此類推,
|C(r1,d7)| = |{c2,c3,c9}| = 3
|R(c3,d7)| = |{r1}| = 1
|CollectD({c1,c2,c3},{r1})| = |{d1,d4,d5,d6,d7,d8,d9}| = 7
3.2. 解題法
18
這個章節將藉上一節所做的定義,依先前三大分類依序介紹,分別為:
Naked 系列、Hidden 系列、X-Wing 系列。
3.2.1. Naked 系列
根據先前集合的定義,如果 CollectD(C,R)=D 且 |C|=1,|R|=|D|=w , 這就是 Naked w。同理,如果 CollectD(C,R)=D 且 |R|=1,|C|=|D|=w ; CollectD(B,N)=D 且 |B|=1,|N|=|D|=w ,均為 Naked w。以下一一舉例驗 證。
Naked 1Naked 1Naked 1Naked 1 範例範例範例範例((((w=1w=1w=1w=1))) )
以第 7 頁的圖 7 (a)為例,在第 1 列第 2 行的位置上,僅有一個候選數 7,符合條件 CollectD({c2},{r1}) = {d7} 且 |{r1}| = 1,|{c2}| =
|{d7}| = 1。
Naked 2Naked 2Naked 2Naked 2 範例範例範例範例((((w=2)w=2)w=2)w=2)
以第 7 頁的圖 7 (b)為例,第 1 列第 2、6 行的位置上,僅有二個候選 數 7、9,符合條件 CollectD({c2,c6},{r1}) = {d7,d9} 且 |{r1}| = 1,
|{c2,c6}| = |{d7,d9}| = 2。
Naked 3Naked 3Naked 3Naked 3 範例範例範例範例((((w=3w=3w=3w=3))) )
以第 7 頁的圖 7 (c)為例,第 1 列第 2、5、6 行的位置上,僅有三個候 選數 3、7、9,符合條件 CollectD({c2,c5,c6},{r1}) = {d3,d7,d9} 且
|{r1}|= 1,|{c2,c5,c6}| = |{d3,d7,d9}| = 3。
3.2.2. Hidden 系列
同理,根據集合定義,如果 CollectC(R,D)=C 且 |R|=1,|D|=|C|=w ; CollectR(C,D)=R 且 |C|= 1,|D|=|R|= w ; CollectN(B,D)=N 且 |B|=1,
|D|=|N|=w ,均為 Hidden w。以下一一舉例驗證。
19
Hidden 1Hidden 1Hidden 1Hidden 1 範例範例範例(範例((w=1)(w=1)w=1)w=1)
以第 8 頁的圖 8 (a)為例,第 1 列上的候選數 5,僅出現在第 3 行的位 置上,符合條件 CollectC({r1},{d5}) = {c3} 且 |{r1}| = 1,|{d5}|
= |{c3}| = 1。
Hidden 2Hidden 2Hidden 2Hidden 2 範例範例範例(範例((w=2)(w=2)w=2)w=2)
以第 8 頁的圖 8 (b)為例,第 1 列上的候選數 1、9,僅出現在第 5、9 行的位置上,符合條件 CollectC({r1},{d1,d9}) = {c5,c9} 且 |{r1}|
= 1,|{d1,d9}| = |{c5,c9}| = 2。
Hidden 3Hidden 3Hidden 3Hidden 3 範例範例範例(範例((w=3)(w=3)w=3)w=3)
以第 8 頁的圖 8 (c)為例,第 1 列上的候選數 4、6、8,僅出現在第 1、
6、8 行的位置上,符合條件 CollectC({r1},{d4,d6,d8}) = {c1,c6,c8}
且 |{r1}| = 1,|{d4,d6,d8}| = |{c1,c6,c8}| = 3。
3.2.3. X-Wing 系列
同理,根據集合定義,如果 CollectC(R,D)=C 且 |D|= 1,|R|=|C|=w ; CollectR(C,D)=R 且 |D|= 1,|C|=|R|=w ,均為 X-Wing w。其中,當 w=1 時可直接套用 Naked 1 或是 Hidden 1,除此之外,以下一一舉例驗證。
XXXX----WingWingWingWing 2222 範例範例範例(範例((w=2)(w=2)w=2)w=2)
以第 10 頁的圖 10 (a)為例,第 1、9 列上的候選數 8,僅出現在第 5、8 行 的位置上,符合條件 CollectC({r1,r9},{d8}) = {c5,c8} 且 |{d8}| = 1,
|{r1,r9}| = |{c5,c8}| = 2。
XXXX----WingWingWingWing 3333 範例範例範例範例(((w=3)(w=3)w=3) w=3)
以第 10 頁的圖 10 (b)為例,第 1、2、9 列上的候選數 8,僅出現在第 2、
以第 10 頁的圖 10 (b)為例,第 1、2、9 列上的候選數 8,僅出現在第 2、