Tải bản đầy đủ (.docx) (33 trang)

Phương pháp SAT encoding hiệu quả giải quyết trò chơi logic hitori

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (775.86 KB, 33 trang )

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ - ĐHQGHN
KHOA CÔNG NGHỆ THÔNG TIN
CÔNG TRÌNH DỰ THI
GIẢI THƯỞNG “SINH VIÊN NGHIÊN CỨU KHOA HỌC”
NĂM 2015
Tên công trình: Phương pháp SAT Encoding hiệu quả giải quyết trò chơi
Logic Hitori
Họ và tên sinh viên:
Trần Trọng Tiệp Nam Lớp: K56CLC
Vũ Đình Thắng Nam Lớp: K56CLC
Đào Thị Thúy Nữ Lớp: K56CLC
Nguyễn Tuấn Anh Nam Lớp: K58CA
Nguyễn Thị Mai Hương Nữ Lớp: K58CA
Khoa: Công nghệ thông tin
Người hướng dẫn: TS. Tô Văn Khánh
1
MỞ ĐẦU
Bài toán SAT (Satisfiability) là bài toán chứng minh tính thỏa mãn hay không thỏa mãn
(SAT/UNSAT) của một công thức logic mệnh đề. Các công cụ chứng minh tự động cho
bài toán này được gọi là SAT Solver, chúng có nhiều ứng dụng trong trí tuệ nhân tạo hay
trong các bài toán kiểm chứng, kiểm thử phần mềm. Các SAT Solver đóng vai trò như
các công cụ nền (backend engine) cho các SMT (SAT Modulo Theories) Solver, là các
công cụ chứng minh tính thỏa mãn của các công thức logic xây dựng trên lý thuyết logic
vị từ cấp I (First Order Logic - FOL).
Một số bài toán có thể được giải bằng việc đưa về bài toán SAT, biểu diễn vấn đề
bằng các công thức logic mệnh đề và áp dụng SAT Solver vào giải các công thức logic
mệnh đề đó, cách tiếp cận đó được gọi là SAT Encoding.
Trong báo cáo này chúng tôi trình bày các thuật toán giải Hitori bằng các giải thuật
tìm kiếm kết hợp quay lui và SAT Encoding. Cũng trong báo cáo chúng tôi đề xuất một
phương pháp SAT Encoding mới để giải trò chơi Lôgic Hitori, được đặt tên là
Connectivity Encoding. Chúng tôi đã tiến hành thực nghiệm trên 120 bài toán dữ liệu


đầu vào để đánh giá tính hiệu quả của phương pháp Connectivity Encoding so với các
phương pháp đã đề xuất trước đấy. Connectivity Encoding cho kết quả vượt trội so với
phương pháp Chains & Cycles Encoding (một phương pháp SAT Encoding được đề xuất
trước đó) và kết quả cạnh tranh so với 2 giải thuật tìm kiếm kết hợp quay lui.
2
DANH MỤC CÁC THUẬT NGỮ VIẾT TẮT.
Thuật ngữ Tên đầy đủ
SAT Satisfiability
UNSAT Unsatisfiability
CNF Conjunctive Normal Form
NP Nondeterministic Polynomial
SMT SAT Modulo Theories
3
MỤC LỤC
4
…… 28DANH MỤC CÁC HÌNH ẢNH
5
DANH MỤC BẢNG BIỂU VÀ BIỂU ĐỒ
6
I. GIỚI THIỆU
I.1 Trò chơi logic Hitori
Hitori [ 4 ] (Hitori ni shite kure; nghĩa là "hãy để tôi một mình") là một trò chơi logic từ
Nhật Bản, được chơi trên một ma trận với kích thước n x n với và cho trước các số từ 1
đến n. Người chơi lần lượt phải bôi đen các ô số sao cho chúng thỏa mãn các luật của trò
chơi. Nó lần đầu tiên xuất hiện trên Nikoli [ 4 ] (tháng 3 năm 1990).
Hình 1.1: Ví dụ về câu đố Hitori
I.2 Luật chơi của Hitori
Luật chơi của Hitori bao gồm 3 luật về bôi đen các ô trên hàng, trên cột được trình bày
dưới đây:
• Luật 1: Giá trị của số trong mỗi ô không được xuất hiện nhiều hơn một lần ở mỗi

hàng, mỗi cột
Hình 1.1: Ví dụ về luật 1 của Hitori
7
2 2 1 5 3
2 3 1 4 5
1 1 1 3 5
1 3 5 4 2
5 4 3 2 1
Hình 1.5: Ví dụ về vi phạm luật 3
Trên cùng một hàng hoặc cột, các số xuất hiện nhiều hơn một lần sẽ phải bôi đen (xóa
ô đó đi) để thỏa mãn luật 1. Hình 1.2 thể hiện cho ta thấy luật 1 của Hitori, trên cột thứ
nhất giá trị 2, 1 không thể xuất hiện nhiều hơn một lần, bởi vậy một trong hai ô có giá trị
2, 1 trên cột 1 đã được xóa đi (bôi đen).
• Luật 2: Các ô được bôi đen không được nằm liền kề nhau trên hàng hoặc cột
Nếu ô có vị trí (i, j) (hàng i, cột j) được bôi đen thì 4 ô tại các vị trí liền kề của nó là
(i+1,j), (i, j+1), (i-1, j), (i, j-1) sẽ không được bôi đen.
Như ta thấy trên hình 1.3. Tại hàng 3, hai ô có giá trị 1 cạnh nhau đều được bôi đen,
điều này đã vi phạm luật 2 của Hitori. Hình 1.4 trình bày cách giải đúng với đầu vào
tương tự hình 3.
• Luật 3: Mọi ô không bôi đen (ô trắng) phải kết nối được với nhau. Nói cách khác
luôn tồn tại một đường đi từ mọi ô trắng đến các ô trắng còn lại.
8
2 2 1 5 3
2 3 1 4 5
1 1 1 3 5
1 3 5 4 2
5 4 3 2 1
Hình 1.4: Cách giải đúng luật 2 Hitori
2 2 1 5 3
2 3 1 4 5

