2012-05-07 76 views
7

Vì vậy, tôi đã thực hiện một chút công bằng của đọc vào thế hệ của một câu đố Sudoku. Từ những gì tôi có thể nói, cách tiêu chuẩn để có một câu đố Sudoku của một khó khăn mong muốn là tạo ra một câu đố, và sau đó đánh nó sau đó, và lặp lại cho đến khi bạn có một trong một đánh giá chấp nhận được. Điều này có thể được tinh chế bằng cách tạo ra thông qua backtracing bằng cách sử dụng một số các mô hình giải quyết phức tạp hơn (XY-wing, swordfish, vv), nhưng đó không phải là khá những gì tôi muốn làm ở đây.Tạo ra một sudoku có khó khăn mong muốn?

Điều tôi muốn làm, nhưng không thể tìm thấy bất kỳ tài nguyên thực nào, tạo ra một câu đố từ "giá trị khó" (giá trị 0-1.0, 0 là dễ nhất và 1.0 là khó nhất).

Ví dụ: tôi muốn tạo một câu đố khó khăn vừa phải, vì vậy giá trị .675 được chọn. Bây giờ sử dụng giá trị đó tôi muốn có thể tạo ra một câu đố vừa phải khó khăn.

Có ai biết điều gì đó như thế này không? Hoặc có lẽ một cái gì đó với một phương pháp tương tự?

+1

Không, không bao giờ tìm thấy bất cứ điều gì như thế. Một phần của sự việc là "khó khăn" là rất tương đối. – Mat

+1

Tôi không tin điều này là có thể. Kỹ thuật duy nhất tôi biết là phải làm như bạn đề cập - tạo ra, cấp, ném ra ngoài nếu phạm vi khó khăn bên ngoài. Ngoài ra, như Mat cho biết, khó khăn để đo lường như các thuật toán khác nhau giải quyết những cách khác nhau. – Ryan

+0

Tôi hiểu rằng, nhưng "tạo ra, tỷ lệ, vứt bỏ, tạo ra tỷ lệ, vứt bỏ, tạo ra, giữ" ý tưởng có vẻ cực kỳ không hiệu quả. Ngoài ra, hãy xem tất cả các trò chơi có tùy chọn tạo câu đố sudoku qua khó khăn (ví dụ: dễ, med, cứng) dường như làm như vậy trong một phần nhỏ giây, dường như không có khả năng là họ đang thực hiện việc này . Đặc biệt là các thiết bị trên thiết bị, như iphone hoặc android. – ZachLHelms

Trả lời

0

Nó không phải là thanh lịch như những gì bạn hỏi, nhưng bạn có thể mô phỏng hành vi này với bộ nhớ đệm:

  1. Quyết định có bao nhiêu "xô" bạn muốn cho câu đố. Ví dụ, giả sử bạn chọn 20. Vì vậy, các nhóm của bạn sẽ chứa các câu đố có các khoảng độ khó khác nhau: 0-.05, .05-.1, .1-.15, .., .9-.95, .95- 1
  2. Tạo một câu đố
  3. Lớp câu đố
  4. Đặt nó trong thùng thích hợp (hoặc vứt nó đi khi xô là đầy đủ)
  5. Lặp lại cho đến khi xô của bạn là "đầy". Kích thước của các thùng và nơi chúng được lưu trữ sẽ dựa trên nhu cầu của ứng dụng của bạn.

Sau đó, khi người dùng yêu cầu một câu đố khó khăn nhất định, hãy cung cấp cho họ một câu đố được lưu trong bộ nhớ cache từ nhóm họ chọn. Bạn cũng có thể muốn xem xét trao đổi số và thay đổi định hướng của các câu đố với những khó khăn đã biết để tạo ra các câu đố tương tự với cùng mức độ khó. Sau đó lặp lại ở trên khi cần thiết khi bạn cần phải đổ xô của bạn với các câu đố mới.

1

