Logo Zephyrnet

Giải pháp dựa trên trí tuệ nhân tạo cho Sudoku

Ngày:

Giới thiệu

Trước lo lắng, Các Câu đố Sudoku đã là cơn thịnh nộ và nó vẫn còn rất phổ biến. Trong những năm gần đây, việc sử dụng tối ưu hóa phương pháp giải câu đố đã là một chủ đề nổi bật. Nhìn thấy “Giải câu đố Sudoku bằng cách sử dụng tính năng tối ưu hóa trong Arkieva".

Trong thời đại hiện nay, việc sử dụng trí tuệ nhân tạo (AI) tập trung vào học máy, bao gồm nhiều phương pháp từ hồi quy Lasso đến học tăng cường. Việc sử dụng AI có tái hiện để giải quyết phức tạp lập kế hoạch những thách thức. Một phương pháp, tìm kiếm bằng quay lui, thường được sử dụng và hoàn hảo cho Sudoku.

Blog này sẽ cung cấp mô tả chi tiết về cách sử dụng phương pháp này để giải Sudoku. Hóa ra, “quay ngược” có thể được tìm thấy bên trong các công cụ tối ưu hóa và máy học, đồng thời là nền tảng của phương pháp phỏng đoán tiên tiến mà Arkieva sử dụng để lập lịch. Thuật toán được triển khai bằng “Ngôn ngữ lập trình mảng”, một ngôn ngữ lập trình hướng hàm để xử lý một tập hợp cấu trúc mảng phong phú.

Cơ bản về Sudoku

Từ Wikipedia: Sudoku là một trò chơi xếp số theo tổ hợp, dựa trên logic. Mục tiêu là lấp đầy lưới 9×9 bằng các chữ số sao cho mỗi cột, mỗi hàng và mỗi trong số chín lưới con 3×3 tạo thành lưới (còn được gọi là “hộp”, “khối”, “vùng”, hoặc “hình vuông phụ”) chứa tất cả các chữ số từ 1 đến 9. Bộ giải câu đố cung cấp một lưới đã hoàn thiện một phần, thường có một giải pháp duy nhất. Các câu đố hoàn chỉnh luôn là một loại hình vuông Latinh có thêm ràng buộc về nội dung của từng vùng riêng lẻ. Ví dụ: cùng một số nguyên không được xuất hiện hai lần trong cùng một hàng hoặc cột của bàn chơi 9×9 hoặc trong bất kỳ vùng nào trong chín vùng con 3×3 của bàn chơi 9×9.

Bảng 1 có một vấn đề ví dụ. Có 9 hàng và 9 cột tổng cộng là 81 ô. Mỗi ô được phép có một và chỉ một trong chín số nguyên từ 1 đến 9. Trong giải pháp ban đầu, một ô có một giá trị duy nhất – giá trị này cố định giá trị trong ô này thành giá trị đó hoặc ô trống, cho biết chúng ta cần để tìm giá trị cho ô này. Ô (1,1) có giá trị 2 và ô (6,5) có giá trị 6. Ô (1,2) và ô (2,3) trống và thuật toán sẽ tìm giá trị cho các ô này.

Sự phức tạp

Ngoài việc thuộc về một và chỉ một hàng và cột, một ô còn thuộc về một và chỉ một ô. Có 1 hộp và chúng được biểu thị bằng màu trong Bảng 9. Bảng 1 sử dụng một số nguyên duy nhất từ ​​2 đến 1 để xác định từng hộp hoặc lưới. Các ô có giá trị hàng (9, 1 hoặc 2) và giá trị cột (3, 1 hoặc 2) thuộc ô 3. Ô 1 là giá trị hàng (6, 4, 5) và giá trị cột (6, 7) , 8). Id hộp được xác định theo công thức BOX_ID = {9x(sàn((ROW_ID-3) /1)} + trần (COL_ID/3), đối với ô (3), 5,7 = 6x(sàn(3-5) ))/1) + trần (3/8)= 3×3 + 1 = 3+3.

Trái tim của câu đố

Để tìm một giá trị nguyên từ 1 đến 9 cho mỗi ô chưa biết sao cho các số nguyên từ 1 đến 9 được sử dụng một lần và chỉ một lần cho mỗi cột, mỗi hàng và mỗi hộp.

Hãy nhìn vào ô (1,3) trống. Hàng 1 đã có giá trị 2 và 7. Những giá trị này không được phép trong ô này. Cột 3 đã có giá trị 3, 5,6, 7,9. Những điều này không được phép. Ô 1 (màu vàng) có các giá trị 2, 3 và 8. Không được phép. Các giá trị sau không được phép (2,7); (3, 5, 6, 7, 9); (2, 3, 8). Các giá trị duy nhất không được phép là (2, 3, 5, 6, 7, 8, 9). Các giá trị ứng cử viên duy nhất là (1,4).