1 1 1 3 5
1 3 5 4 2
5 4 3 2 1
Hình 1.3: Ví dụ về vi phạm luật 2 Hitori
2 5 1 5 3
2 3 1 4 5
1 1 1 3 5
1 3 5 4 2
5 4 3 2 1
Hình 1.6: Cách giải luật 3 không vi phạm
Hình 1.7: Đầu vào Hitori Hình 1.8: Lời giải hoàn chỉnh Hitori
Ở hình 1.5 hai ô có giá trị 5 được bôi đen đã tạo thành một đường ngăn cách ô trắng
có giá trị 3 trong góc với các ô trắng khác (vi phạm luật 3 của Hitori). Hình 1.6 là cách
giải đúng luật 3.
Trên đây là ba luật cơ bản của Hitori, với các luật trên, ta có thể đưa ra lời giải chính
xác, đầy đủ ba luật Hitori như hình 1.8 với đầu vào là ma trận 1.7.
Lưu ý: Với một ma trận đầu vào Hitori có thể có nhiều hơn một đáp án lời giải.
Phương pháp SAT Encoding có thể tìm ra tất cả các lời giải của Hitori.
9
II. CÁC GIẢI THUẬT TÌM KIẾM ĐỂ GIẢI QUYẾT HITORI
Giải thuật tìm kiếm và quay lui là phương pháp được sử dụng phổ biện trong việc giải
quyết trò chơi Lôgic Hitori. Đặc điểm chung của các phương pháp này là: cho một ô
được tô đen, sau đó tìm kiếm xung quanh ô đó những ô khác có khả năng được tô đen để
đảm bảo rằng chúng không vi phạm các quy tắc của trò chơi, nếu vi phạm, giải thuật sẽ
quay lại tìm kiếm các ô khác có khả năng được tô đen. Phần này trình bày 2 giải thuật
dựa trên tìm kiếm và kết hợp quay lui.
II.1 Thuật toán tìm kiếm thứ nhất.
Thuật toán tìm kiếm thứ nhất được trình bày trong [ 2 ] với tư tưởng dựa trên một số mẫu
(pattern) cho trước, để quyết định ô nào bắt buộc phải tô đen, ô nào phải để trắng và sau
đó thực hiện tìm kiếm tìm kiếm quay lui xem trên danh sách các ô có khả năng được tô

đen. Thuật toán bao gồm 4 bước như sau:
• Bước 1: Xây dựng các mẫu là các phần được quy định sẵn về các ô cần tô khi các
ô sắp xếp theo như mẫu đã quy định. Dưới đây là một số mẫu áp dụng cho thuật
toán.
Hình 2.1: Một số mẫu điển hình
Khi các giá trị trong các ô xuất hiện theo một số trường hợp như hình trên thì có
sự quy định rõ về ô cần phải tô đen (ô màu đen) và những ô không được phép tô
đen (những ô màu hồng), những ô còn lại là những ô có khả năng tô đen hoặc
không.
• Bước 2: Khi các mẫu không đủ để giải quyết Hitori thì phải đến phần thứ hai của
thuật toán, đó là xây dựng một hàm chuẩn StandardCyclePattern. Hàm này giống
như một mẫu nhưng phức tạp hơn. Đầu tiên cho một ô được tô đen nếu chúng là ô
bội số (ô được đánh dấu là bội nếu nó xuất hiện nhiều hơn 1 lần trên hàng hoặc
cột), vì ô đó được tô đen nên quy định 4 ô bên cạnh nó là ô không được tô (ô
trắng), mục đích để đảm bảo luật 2 của Hitori. Dựa vào những ô không được tô đó,
10
nếu chúng là bội thì xét theo hàng và cột để tô màu những ô bội còn lại và tiếp tục
xét những ô vừa tô đen. Việc xét tô đen hay không vẫn phải đảm bảo luật 3 của
Hitori.
• Bước 3: Nếu như việc sử dụng hàm StandardCyclePattern vẫn chưa giải quyết
hoàn toàn được Hitori, thì phải tới phần tiếp theo là sử dụng một Véc-tơ để lưu các
giá trị ô số nào là bội số, sau đó các phần tử của ô lần lượt được áp dụng hàm
StandardCyclePattern để xác định ô được tô màu.
• Bước 4: Phần cuối cùng của giải thuật này là phần quay lui tìm kiếm. Nếu như
bước 3 vẫn chưa thể giải được bài toán thì giải thuật quay lui sẽ được sử dụng. Nó
sẽ tô đen một ô chưa xác định và từ đó xác định những ô còn lại. Nếu mà nó dẫn
đến một trạng thái không phù hợp thì ô được tô đen đó phải là ô màu trắng. Và
quay lui đến khi nào giải được ma trận Hitori.
II.2 Thuật toán tìm kiếm thứ hai
Thuật toán tìm kiếm thứ hai [ 12 ] có tư tưởng khá giống với thuật toán tìm kiếm thứ

