Loại bỏ đối xứng bằng phƣơng pháp thêm ràng buộc trƣớc kh

Một phần của tài liệu lập trình ràng buộc với bài toán n quân hậu (Trang 42)

nghiệm

Nắm đƣợc yêu cầu và tính chất của bài toán, với cách ký hiệu và phân tích nhƣ trên ta nhận thấy rằng mỗi lời giải có thể đƣợc biểu diễn phải thỏa mãn các điều kiện:

- Các chỉ số cột các quân hậu đôi một khác nhau, hay chúng lập thành một hoán vị của các số 1, 2, …, n.

- Hiệu chỉ số dòng và cột của các quân hậu đôi một khác nhau. Tuy nhiên trên đây chỉ đƣa ra những cách ràng buộc về hàng, cột và đƣờng chéo. Nhƣng trong bài toán này chúng ta đã tìm đƣợc 7 đối xứng : phản xạ qua hàng ngang, cột, hai đƣờng chéo, quay 900

, 1800 và 2700. Để đáp ứng yêu cầu bài toán đầy đủ chúng tôi đƣa ra những ràng buộc sau:

- x(Q[i] = j); Q[n-i+1] ≠ j // ràng buộc hàng - y(Q[i] = j); Q[i] ≠ n-j+1 // ràng buộc cột

- d1(Q[i] = j); Q[j] ≠ i // ràng buộc hai đƣờng chéo - d2(Q[i] = j); Q[n-j+1] ≠ n-i+1

- r90(Q[i] = j); Q[j] ≠ n-i+1 // quay 900, 1800, 2700 - r180(Q[i] = j); Q[n-i+1] ≠ n-j+1

- r270(Q[i] = j); Q[n-j+1] ≠ i

3.2. Loại bỏ đối xứng trong thời gian tìm kiếm (Symmetry Breaking During

Search - SBDS)

3.2.1. Giới thiệu về phƣơng pháp SBDS

Trƣớc tiên, chúng ta sẽ cùng nhau tìm hiểu sơ qua về phƣơng pháp này. Chúng ta nhận thấy rằng một tính chất vô cùng quan trọng của đối xứng là nó bảo tồn nghiệm, có nghĩa là: với một phép gán đầy đủ cho A và bất kỳ một đối xứng g

nào, thì g(A) là nghiệm nếu và chỉ nếu A là nghiệm. Thông thƣờng ta mở rộng cho một phép gán thành phần từ A tới A+(var=val), khi đó:

g(A+(var=val)) = g(A)+g(var=val)

Nếu chúng ta cố gắng mở rộng cho từ A tới A+(var=val) và phép gán thành phần này lỗi, việc tìm kiếm sẽ phải chuyển sang nhánh khác, nơi mà var ≠ val. Chúng ta cũng thêm vào nhánh này ràng buộc g(A)→g(var ≠ val) cho mỗi đối xứng g. Điều này có thể đƣợc phát biểu lại nhƣ sau: nếu đối xứng tƣơng đƣơng của phép gán A là đúng, thì g(var ≠ val) cũng sẽ đúng trong tất cả nhánh này. Nếu chúng ta chú ý rằng việc mở rộng từ A tới A  A vars i  j,

mỗi đối xứng g xem g(A) có thỏa mãn hay không. Giá trị cho g(A+) là sự kết hợp của g(A) g(vars[i] = j ). Vì vậy chúng ta có thể tính g(A) từng bƣớc một.

A phép gán thành phần

var= val var val

+g(varval) nếu g(A) là đúng

Hình 3.7: Phương pháp SBDS trong khi tìm kiếm nghiệm

3.2.2. Phƣơng pháp SBDS cho bài toán N-quân hậu

Chúng ta hãy xem hoạt động phƣơng pháp thông qua bài toán 8-quân hậu. Giả sử phép gán đầu tiên của chúng ta là Q1=2, có nghĩa là quân hậu tại hàng đầu tiên ở cột số 2. Trong bài toán 8-quân hậu có 7 đối xứng: quay 900