Một cách tiếp cận giải pháp là tạm thời gán 1 cho ô (1,3) và sau đó cố gắng tìm các giá trị ứng viên cho một ô khác.

Giải pháp quay lui: Các thành phần khởi động

Cấu trúc mảng

Nơi bắt đầu là quyết định cấu trúc mảng để lưu trữ bài toán nguồn và hỗ trợ tìm kiếm. Bảng 3 có cấu trúc mảng này. Cột 1 là id số nguyên duy nhất cho mỗi ô. Các giá trị nằm trong khoảng từ 1 đến 81. Cột 2 là ID hàng của ô. Cột 3 là cột ID của ô. Cột 4 là id hộp. Cột 5 là giá trị trong ô. Quan sát một ô không có giá trị được cho giá trị XNUMX thay vì trống hoặc null. Điều này giữ cho đây là một “mảng chỉ số nguyên” – vượt trội hơn nhiều về hiệu suất.

Trong APL, mảng này sẽ được lưu trữ trong mảng 2 chiều có hình dạng là 81 x 5. Giả sử các phần tử của Bảng 3 được lưu trữ trong biến MAT. Các chức năng ví dụ là:

Lệnh MAT[1 2 3;]lấy 3 hàng đầu tiên của MAT
1 1 1 1 2
2 1 2 1 0
3 1 3 1 0
MAT[1 2 3; 4 5] bảo vệ hàng 1, 2, 3 và chỉ cột 4 và 5
1
1
1
(MAT[;5]=0)/MAT[;1] tìm thấy tất cả các ô cần giá trị.

ĐÈN BẢNG 3

Kiểm tra độ chính xác: Bản sao

Trước khi bắt đầu tìm kiếm, điều quan trọng là phải kiểm tra sự tỉnh táo! Đó là giải pháp khởi đầu khả thi. Khả thi đối với Sudoku là hiện tại có các bản sao ở bất kỳ hàng, cột hoặc hộp nào không. Giải pháp khởi đầu hiện tại, ví dụ, 1 là khả thi. Bảng 4 có một ví dụ trong đó giải pháp ban đầu có các bản sao. Hàng 1 có hai giá trị 2. Vùng 1 có hai giá trị 2. Hàm “SANITY_DUPE” xử lý logic này.

Kiểm tra độ chính xác: Tùy chọn cho các ô không có giá trị

Một thông tin rất hữu ích sẽ là tất cả các giá trị có thể có của một ô không có giá trị. Nếu không có ứng cử viên thì câu đố này không thể giải được. Một ô không thể nhận giá trị đã được hàng xóm của nó xác nhận. Sử dụng Bảng 1 cho Ô (1,3,'1' – 1 cuối cùng này là boxid), các hàng xóm của nó là hàng 1, cột 3 và hộp 1. Hàng 1 có các giá trị (2,7); cột 3 có các giá trị (3,5,6,7,9); hộp 1 có các giá trị (2,3,8). Ô (1,3.1) không thể lấy các giá trị sau (2,3,5,6,7,8,9). Các tùy chọn duy nhất cho ô (1,3,1) là (1,4). Đối với ô (4,1,2), các giá trị 1, 2, 3, 5, 6, 7, 9 đã được sử dụng ở hàng 4, cột 1 và/hoặc hộp 4. Các giá trị ứng cử viên duy nhất là (4,8) . Chú thích “SANITY_CAND” xử lý logic này.

Bảng 5 cho thấy các ứng viên, ví dụ, 1 khi bắt đầu quá trình tìm kiếm. Nếu một ô đã được gán một giá trị trong điều kiện bắt đầu (Bảng 1), thì giá trị này sẽ được lặp lại và hiển thị bằng màu đỏ. Nếu ô cần giá trị chỉ có một tùy chọn thì ô này sẽ hiển thị màu trắng. Ô (8,7,9) có giá trị duy nhất 7 màu trắng. (2,5,8,4,3) được yêu cầu bởi cột hàng xóm 7. (1, 2, 9) ở hàng 8. (3,2,6) ở ô 9. Chỉ có giá trị 7 là không được xác nhận.

Kiểm tra sự tỉnh táo: Tìm kiếm xung đột