nhất, nhưng khác ở các mẫu mà nó áp dụng. Cụ thể bao gồm 4 bước như sau:
• Bước 1: Thực hiện tìm kiếm các mẫu cơ bản, các trường hợp tìm ra các ô chắc
chắn bị xóa đi hay giữ lại
Hình 2.2: Một số mẫu cơ bản
Với các mẫu trên:
o Mẫu thứ nhất: Nếu M=N thì Q phải được để trắng (không được tô đen).
o Mẫu thứ hai: Nếu A=B và A, B nằm cạnh nhau thì các số giống với A, B khác phải
bị xóa (C, D bị tô đen)
o Mẫu thứ ba: Nếu có một số nằm giữa hai số bằng nhau thì số đó phải được để
trắng.
o Mẫu thứ tư: Nếu M=N=Q và chúng có vị trí như hình, thì Q phải bị tô đen
• Bước 2: Khi các mẫu ở bước 1 không đủ để giải quyết Hitori thì sang bước hai,
thuật toán đưa ra một số các mẫu phức tạp hơn.
Hình 2.3: Các mẫu nâng cao
11
Cụ thể áp dụng như sau:
- Nếu một số là duy nhất trong cả hàng và cột thì nó phải được để trắng.
- Nếu một ô đã bị bôi đen thì các ô liền kề cạnh với nó phải được để trắng (để đảm
bảo luật 2).
- Nếu một ô nằm kề cạnh với ba ô đã bị xóa thì nó và ô kề cạnh còn lại phải để
trắng.
- Nếu trong hàng hoặc cột đã có một ô được xác định là để trắng thì những ô khác
bằng nó trong hàng hoặc cột phải bị tô đen.
• Bước 3: Trong những ô còn lại, thực hiện đệ quy. Ở mỗi lần đệ quy, ta giả sử một
ô chưa xác định trạng thái là được giữ lại, sau đó sử dụng các mẫu nâng cao để suy
ra trạng thái của các ô khác, kiểm tra xem trạng thái được suy ra có vi phạm điều
kiện về liên thông và liền kề hay không, nếu có ta quay lui và đánh dấu lại trạng
thái của ô vừa được giả sử được giữ lại là bị xóa đi, nếu không ta tiếp tục với ô
tiếp theo. Cứ như thế cho đến khi tất cả các ô đều được xác định trạng thái.
Nhận xét: Hai phương pháp trên có tư tưởng tìm kiếm khá giống nhau, chúng đều tập

trung vào việc xác định các ô tô màu hay không dựa vào các mẫu cho trước, sau đó thực
hiện quay lui tìm kiếm. Tuy nhiên điểm khác biệt ở đây là các mẫu của thuật toán tìm
kiếm thứ hai đã bao hàm các mẫu của thuật toán tìm kiếm thứ nhất. Các mẫu của thuật
toán tìm kiếm thứ hai mang tính tổng quát và áp dụng cho nhiều mẫu nhỏ hơn.
12
III. PHƯƠNG PHÁP SAT ENCODING
Phần trên báo cáo trình bày 2 giải thuật tìm kiếm dựa trên việc tìm kiếm theo mẫu và thực
hiện quay lui. Trong phần này, chúng tôi sẽ trình bày một hướng tiếp cận khác giải quyết
trò chơi Lôgic Hitori - phương pháp SAT Encoding. SAT Encoding là phương pháp mã
hóa các luật chơi Hitori thành các công thức Lôgic mệnh đề (propositional logic) biểu
diễn dưới dạng CNF.
Trong phần này chúng tôi trình 2 phương pháp SAT Encoding khác nhau để giải Hitori:
• Phương pháp SAT Encoding có tên gọi là Chains & Cycles [ 2 ] được đề xuất vào
năm 2006
• Phương pháp SAT Encoding do nhóm nghiên cứu đề xuất - Phương pháp
Connectivity Encoding.
III.1 Các khái niệm cơ bản về SAT Encoding
a) Bài toán SAT
Bài toán SAT (satisfiability problem) [ 6 ] là một bài toán trong khoa học máy tính nhằm
kiểm tra tính thỏa mãn (satisfiability hay unsatisfiability) của một công thức logic mệnh
đề (giá trị của biến logic là true hoặcfalse). Đây là bài toán đầu tiên được chứng minh là
thuộc lớp NP - đầy đủ (NP-Complete).
Đầu vào của bài toán SAT là một công thức logic mệnh đề thường được biểu diễn
dưới dạng chuẩn tắc hội (CNF - Conjunctive Normal Form – hội của các tuyển sơ cấp).
CNF = TSC1 ∧ TSC2 ∧ TSC3 ∧ …
Ví dụ 3.1: Cho một công thức logic mệnh đề CNF như sau:
F = (P ∨ Q ∨ R) ∧ (¬P ∨ Q ∨ R)
Trong đó P, Q, R là các biến logic mệnh đề (nhận giá trị true hoặc false), (P ∨ Q ∨ R) và
(¬P ∨ Q ∨ R) là các tuyển sơ cấp hay còn gọi là các mệnh đề.
Trong ví dụ 3.1, công thức F là SAT (F = true) vì với bộ giá trị P = true, Q = false và R