Vâng, bạn không thể biết nó phức tạp như thế nào, trước khi bạn biết cách giải quyết nó. Và Sudoku giải quyết (và do đó cũng đánh giá khó khăn) thuộc về NP-C complexity class, có nghĩa là nó (rất có thể) một cách hợp lý không thể tìm thấy một thuật toán đó là (asymptotically) nhanh hơn so với đề xuất ngẫu nhiên-đoán và kiểm tra.

Tuy nhiên, nếu bạn có thể tìm thấy một, bạn đã giải quyết được P versus NP problem và nên xóa một tủ cho Fields Medal ... :)

2

Khó khăn sudoku có liên quan một cách thú vị để các (tối thiểu) lượng thông tin cần thiết để chỉ định giải pháp duy nhất cho một lưới nhất định.

Nghe như lý thuyết thông tin, có nó cũng có ứng dụng ở đây.

Câu đố Sudoku phải có giải pháp duy nhất. Hơn nữa câu đố sudoku có đối xứng nhất định, tức là theo hàng, theo cột và theo hình vuông phụ.

Những đối xứng này xác định số lượng đầu mối tối thiểu (và vị trí của chúng nhiều hay ít) cần thiết để giải pháp là duy nhất (nghĩa là sử dụng trình biên dịch sudoku hoặc thuật toán như tìm kiếm ngược).

Đây sẽ là mức câu đố sudoku khó/khó nhất (số lượng đầu mối tối thiểu cần thiết). Sau đó, tất cả các mức độ khó khác từ ít khó hơn đến dễ dàng được tạo ra bằng cách cho phép nhiều manh mối hơn số tiền tối thiểu cần thiết. Cần lưu ý rằng mức độ khó khăn của sudoku là không phải là tiêu chuẩn, như đã giải thích ở trên, người ta có thể có nhiều hoặc ít mức độ khó như người muốn. Tiêu chuẩn là số lượng (và vị trí) tối thiểu (mức khó nhất và đó là relatd đối với đối xứng sudoku), sau đó người ta có thể tạo ra nhiều mức độ khó như người ta muốn đơn giản bằng cách cho phép các đầu mối thừa/thừa cũng.

+0