Thông tin xác định tất cả các tùy chọn cho các ô cần giá trị (được đăng trong Bảng 4), cho phép chúng tôi xác định xung đột trước khi bắt đầu quá trình tìm kiếm. Xung đột xảy ra khi hai ô cần giá trị chỉ có một ứng cử viên, giá trị ứng cử viên giống nhau và hai ô là lân cận. Từ Bảng 4, chúng ta biết ô duy nhất cần giá trị và chỉ có một ứng cử viên là ô (8,7,9). Ví dụ 1, không có xung đột.

Điều gì sẽ là một cuộc xung đột? Nếu giá trị duy nhất có thể có cho ô (3,7,3) là 7 (thay vì 1, 6, 7) thì có xung đột. Ô (8,7) và ô (3,7) là hàng xóm – cùng một cột. Tuy nhiên, nếu giá trị duy nhất có thể có cho ô (4,9,2) là 7 (thay vì 1, 2, 7) thì đây sẽ không phải là xung đột. Những tế bào này không phải là hàng xóm.

Tóm tắt kiểm tra vệ sinh

  1. Nếu có sự trùng lặp thì giải pháp ban đầu là không khả thi.
  2. Nếu một ô cần giá trị nhưng không có bất kỳ ứng cử viên nào thì không có giải pháp khả thi nào cho câu đố này. Danh sách các giá trị ứng viên cho mỗi ô có thể được sử dụng để giảm không gian tìm kiếm – cho cả việc quay lui và tối ưu hóa.
  3. Khả năng tìm ra xung đột xác định câu đố không khả thi – không có lời giải – nếu không có quá trình tìm kiếm. Ngoài ra, nó còn xác định các “ô có vấn đề”.

Giải pháp quay lui: Quá trình tìm kiếm

Với cấu trúc dữ liệu cốt lõi và việc kiểm tra độ tỉnh táo được áp dụng, chúng tôi chuyển sự chú ý sang quá trình tìm kiếm. Chủ đề lặp lại một lần nữa là đưa các cấu trúc dữ liệu vào đúng vị trí để hỗ trợ tìm kiếm.

Theo dõi tìm kiếm

Mảng Tracker theo dõi các nhiệm vụ đã thực hiện

  1. Col 1 là bộ đếm
  2. Col 2 là số lượng tùy chọn có sẵn để gán cho ô này
    • 1 có nghĩa là có 1 tùy chọn, 2 có nghĩa là có hai tùy chọn, v.v.
    • 0 có nghĩa là – không có tùy chọn nào hoặc đặt lại về 0 (không có giá trị được chỉ định) và quay lại
  3. Col 3 là ô được gán số chỉ mục giá trị (1 đến 81)
  4. Col 4 là giá trị được gán cho ô trong lịch sử track
    • Giá trị 9999 có nghĩa là ô này là nơi tìm thấy ngõ cụt
    • Giá trị của một số nguyên từ 1 đến 9 là giá trị được gán cho ô này tại thời điểm này trong quá trình tìm kiếm.
    • Giá trị 0 có nghĩa là ô này cần được gán

Mảng theo dõi được sử dụng để hỗ trợ quá trình tìm kiếm. Mảng THEO DÕI có cấu trúc tương tự như trình theo dõi nhưng giữ lại lịch sử của toàn bộ quá trình tìm kiếm. Bảng 6 có một phần TRACKHIST chẳng hạn 1. Nó sẽ được giải thích chi tiết hơn ở phần sau.

Ngoài ra, mảng PAV (một vectơ của một vectơ), theo dõi các Giá trị được gán trước đó cho ô này. Điều này đảm bảo chúng tôi không xem lại giải pháp thất bại – tương tự như những gì được thực hiện trong TABU.

Có một quy trình ghi nhật ký tùy chọn trong đó quy trình tìm kiếm ghi lại từng bước.

Bắt đầu tìm kiếm

Sau khi hoàn tất việc kiểm tra sổ sách và tính tỉnh táo, giờ đây chúng ta có thể bắt đầu quá trình tìm kiếm. Các bước là:

  1. Có ô nào còn lại cần giá trị không? - nếu không thì chúng ta xong việc rồi.
  2. Đối với mỗi ô cần một giá trị, hãy tìm tất cả các tùy chọn ứng viên cho từng ô. Bảng 4 có các giá trị này khi bắt đầu quá trình giải. Tại mỗi lần lặp, thông số này được cập nhật để phù hợp với các giá trị được gán cho các ô.
  3. Đánh giá các lựa chọn theo thứ tự này.
    • Nếu một ô có ZERO tùy chọn thì hãy thực hiện quay lui
    • Tìm tất cả các ô có một tùy chọn, chọn một trong các ô này, thực hiện phép gán này,
      1. và cập nhật bảng theo dõi, giải pháp hiện tại và PAV.
    • Nếu tất cả các ô có nhiều tùy chọn, hãy chọn một ô và một giá trị rồi cập nhật
      1. và cập nhật bảng theo dõi, giải pháp hiện tại và PAV