= true thì F cho kết quả true.
13
b) SAT Solver
Một công cụ có thể chứng minh một cách tự động công thức logic mệnh đề là SAT hay
UNSAT được gọi là SAT Solver. Có rất nhiều công cụ giải SAT được biết tới như SAT
live [ 10 ] , SAT4j [ 9 ] , UBCSAT [ 11 ]. Ngày nay sức mạnh của SAT Solver đã có những
bước tiến đáng kể ứng dụng đáng kể trong thực tế, khả năng giải quyết các công thức đồ
sộ với hàng trăm nghìn mệnh đề, hàng triệu biến.
MiniSat [ 1 ] là một dạng mã nguồn mở cho phép các nhà nghiên cứu xây dựng và phát
triển mở rộng các SAT solver dựa trên nó. MiniSat là một SAT Solver mạnh và đã giành
nhiều giải thưởng của các cuộc thi SAT 2005 [ 1 ]. MiniSat dễ dàng chỉnh sửa và được
thiết kế tốt.
Yêu cầu đầu vào của MiniSat biểu diễn dưới định dạng DIMACS CNF
p CNF NUMBER_OF_VARIABLES NUMBER_OF_CLAUSES
Trong đó:
NUMBER_OF_VARIABLES là số lượng biến và NUMBER_OF_CLAUSES là số
lượng (số lượng các tuyển sơ cấp trong 1 công thức CNF).
c) SAT Encoding
SAT Encoding là phương pháp biểu diễn vấn đề bằng các công thức logic mệnh đề và áp
dụng SAT Solver vào giải các công thức logic mệnh đề đó. Từ kết quả trả về của SAT
Solver để đưa ra lời giải của bài toán (khi SAT Solver thông báo công thức là Satisfiable)
hoặc thông báo không tìm được lời giải (Unsatisfiable). SAT ENCODING đã được ứng
để giải quyết một số trò chơi Lôgic như Sudoku [5,8], Slitherlink, Hitori [2], Numberlink
[7] .
Ví dụ 3.2: Áp dụng SAT Encoding vào giải Sudoku.
14

Hình 3.1: Game Sudoku
Game Sudoku là một game điển hình trong việc áp dụng SAT Encoding để giải, ta mã
hóa mỗi ô trên ma trận Sudoku: x

ijk
biểu diễn ràng buộc cho một ô trên hàng i cột j và có
giá trị là k. Các luật chơi của Sudoku sẽ được mã hóa thành các mệnh đề CNF sau:
• Mỗi ô nhận ít nhất một giá trị từ 1->N
Công thức mệnh đề CNF:
x
ij1
x
ij2
x
ij3
x
ijN
• Mỗi giá trị xuất hiện ít nhất một lần trong hàng hoặc cột
Công thức mệnh đề CNF:
( x
i1k
x
i2k
x
i3k
x
iNk
) …
• Mỗi giá trị xuất hiện ít nhất một lần trong hộp * .
Công thức mệnh đề CNF :
( x
11k
x
12k

…… x
33k
)……
Với cách mã hóa như trên, Sudoku sẽ được giải bằng cách sinh các mệnh đề và đưa
vào SAT Solver giải quyết.
d) Sơ đồ giải SAT
Với việc áp dụng SAT Encoding và sử dụng công cụ MiniSAT trên, chúng tôi tiến hành
giải quyết bài theo sơ đồ dưới đây.
Sơ đồ 3.2 gồm các thành phần:
15
Hình 3.2: Sơ đồ giải SAT
• Dữ liệu vào: Là bài toán cần giải, ví dụ đầu vào là một ma trận Sudoku hay Hitori
thì nó gồm giá trị các số ở mỗi ô của ma trận.
• Bộ mã hóa: Mã hóa các luật chơi của dữ liệu vào thành các mệnh đề CNF
(conjunctive normal form) theo chuẩn DIMACS để đưa vào SAT solver. Khi mã
hóa sẽ sinh ra file input rồi đưa tới SAT Solver.
• SAT Solver: Là công cụ sẽ giải các mệnh đề trong file input rồi sinh ra file output
là kết quả giải SAT. Ở đây chúng tôi sử dụng Minisat 1.4 để giải quyết.
• Bộ giải mã: Dịch kết quả trong file output trả về từ SAT Solver, đưa ra lời giải
đọc được cho bài toán đầu vào.
• Kết quả: Là đáp án cho dữ liệu vào, nếu đầu vào là một ma trận Sudoku thì kết
quả là đáp án của ma trận sudoku đó.
III.2 SAT Encoding giải Hitori.
Trong phần này chúng tôi trình bày hai phương pháp SAT Encoding để giải quyết bài
toán Hitori: Chains & Cycles và Connectivity. Hai phương pháp đều có cách mã hóa luật
1 và luật 2 như nhau, luật 3 là luật phức tạp và khó nhất của bài toán Hitori giải bằng
SAT Encoding.
III.2.1 SAT Encoding cho hai luật đầu của Hitori
Hai loại biến Lôgic mệnh đề (biến boolean) được sử dụng để mã hóa (Encoding) cho luật
1 và luật 2 như sau:

• Biểu diễn ràng buộc về số x
ijk
: giá trị của biến này là true khi ô ở vị trí hàng i cột j
có giá trị là k. Thí dụ x
123
= true có nghĩa là ô ở hàng 1, cột 2 có giá trị là 3.
• Biểu diễn cho ô được tô đen b
ij
: kí hiệu này được hiểu rằng ô trên hàng i cột j là ô
được bôi đen (được xóa đi để thỏa mãn các ràng buộc của 3 luật trong Hitori).
Luật 1 và 2 của Hitori lần lượt được mã hóa như sau:
a) Mã hóa cho luật 1 của Hitori
Luật 1 nói rằng "Giá trị của số trong mỗi ô không được xuất hiện nhiều hơn một lần ở
mỗi hàng, mỗi cột".
Khi xác định được hai hay nhiều ô trên cùng một hàng hoặc cột có giá trị giống nhau,
ta phải mã hóa để giữ lại một ô duy trắng duy nhất và các ô trùng giá trị còn lại phải bị tô
đen (xóa đi). Mệnh đề Lôgic được biểu diễn như sau:
x
ijk
x
ij’k
→ ¬b
ij
˅ ¬b
ij’
≡ ¬x
ijk
˅ ¬x
ij’k
˅ ¬b

ij
˅ ¬b
ij’
16
Kí hiệu → biểu diễn cho phép toán suy ra (implication) và ≡ biểu diễn cho phép toán
tương đương trong Lôgic mệnh đề.
Mệnh đề trên được hiểu rằng trên cùng hàng i, nếu cột j và j’ đều có giá trị như nhau
là k thì phải tô đen một trong 2 ô đó hoặc cả 2. Mệnh đề tượng tự được áp dụng cho các ô
có giá trị như nhau trên cùng một cột.
b) Mã hóa cho luật 2 của Hitori
Luật 2 nói rằng " Các ô được bôi đen không được nằm liền kề nhau" tức là một ô khi
bị tô đen thì các ô liền kề với nó (có chung cạnh với nó) sẽ không được bôi đen.
Mệnh đề Lôgic được biểu diễn cho luật 2 như sau:
b
ij
→¬ ( b
ij+1
b
ij-1
b
i+1j
b
i-1j
) ≡
( ¬b
ij
˅ ¬b
ij+1
) ( ¬b
ij

˅ ¬b
ij-1
) ( ¬b
ij
˅ ¬b
i+1j
) ( ¬b
ij
˅ ¬b
i-1j
)
Như vậy việc mã hóa cho hai luật đầu tiên khá đơn giản, số lượng mệnh đề sinh ra
cho hai luật trên là không nhiều. Vấn đề khó khăn nhất trong việc SAT Encoding cho
Hitori nằm ở luật 3. Phần tiếp theo trình bày 2 phương pháp SAT Encoding cho Hitori đó
là phương pháp Chains & Cycles Encoding và Connectivity Encoding.
III.2.2 Chains & Cycles Encoding
Phương pháp Chains & Cycles [ 2 ] là một phương pháp SAT Encoding giải quyết trò
chơi Hitori được đề xuất năm 2006. Phương pháp này tập trung vào việc tìm ra tất cả các
Chains và Cycles trong một ma trận Hitori và từ đó sẽ sinh các công thức Lôgic (dưới
dạng lôgic mệnh đề - các tuyển sơ cấp) để loại bỏ các Chains và Cycles này. Tuy nhiên
số lượng Chains và Cycles sẽ là rất lớn khi mà kích thước của ma trận được tăng lên, đây
là một hạn chế của phương pháp SAT Encoding này. Dưới đây chúng tôi trình bày các
khái niệm Chains, Cycles và các công thức Lôgic mệnh đề để loại bỏ Chains và Cycles.
a) SAT Encoding loại bỏ Chains
• Một Chain là chuỗi các ô đen được kết nối chéo với nhau trong đó ô đầu tiên và ô
kết thúc đều là các ô thuộc biên.
Trong hình 3.3, ô (i, j) có kết nối chéo đến 4 ô lần lượt là (i-1, j-1) (i+1, j-1), (i-1,
j+1) và (i+1, j+1).
17
Hình 2.3: Các ô lân cận

Trên hình 3.4 có các 2 Chains sau: {(1,2);(2,1)}, {(3,5); (4,4); (5,3)}.
• Loại bỏ Chains
Cho một Chain C = {(i,j); (m,n); (k,l)} thì mệnh đề Lôgic tương ứng để loại bỏ chain
C là:
Cl
chain
= ¬( b
ij
b
mn
b
kl
) ≡ (¬b
ij
˅ ¬b
mn
˅ ¬b
kl
)


Hình 3.6: Áp dụng quy tắc loại bỏ Chains
Cl
chain
đưa ra ràng buộc rằng 3 ô {(i,j); (m,n); (k,l)} sẽ không đồng
thời được bôi đen.
18
2 3 4 4 2
2 3 1 1 5
3 1 3 1 3