Tôi ngạc nhiên khi thấy một người nào đó nhận xét về bài đăng cũ như vậy. Vấn đề này kéo dài từ lâu, nhưng tôi đánh giá cao ý kiến ​​của bạn. Phương pháp tôi sử dụng đã tạo ra một số lượng lớn các câu đố (khoảng 10 triệu) và sau đó xếp hạng chúng. Việc đánh giá họ sẽ được đưa ra dựa trên những kỹ thuật giải quyết sudoku đã được yêu cầu để giải quyết chúng, và (khách quan) làm thế nào khó khăn những kỹ thuật được sử dụng. [Ví dụ về các kỹ thuật giải quyết được sử dụng để xếp hạng.] (Http://www.kristanix.com/sudokuepic/sudoku-solving-techniques.php) – ZachLHelms

+0

@ZachLHelms, cảm ơn, thực sự tôi không nhớ trả lời các câu hỏi cũ nếu tôi nghĩ rằng tôi có sth để nói.Gần đây tôi đang làm một ứng dụng câu đố (chuyên nghiệp) liên quan đến sudokus trong số các câu đố khác. Kỹ thuật mà bạn đề cập là tiêu chuẩn, nhưng tôi không muốn sử dụng kỹ thuật như ứng dụng trực tuyến nên tôi điều tra kỹ thuật thay thế bằng cách sử dụng đối xứng và thông tin tối thiểu, thực tế vẫn còn mức độ khó ** không phải là tiêu chuẩn **. Đã trả lời một số bài viết khác về tạo câu đố trên công việc tương tự tôi làm (hiện tại) –

3

Thêm một câu trả lời khác để tạo ra một sudoku khó khăn mong muốn khi đang di chuyển.

Điều này có nghĩa rằng không giống như các phương pháp khác thuật toán chạy chỉ một lần và trả về một cấu hình sudoku phù hợp với những khó khăn mong muốn (với xác suất cao trong một phạm vi hoặc với xác suất = 1)

các giải pháp khác nhau để tạo ra (và xếp hạng) một khó khăn sudoku phải làm với human-based techniques and approaches, có thể là dễ dàng được xếp hạng.

Rồi một (sau khi đã tạo ra một cấu hình sudoku) lại phá được các sudoku với giải tự như con người và tùy thuộc vào kỹ thuật các giải sử dụng (ví dụ cặp, x-wing, cá kiếm vv) một tỷ lệ khó khăn cũng được chỉ định.

Vấn đề với cách tiếp cận này (và yêu cầu đối với trường hợp sử dụng tôi đã có)

  1. Để tạo ra một sudoku với khó khăn nhất định, với phương pháp trước đó người ta cần để giải quyết một sudoku hai lần (một lần với thuật toán cơ bản và một lần với bộ giải mã giống như con người).

  2. Người ta phải (trước) tạo nhiều sudokus chỉ có thể được xếp hạng là khó khăn sau khi được giải quyết bởi người giải quyết giống như con người. Vì vậy, người ta không thể tạo ra một sudoku mong muốn on-the-fly một lần.

  3. Bộ giải mã giống như con người có thể phức tạp và trong hầu hết các trường hợp (nếu không phải tất cả) được ghép chặt với lưới 9x9 sudoku. Vì vậy, không có sự khái quát dễ dàng nào với các sudokus khác (ví dụ: 4x4, 16x16, 6x6, v.v.)

  4. Đánh giá độ khó của kỹ thuật giống người rất chủ quan. Ví dụ: tại sao x-wing được chụp là khó khăn hơn các đĩa đơn bị ẩn? (Personaly đã giải quyết nhiều khó khăn xuất bản các câu đố sudoku manualy và không bao giờ sử dụng các kỹ thuật như vậy)

cách tiếp cận khác đã được sử dụng trong đó có những lợi ích sau:

  1. generalises tốt để sudokus tùy ý (9x9, 4x4, 6x6 , 16x16 vv ..)
  2. Cấu hình sudoku, với độ khó mong muốn, được tạo ra một lần và trực tiếp
  3. Xếp hạng độ khó là mục tiêu.

Cách thức hoạt động?

Trước hết, thực tế đơn giản là câu đố càng khó, càng cần nhiều thời gian để giải quyết.

Nhưng thời gian để được giải quyết có mối tương quan mật thiết với cả hai đầu mối (givens) và các phương án thay thế trung bình được điều tra cho mỗi ô trống.

Mở rộng của tôi previous answer, người ta nói rằng đối với bất kỳ câu đố sudoku số lượng tối thiểu của các đầu mối là một đặc tính khách quan của các câu đố (ví dụ for 9x9 grids the minimum number of clues for having a valid sudoku is 17)

Người ta có thể bắt đầu từ đó và tính toán số lượng tối thiểu của các đầu mối mỗi khó khăn mức độ (tương quan tuyến tính).

Bên cạnh đó tại mỗi bước của quá trình tạo sudoku, người ta có thể chắc chắn rằng các lựa chọn thay thế trung bình (được điều tra) mỗi ô trống nằm trong giới hạn nhất định (như một chức năng của khó khăn mong muốn)

Tùy thuộc vào việc các thuật toán sử dụng backtrack hay không (đối với trường hợp sử dụng đã thảo luận thuật toán không có backtracking), độ khó mong muốn có thể đạt được với xác suất = 1 hoặc với xác suất cao trong giới hạn (tương ứng).

Thử nghiệm sudokus được tạo bằng thuật toán này và xếp hạng khó dựa trên phương pháp trước (bộ giải mã giống như con người), cho thấy mối tương quan giữa tỷ lệ khó mong muốn và ước tính, cộng với khả năng tổng quát hơn cho cấu hình sudoku tùy ý.

(đã sử dụng trực tuyến này sudoku solver (và cũng this one) tương ứng tỷ lệ khó khăn của sudokus thử nghiệm)

Mã này có sẵn miễn on github sudoku.js (along with sample demo application), một phiên bản thu nhỏ của một người thợ xây CrossWord.js ô chữ chuyên nghiệp trong JavaScript, bởi cùng một tác giả

Các vấn đề liên quan