Chúng tôi sẽ sử dụng Bảng 6 là một phần lịch sử của quy trình giải pháp (được gọi là TRACKHIST) để minh họa từng bước.

Trong lần lặp đầu tiên (CTR=1), ô 70 (hàng 8, cột 7, ô 9) được chọn để gán giá trị. Chỉ có ứng cử viên (7) và giá trị này được gán cho ô 70. Ngoài ra, giá trị 7 được thêm vào vectơ của các giá trị được gán trước đó (PAV) cho ô 70.

Trong lần lặp thứ hai, ô 30 được gán giá trị 1. Ô này có hai giá trị ứng cử viên. Giá trị ứng viên nhỏ nhất được gán cho ô (chỉ là một quy tắc tùy ý để dễ theo dõi logic).

Quá trình xác định ô cần giá trị và gán giá trị hoạt động tốt cho đến lần lặp (CTR) 20. Ô 9 cần giá trị, nhưng số lượng ứng viên là ZERO. Có hai lựa chọn:

  • Không có giải pháp cho câu đố này.
  • Chúng tôi hoàn tác (quay lại) một số nhiệm vụ và đi theo một con đường khác.

Chúng tôi đã tìm kiếm nhiệm vụ ô gần nhất với điều này, nơi có nhiều tùy chọn. Trong ví dụ này, điều này xảy ra ở lần lặp 18, trong đó ô 5 được gán giá trị 3, nhưng có hai giá trị ứng viên cho ô 5 – giá trị 3 và 8.

Giữa ô 5 (CTR = 18) và ô 9 (CTR = 20), ô 8 được gán giá trị 4 (CTR=19). Chúng tôi đưa các ô 8 và 5 trở lại danh sách “cần một giá trị”. Điều này được ghi lại trong mục nhập CTR=20 thứ hai và thứ ba, trong đó giá trị được đặt thành 0. Giá trị 3 được giữ trong vectơ PAV cho ô 5. Đó là công cụ tìm kiếm không thể gán giá trị 3 cho ô 5.

Công cụ tìm kiếm khởi động lại để xác định giá trị cho ô 5 (với 3 không còn là tùy chọn) và gán giá trị 8 cho ô 5 (CTR=21). Nó tiếp tục cho đến khi tất cả các ô đều có giá trị hoặc có một ô không có tùy chọn và không có đường quay lui. Giải pháp được đưa ra trong Bảng 7.

Hãy quan sát, khi có nhiều hơn một ứng cử viên cho một ô, đây là cơ hội để xử lý song song.

So sánh với giải pháp tối ưu hóa MILP

Ở cấp độ bề ngoài, cách thể hiện câu đố Sudoku rất khác biệt. Cách tiếp cận AI sử dụng số nguyên và theo bất kỳ biện pháp nào cũng là cách trình bày chặt chẽ và trực quan hơn. Ngoài ra, công cụ kiểm tra độ tỉnh táo còn cung cấp thông tin hữu ích để tạo ra công thức mạnh mẽ hơn. Sự biểu diễn MILP là vô tận nhị phân (0/1). Tuy nhiên, các nhị phân là những biểu diễn mạnh mẽ dựa trên sức mạnh của các bộ giải MILP hiện đại.

Tuy nhiên, bên trong, bộ giải MILP không giữ lại các nhị phân mà sử dụng phương pháp mảng thưa thớt để loại bỏ việc lưu trữ tất cả các số 1980. Ngoài ra, các thuật toán giải nhị phân chỉ xuất hiện vào những năm 1990 và 1983. Bài báo năm XNUMX của Crowder, Johnson và Padberg báo cáo về một trong những giải pháp thực tế đầu tiên về tối ưu hóa với nhị phân. Họ lưu ý tầm quan trọng của việc xử lý trước thông minh cũng như các phương pháp phân nhánh và ràng buộc là rất quan trọng đối với một giải pháp thành công.

Sự bùng nổ gần đây của việc sử dụng lập trình và phần mềm ràng buộc như người giải địa phương đã làm rõ tầm quan trọng của việc sử dụng các phương pháp AI với các phương pháp tối ưu hóa ban đầu như quy hoạch tuyến tính và bình phương tối thiểu.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img