4 2 1 2 5
5 3 4 5 1
Hình 3.5: Ví dụ về Cycles
2 1 3 1 4
1 2 4 5 3
1 5 2 1 4
3 4 5 3 3
4 3 4 2 2
Hình 3.4: Ví dụ về Chains
2 3 4 4 2
2 3 1 1 5
3 1 3 1 3
4 2 1 2 5
5 3 4 5 1
Hình 3.7: Áp dụng luật loại bỏ Cycles
1 2 3 1 4
2 5 4 5 3
5 1 2 1 4
4 3 5 3 1
3 4 4 2 2
Trên hình 3.6 chúng ta có thể thấy cách loại bỏ chains như sau: Chain C = {(3,5);
(4,4); (5,3)}. Ô (3,5) có thể được tô đen hoặc không, chính vì thế để loại bỏ Chain C,
chúng ta sẽ không được phép tô ô (3,5) mà thay vào đó chúng ta sẽ tô ô (1,5).
b) SAT Encoding loại bỏ Cycles:
• Một Cycle được hiểu là một chuỗi các ô đen được kết nối chéo với nhau trong đó
ô bắt đầu và ô kết thúc đều là một ô.
Ví dụ về Cycles được biểu diễn ở hình 3.5, ta thấy một Cycle xuất hiện là {(2,3);
(3,4); (4,3); (3,2)}.
• Encoding loại bỏ Cycles.
Việc loại bỏ Cycles cũng giống với việc loại bỏ Chains. Cho một Cycle là CY = { (i,

j); (m,n); (p,q); (k,h)} thì công thức mệnh đề logic sẽ là:
Cl
cycle
= ¬ (b
ij
b
mn
b
pq
b
kh
) ≡ ¬b
ij
˅ ¬b
mn
˅ ¬b
pq
˅ ¬b
kh
Như trong hình 3.7 thể hiện, xét ô (3,3) có 4 ô liền kề (2,3), (3,2), (3,4), (4,3) có khả
năng được tô đen, Cl
cycle
sẽ loại bỏ khả năng cả 4 ô đó đều được tô mà chỉ được phép tô
tối đa là 3 ô trong số 4 ô đó.
Như vậy với việc mã hóa loại bỏ Chains và Cycles, Chains & Cycles Encoding sẽ
tìm tất cả Chains và Cycles có thể có trong một ma trận và xây dựng các mệnh đề Lôgic
để loại bỏ chúng.
Phương pháp Chains & Cycles Encoding tính toán toàn bộ các Chains và Cycles
trong ma trận và đã giải quyết được các ràng buộc của Hitori. Tuy nhiên phương pháp
này có nhược điểm là khi ma trận càng lớn việc tính toán toàn bộ tất cả các Chain và

Cycles sẽ rất lớn dẫn công thức CNF biểu diễn sẽ phức tạp (số lượng mệnh đề trong CNF
là lớn), do đó thời gian SAT Solver giải công thức CNF sẽ tốn chi phí hơn. Bảng dưới
đây thể hiện số lượng toàn bộ Chains và Cycles của các ma trận dựa trên kích thước đầu
vào của ma trận.
19
.Nhận xét: Dựa vào bảng trên ta có thể thấy số lượng Chains & Cycles tăng một cách
nhanh chóng khi kích thước ma trận tăng. Từ kích thước đầu vào 5x5 số lượng Chains chỉ
là 82 tuy nhiên khi lên mức 12x12 con số này đã là hơn 3.500.000 Chains gấp 43. 094
lần. Với ma trận kích thước 17x17 số lượng Chains là hơn 10 nghìn tỷ và Cycles là hơn
45 tỷ. Do đó với cách SAT Encoding của theo phương pháp Chains & Cycles thì thời
gian chạy và chi phí để giải cho những ma trận từ 30x30 hay 40x40 sẽ có thời gian giải
rất lâu và chi phí tăng lên đáng kể.
Phần tiếp theo chúng tôi đề xuất một phương pháp SAT Encoding mới, được gọi là
Connectivity Encoding, một phương pháp khắc phục vấn đề bùng nổ mệnh đề so với
phương pháp Chains & Cycles Encoding.
III.2.3 Phương pháp Connectivity Encoding.
Trong phần này chúng tôi đề xuất một phương pháp SAT Encoding mới với mục đích
là làm giảm số lượng mệnh đề trong công thức CNF so với phương pháp Chains &
Cycles Encoding. Tư tưởng chính của Connectivity Encoding vẫn là tìm cách để loại bỏ
đi các Chains và Cycles trong ma trận, tuy nhiên thay vì tìm kiếm toàn bộ số lượng
Chains và Cycles đó, chúng tôi xây dựng việc liên kết chéo giữa các ô được tô đen và
đảm bảo việc liên chéo giữa các ô đen sẽ không tạo thành kết nối giữa các ô biên
(Chains) và tạo thành
20
Kích thước
(N*N)
Số lượng Chains Số lượng Cycles
5*5 82 5
6*6 230 12
12*12 3533738 96170