, 1800, 2700, sự phản xạ theo chiều ngang, chiều dọc và qua hai đƣờng chéo chính. Ví dụ khi Q1=2, ta có nghiệm đối xứng tƣơng ứng với 7 đối xứng trên một cách tƣơng ứng là Q2=8, Q8=7, Q7=1, Q8=2, Q1=7, Q2=1 và Q7=8. Trong đó 4 giá trị cuối tƣơng thích với Q1=2, nên chúng không đƣợc xét trong nhánh này (cắt nhánh dƣ thừa). Nhƣ vậy chúng ta biết ngay là đối xứng bằng phép quay không bị loại bỏ bởi phép gán này. Hình 3.8 sau sẽ minh họa nghiệm đối xứng trong bài toán 8-quân hậu, với phép gán ban đầu là Q1= 1 bằng phép lấy đối xứng từ nghiệm ban đầu ta có:

Quay 900 Quay 1800 Quay 2700

Đối xứng cột Đối xứng đƣờng chéo

Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q

Đối xứng hàng Đối xứng đƣờng chéo

Hình 3.8: Ứng với mỗi nghiệm của bài toán 8-quân hậu sẽ có 7 nghiệm đối xứng với phép gán ban đầu là Q1=1

Xét về phép gán ban đầu là Q1=2 thì sau phép gán này giả sử chúng ta có phép gán thứ hai Q2 = 4 và nhánh này (nhánh trái) lỗi, nhƣ vậy ràng buộc Q2 (adsbygoogle = window.adsbygoogle || []).push({});

4 đƣợc tạo ra. Chúng ta thêm ràng buộc g(A)→g(var ≠ val) cho các đối xứng còn lại. Ví dụ, cho đối xứng quay 900, chúng ta có g(Q1= 2)→g(Q2 ≠ 4) điều này tƣơng đƣơng với Q2 = 8→ Q4 ≠ 7.

Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q

Q1= 2

Q1≠2

Q2= 4 Q2≠4

Hình 3.9: SBDS cho bài toán 8-quân hậu

Trong bài toán n-quân hậu, loại bỏ đối xứng vẫn còn là một thách thức, trên bàn cờ vua ta xét vẫn còn đó 7 đối xứng. Để loại bỏ những nghiệm đối xứng, chúng ta cần xem xét lần lƣợt 7 đối xứng này trả lại một nghiệm đại diện duy nhất, tƣơng đƣơng với đối xứng này là var[i] = j. Hai trong số này đƣợc thể hiện trong hình 3.9, var[i] = j tƣơng ứng với Qi = j, và n quân hậu là một biến toàn cục, chúng ta chỉ cần khai báo chức năng đối xứng và kết quả sẽ đƣợc thể hiện cụ thể trong đoạn code bảng 1 dƣới đây. Khi thực hiện nó, số quay lui đƣợc giảm đáng kể, thời gian tìm kiếm giảm đến 75% trong đó các nghiệm tìm thấy là tất cả các nghiệm đối xứng riêng biệt.

Tuy nhiên, trong thực tế vẫn còn một số đối xứng vẫn còn tồn tại sau khi đã thực hiện một hoặc nhiều phép gán, khi đó vẫn còn vấn đề không thể

• Q1= 2→ (Q2 4) r90 ≡ Q4 ≠ 7 • Q1= 2→ (Q2 4) r180 ≡ Q7≠ 5 • Q1= 2→ (Q2 4) r270 ≡ Q5≠ 2 • (Q12) r90 ≡ Q2 ≠ 8 • (Q12) r180 ≡ Q8 ≠7 • Q12) r270 ≡ Q7≠ 1 • Q12) x ≡ Q1≠ 7 • Q12) y ≡ Q8 ≠ 2 • Q12) d1 ≡ Q2 ≠ 1 • Q12) d2 ≡ Q7 ≠ 7

thứ tự: Q1, Q2, Q3, …Chúng ta có thể thêm ràng buộc Q1 n+1-Qn để ngăn chặn trong nhiều trƣờng hợp tìm kiếm đƣợc 2 nghiệm tƣơng đƣơng. Nhƣng điều này vẫn có thể xảy ra nếu Q1 = 2 và Qn = n-1. Để loại bỏ điều này, chúng ta có thêm một ràng buộc mới với điệu kiện:

1 2 1 ifQ   n 1 Q then Qn   n 1 Qn Chúng ta có thể cần thêm ràng buộc: 3 2 1 2 1 1 ifQ   n 1 Q and Qnn 1 Qnthen Q   n Qn , …

Để chắc chắn loại bỏ hoàn toàn đối xứng này, chúng tôi xây dựng thêm n/2 ràng buộc với nhiều điều kiện hơn trƣớc.

Có hai thuận lợi trong việc dùng SBDS so với việc thêm ràng buộc vào mô hình:

 Nó có tính toàn diện: nếu chúng ta thêm một hàm mô tả đối xứng, chúng ta có thể loại bỏ đối xứng đó, trong khi chúng ta khó có thể đạt đƣợc hiệu quả tƣơng tự nhờ việc thêm ràng buộc vào mô hình  SBDS không tranh chấp, mâu thuẫn với các chiến lƣợc tìm kiếm

(trật tự các biến và các giá trị gán), nó chỉ làm nhiệm vụ ngăn những giá trị đối xứng đƣợc gán khi tiến hành quay lui. Ngƣợc lại, việc thêm ràng buộc vào mô hình có thể gây mâu thuẫn với chiến lƣợc tìm kiếm.

3.3. Loại bỏ đối xứng nhờ việc nhận ra sự ƣu thế (Symmetry Breaking by Dominance Detection – SBDD) Dominance Detection – SBDD)

3.3.1. Giới thiệu về phƣơng pháp SBDD

SBDD là phƣơng pháp có thể nhận ra đối xứng trong quá trình tìm kiếm. Tại mỗi thời điểm thuật toán tìm kiếm tạo ra một nút mới, nó sẽ kiểm tra xem nút đó có phải là một đối xứng với những nút đã đƣợc xét hay không. Nếu đúng, nhánh đó có thể bị cắt. Nếu không quá trình tìm kiếm diễn ra bình thƣờng. Mục đích của loại bỏ đối xứng là tránh khám phá phần không gian Δ mà có thể đƣợc ánh xạ từ phần đã đƣợc xét bằng một hàm đối xứng. Bởi vì nếu không chứa bất kỳ một

nghiệm nào, thì Δ cũng không chứa nghiệm. Ngƣợc lại, tất cả các nghiệm trong Δ có thể đƣợc suy ra từ phần đã xét. Trƣớc hết, chúng ta cần nêu ra một số định nghĩa.

Định nghĩa 3.8

Gọi X = {x1,…, xn} là tập biến của mô hình, D(x) là miền của biến xX. Bộ P c= (Dc(x1), …, Dc(xn)) là trạng thái đƣợc chọn hiện tại của điểm c.

Định nghĩa 3.9

Gọi P c = (Dc(x1),…, Dc(xn)), P c’= (Dc’(x1),…, Dc’(xn)) là hai trạng thái đƣợc xét.

o Nếu P c’bao gồm P c và ta ký hiệu P c  P c’ nếu và chỉ nếu: xX: Dc  Dc’

o Chúng ta đặt MDc = Dc(x1) ×…×Dc(xn)

o Một ánh xạ đối xứng φ: MDc →MDc, chúng ta nói rằng P c’ “Lấn át”

(dominate) P c (với ánh xạ đối xứng φ) nếu và chỉ nếu φ(P c )∠P c’. Khi đó chúng ta ký hiệu P c∠P c’

Hệ quả 3.10

Cho hai điểm chọn c c’, trong đó c’ là thế hệ sau của c trong cây tìm kiếm. Khi đó chúng ta có: P c’  P c (adsbygoogle = window.adsbygoogle || []).push({});

Giải pháp mà SBDD dùng để cắt bớt phần đối xứng trong không gian tìm kiếm đƣợc dựa trên sự tích hợp sau:

o Một cơ sở dữ liệu T dùng để chứa toàn bộ thông tin của không gian tìm kiếm đã đƣợc duyệt.

o Một hàm chỉ định: Φ: (PΔ, P�) → {false, true} trả giá trị true nếu và chỉ nếu PΔ bị “Lấn át” bởi P� với một số hàm đối xứng φ