17*17 ~10. 553. 400. 000.
000
~45. 841. 200. 000
Bảng 3.1: Số lượng Chains và Cycles
đường khép kín (Cycles).
Để xây dựng kết nối chéo trong các ô đen chúng tôi sử dụng thêm biến Lôgic mệnh đề
c
ij,kl
, nếu biến này bằng true, có nghĩa là 2 ô đen (i,j) và (k,l) có kết nối chéo với nhau hay
nói cách khác là có đường đi chéo từ ô (i,j) đến ô (k, l).
Trong Hình 3.8, liên kết xuất hiện là c
33,35
= true (hai ô đen (3, 3) và (3,5) trong ma trận
có kết nối chéo tới nhau).
• Kết nối chéo giữa một ô màu đen và 4 ô đen lân cận của nó
Hình 3.9: Lân cận của một ô
Như trong hình 3.9, ô (i,j) đã được tô đen và nó có thể tạo kết nối tới 4 ô lân cận (i-1,
j-1) (i+1, j-1), (i-1, j+1) và (i+1, j+1) để tạo thành một kết nối.
Công thức Lôgic mệnh đề tương ứng là:
(x
ijk
˅ x
i-1j-1k
˅ ¬c
iji-1j-1
˅ ¬c
j-1i-1,ij
) ( x
ijk
˅ x

i-1j+1k
˅ ¬c
ij,i-1j+1
˅ ¬c
i-1j+1,ij
)
( x
ijk
˅ x
i+1j-1k
˅ ¬c
ij,i+1j-1
˅ ¬c
i+1j-1,ij
) ( x
ijk
˅ x
i+1j+1k
˅ ¬c
ij,i+1j+1
˅ ¬c
i+1j+1,ij
)
21
2 1 3 1 4
1 2 4 5 3
1 5 2 1 4
3 4 5 3 3
4 3 4 2 2
Hình 3.8: Ví dụ về liên kết trong Connectivity Encoding

Lưu ý: Chúng tôi quy định kết chéo giữa các ô đen là kết nối có hướng, do đó c
ij,kl

c
kl,ij
là hoàn toàn khác nhau (mục đích là để loại bỏ các Cycles - được trình bày ở phần
tiếp theo). Công thức Lôgic mệnh đề cho ràng buộc này là:
c
ij,i+1j+1
→ ¬c
i+1j+1,ij
≡ ¬c
ij,i+1j+1
˅ ¬c
i+1j+1,ij
Công thức này quy định kết nối chéo giữa 2 ô đen lân cận chỉ có 1 chiều duy nhất, tức
là nếu đã tồn tại kết nối từ ô (i,j) đến ô (i+1,j+1) thì sẽ không có kết nối ngược lại (từ ô
(i+1,j+1) đến ô (i,j). Tương tự với các ô lân cận còn lại.
• Tính chất bắc cầu trong kết nối chéo của các ô đen
Kết nối chéo có tính chất bắc cầu và mệnh đề Lôgic tương ứng là:
c
ij,hk
c
hk,mn
→ c
ij,mn
≡ ¬c
ij,hk
˅ ¬c
hk,mn

˅ c
ij,mn
Khi tồn tại một kết nối chéo có hướng từ ô (i,j) tới ô (h,k) và có kết nối chéo giữa ô
(h,k) và (m,n) thì suy ra có kết nối chéo từ ô (i,j) tới ô (m,n).
a) Mã hóa loại bỏ Chains với Connectivity Encoding
Chúng tôi xây dựng các mệnh đề để các ô tại biên không được kết nối chéo với nhau.
Nếu 2 ô (i,j) và (k,l) là 2 ô biên thì chúng không thể có kết nối chéo với nhau và mệnh đề
Lôgic tương ứng là: ¬c
ij,kl
¬c
kl,ij
22
2 2 1 5 3
2 5 1 4 5
1 1 1 5 5
1 3 5 4 2
2 4 3 2 1
Hình 3.10: Các ô biên đen ngăn cách ô trắng
Một điểm nữa là hướng kết nối của các ô đen ở biên phải luôn hướng về tâm ma trận
(hình 3.10). Trên hình 3.10 cặp { (3,4);(2,5) } sẽ tạo thành một kết nối có hướng c
25,34
.
Nhận xét: Số lượng các ô biên trong một ma trận N*N là: (N-2)*4*2 + 4 mệnh đề.
b) Mã hóa loại bỏ Cycles.
Như đã trình bày ở trên kết nối chéo giữa các ô đen phải có hướng để xây dựng các
mệnh đề loại bỏ Cycles:
Hình 3.11: Kết nối có hướng
• Kết nối chéo không được phép hướng vào cùng một ô
Hình 3.11 thể hiện ràng buộc mà chúng tôi xây dựng. Ràng buộc này quy định không
cho phép 2 ô bất kỳ có kết nối chéo từ nó đến cùng một ô. Việc đưa ra ràng buộc này sẽ