o Các đối xứng sẽ sử dụng thuật toán lan truyền, với mọi biến x, việc loại bỏ mọi giá trị b từ miền x sao cho Φ(PΔ[x=b], P�) = true.

ngƣợc lại chúng ta có thể dùng hàm Φ áp dụng thuật toán lan truyền. Chúng ta hãy xem hình 3.10, minh họa cho SBDD.

(a) (b)

Hình 3.10: Minh họa cách thức hoạt động của SBDD: Nút trắng là nút đang đối được xét, nút đen là nút đã được xét hoàn toàn. Hình vuông là trạng thái trong T, hình tròn thể hiện nó không ở trong T hoặc đã ở trong T . Hình tam giác chỉ nút hiện tại đang xét. (a) Ban đầu, trạng thái Δ phải được kiểm tra thông qua toàn bộ các nút đã được xét. (b) Dùng DFS, nút hiện tại chỉ cần so sánh với các nút kề-trái (từ nút gốc tới Δ).

Chúng ta có hai cách tìm kiếm khi áp dụng phƣơng pháp này, đó là: tìm kiếm theo chiều sâu (DFS-Depth First Search) và tìm kiếm tùy ý (theo một cách thức khác). Tuy nhiên khi áp dụng tìm kiếm tùy ý, số trạng thái cần lƣu trữ trong T

sẽ tăng lên rất nhanh và rất lớn. Do vậy SBDD sẽ chỉ phù hợp nhất với DFS. Phần kế tiếp sẽ giới thiệu cách thức thực hiện SBDD.

3.3.2. Phƣơng pháp SBDD với DFS

Với DFS, chúng ta không cần lƣu trữ toàn bộ trạng thái phía trƣớc. Thay vào đó chúng ta chỉ cần lƣu trữ các nút các nút anh em bên trái trong T để có thể quay lui. Chúng ta xét bổ đề sau:

Bổ đề 3.11:

Cho c là điểm chọn với trạng thái P c = (Dc(x1),…, Dc(xi),…, Dc(xn)), trong đó i là chỉ số biến nhánh trong c, và Dc(xi)={v1, …, vn}D(xi). Hơn nữa, ta ký hiệu P ck = (Dc(x1),…, {vi},…, Dck(xn)), 1 ≤ k ≤ l là trạng thái của con c1, …, cn của c. Cuối cùng, coi P c’

là trạng thái trong điểm chọn c’ với P c’P ck ứng với một số 1 ≤ k ≤ n.

Khi đó: P c’∠P c

Dùng bổ đề 4.3 khi kết hợp với DFS, ta có thể thực hiện một cách hiệu quả nhƣ sau: Chúng ta khởi đầu với T = ∅ và tiếp tục quá trình cho mỗi điểm chọn nhƣ sau:

1. Kiểm tra trạng thái Phép chiếu của mỗi điểm chọn hiện tại c với tất cả các trạng thái trong T. Nếu PT sao cho Φ(P c

, P) = true thì sinh lỗi. 2. Quá trình diễn ra bình thƣờng mà không có điểm chọn

3. Khi quay lui: nếu có quá nhiều nút anh em đƣợc xét, thì thêm trạng thái hiện tại vào T, nếu không xóa toàn bộ trạng thái của các nút anh em khác từ T .

Hiệu quả của phƣơng pháp này phụ thuộc vào số trạng thái đƣợc kiểm tra. Số trạng thái nhiều nhất chính là độ sâu của cây tìm kiếm và số phần tử lớn nhất trong miền.

3.3.3. Phƣơng pháp SBDD cho bài toán N-quân hậu

Đối với bài toán n-quân hậu, một nút p là dữ liệu n trong đó pilà số cột của quân hậu đặt ở hàng thứ i, hoặc trong trƣờng hợp quân hậu nằm trong hàng thứ i nhƣng chƣa đƣợc thiết lập, pi = * . E.g., tƣơng ứng với bàn cờ thứ nhất đƣợc thể hiện trong hình 3.11 là p = (1, 5, 2, 6, 3, 7, 4). Nhƣ bài toán ngƣời chơi gôn, nó có thể thực hiện dựa trên những xem xét đối xứng.

Hình 3.11: 6 nghiệm duy nhất cho bài toán 7-quân hậu

Trong bài toán n-quân hậu này, chúng tôi sử dụng mô hình theo tiêu chuẩn: - Mỗi cột i = 1, …, n thì đƣợc đại diện bởi một biến số nguyên xi.

Gán xi = j tƣơng ứng với cách đặt quân hậu ở hàng thứ i và cột j. - Bổ sung thêm biến số nguyên yi và wi với i = 1, …, n dùng để

kiểm tra đƣờng chéo trên bàn cờ, chúng tôi đƣa ra những ràng buộc: yi  xi i và wi  x - ii .

- Miền giá trị của x, y, w là: x(1, ..., ),n y(1,..., 2 ), w (n  n,..., )n (adsbygoogle = window.adsbygoogle || []).push({});

Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q

- Tất cả ràng buộc của x, y, w phải đảm bảo rằng không có hai quân hậu nào có thể ăn nhau.

Ngƣợc lại với thuật toán mà chúng tôi phát triển ở đây là sử dụng cắt tỉa đối xứng. Một ràng buộc đƣợc đƣa ra bởi mô hình theo dõi trong suốt quá trình tìm kiếm, chúng tôi lan truyền biến thay vì bó hẹp chúng lại và hạn chế số lƣợng gọi lan truyền thông thƣờng.

3.4. Cài đặt chƣơng trình

3.5. Kết quả

Minh họa với 8 quân hậu :

PHẦN IV KẾT LUẬN

Bài toán n-quân hậu là bài toán tổ hợp khó, để giải quyết cần có những thuật toán thật phù hợp. Nhƣ đã tìm hiểu thì có hai cách giải quyết bằng cách tiếp cận truyền thống: một là thực hiện thủ công thì thuật toán sẽ giải bài toán một cách chính xác trong lập trình truyền thống và hai là mô hình bài toán dùng thuật toán có sẵn cho lớp các ràng buộc số học cụ thể. Hai cách tiếp cận này đều còn những hạn chế rõ rệt, cách thứ nhất còn hạn chế về chi phí lớn khi thiết kế và không dễ biến đổi khi bài toán thay đổi còn cách tiếp cận thứ hai thì hạn chế về việc diễn tả một cách hiệu quả các ràng buộc. Khi đó ngôn ngữ lập trình ràng buộc hiện đại có thể khắc phục đƣợc những điểm yếu này bằng cách cung cấp một lập trình dựa trên việc giải những ràng buộc một cách tinh vi nhất.

Chúng ta đều biết rằng mọi bài toán đều có những ràng buộc, công việc của ngƣời lập trình là phải tìm ra giá trị của các biến sao cho phải thỏa mãn các ràng buộc đó. Lập trình ràng buộc càng tỏ rõ hiệu quả trong những bài toán mà yêu cầu ràng buộc mang tính mềm dẻo. Và càng ngày lập trình ràng buộc càng thể hiện rõ vai trò mạnh mẽ của mình trong việc giải những bài toán liên quan đến những thực tế cuộc sống, càng ngày ứng dụng của nó càng trở nên phong phú.

Chính vì thế, để giải quyết những bài toán thỏa mãn ràng buộc thì đòi hỏi ngƣời lập trình trang bị những kiến thức toàn diện về mặt lý thuyết lẫn kỹ năng phân tích. Đối với sinh viên nhƣ tôi thì vẫn chƣa đạt đến những trình độ này nên luận văn mà tôi thực hiện vẫn còn gặp nhiều khó khăn.

Trong bài luận văn mà tôi hoàn thành cơ bản đã thực hiện đƣợc:

- Đƣa ra những kiến thức cô đọng nhất trong CSPs: những định nghĩa cùng với những tính chất quan trọng cho CSPs

- Giới thiệu và trình bày một cách hệ thống phù hợp với các tiêu chí cho việc giải bài toán n-quân hậu, các phƣơng pháp khác nhau đã

Một phần của tài liệu lập trình ràng buộc với bài toán n quân hậu (Trang 42)