giúp chúng tôi quy đinh các đường đi trong một Cycles là đường đi có hướng thống
nhất (các hướng đi luôn là một chiều) và giúp loại bỏ các khả năng tạo thành Chains.
Mệnh đề Lôgic tương ứng sẽ là:
c
i+1j-1,ij
→ ¬c
i+1j+1,ij
≡ ¬c
i+1j-1,ij
˅ ¬c
i+1j+1,ij
Áp dụng công thức tương tự cho các ô lân cận còn lại.
• Không tạo kết nối đối với chính nó để không tạo thành Cycles
Ràng buộc này quy định không tồn tại kết nối chéo có hướng khép kín (tạo thành
Cycles), nghĩa là không tồn tại một đường đi có hướng từ ô (i,j) đến chính nó. Mệnh đề
Lôgic tương ứng sẽ là: ¬c
ij,ij
Như vậy, trong phần này chúng tôi đã trình bày phương pháp Connectivity Encoding
để loại bỏ khả năng tạo thành Chains và Cycles. Phần tiếp theo sẽ đưa ra một số cách tối
ưu hóa dựa trên dữ liệu đầu vào và bảng so sánh số lượng mệnh đề khi áp dụng phương
pháp Connectivity Encoding khi so sánh với Chains & Cycles
23
(i-1,j-1) (i-1,j+1)
(i,j)
(i+1,j-1) (i+1,j+1)
III.2.4 Tối ưu dựa trên dữ liệu đầu vào
Việc mã hóa được trình bày ở phần trên được thực hiện trên toàn các ô của ma trận
Hitori, tuy nhiên có thể thực hiện tối ưu dựa trên liệu đầu vào, tức là mã hóa trên các ô có
khả năng được tô đen, gọi là các ô bội số (các ô mà có giá trị trùng nhau trên cùng hàng
hoặc cột). Việc này sẽ giúp số lượng mệnh đề trong công thức CNF được giảm đi đáng

kể.
Hình 3.12: Ví dụ về tập bội số trên ma trận
Hình 3.12 là ví dụ về tập bội số mà chúng tôi sẽ encoding, tất cả những ô được tô màu
đều là những ô có khả năng được bôi đen, chúng đều có giá trị xuất hiện nhiều hơn một
lần trên hàng hoặc cột.
Trong phần này, chúng tôi sử dụng các vecto để lưu lại các ô là bội số, thay vì sử
dụng một biến x
ijk
cho toàn bộ ma trận. Sau đó sử dụng encoding các luật trên dữ liệu
thuộc vecto. Biến c
ij,hk
vẫn được khai báo để biểu diễn sự kết nối giữa các ô, nhưng cũng
chỉ xét trên vecto đã lưu lại tập các bội số của ma trận.
a) Tối ưu cho luật thứ nhất
Như phần trình bày về Connectivity Encoding chúng tôi sử dụng hai biến là x
ijk
và b
ij
để
mã hóa cho luật 1 và 2, trong phần này chúng tôi chỉ sử dụng biến b
ij
để đại diện cho một
ô trong ma trận nếu b
ij
= true nghĩa là ô (i,j) được tô đen và ngược lại được để trắng. Với
cách không sử dụng biến Lôgic mệnh đề x
ijk
số lượng biến Lôgic trong ma trận Hitori sẽ
giảm đáng kể.
Mệnh đề biểu diễn ô (j,j) và (i,k) nếu thuộc tập bội số là:

b
ij
˅ b
ik
24
a) Tối ưu cho luật 2
Luật thứ hai cũng chỉ sử dụng tới biến b
ij
để mã hóa, như vậy mệnh đề Lôgic tương
ứng sẽ là :
b
ij
→¬ ( b
ij+1
b
ij-1
b
i+1j
b
i-1j
) ≡
( ¬b
ij
˅ ¬b
ij+1
) ( ¬b
ij
˅ ¬b
ij-1
) ( ¬b

ij
˅ ¬b
i+1j
) ( ¬b
ij
˅ ¬b
i-1j
)
Do vậy số lượng biến Lôgic và số lượng mệnh đề trong CNF là giảm, còn quy tắc cho
các luật không hề thay đổi. Bảng dưới đây thống kê số lượng biến Lôgic và số lượng
mệnh đề sinh ra trong công thức CNF của 2 phương pháp Encoding khi chưa tối ưu và tối
ưu.
Nhận xét: Bằng việc sử dụng tập bội số (lấy từ dữ liệu đầu vào) chúng ta có thể tối ưu
việc mã hóa cho từng luật của trò chơi Hitori. Qua đó làm giảm đáng kể số lượng biến
Lôgic, số lượng mệnh đề sinh ra cũng như thời gian thực hiện giải trò chơi Hitori đó.
Đầu tiên đối với Chains & Cycles số lượng mệnh đề ở cấp 12x12 trên toàn ma trận là
hơn 3.7 triệu mệnh đề nhưng trên tập bội số chỉ là 1563 chênh lệch 2384 lần, đặc biệt về
mặt thời gian.
Đối với Connectivity Encoding, việc tối ưu hóa mang lại hiệu quả rất cao, cũng trên
ma trận 12x12 số lượng mệnh đề khi chưa tới ưu là hơn 37000 mệnh đề gấp 49 lần so với
két quả khi đã tối ưu (749 mệnh đề). Thời gian giải Hitori cũng được giảm đi rất nhiều.
Việc tối ưu Encoding dựa trên dữ liệu đầu vào cho kết quả được cải thiện đáng kể.
25
Size
Chains and Cycles Encoding Connectivity Encoding
Toàn ma trận Tập bội số Toàn ma trận Tập bội số
N_Mện
h đề
N_Thời
gian

N_Mện
h đề
N_Thờ
i gian
N_Mện
h đề
N_Thờ
i gian
N_Mện
h đề
N_Thờ
i gian
5*5 186 124ms 86
56.
4ms
1113 32ms 117 30ms
6*6 397 137ms 137
75.
4ms
2280 35ms 201 32ms
8*8 2738 361ms 263
109.
4ms
7196 43ms 250 40ms
9*9 11471 527ms 351
123.
7ms
11575 89ms 312 49ms
12*12
372668

4
47520m
s
1563
186.
4ms
37092 157ms 749 54ms

×