Lập chỉ mục vào cơ sở dữ liệu mẫu - Giải pháp Cube tối ưu Rubik của Korf


11

Là một dự án thú vị, tôi đã thực hiện triển khai C # của Richard Korf - Tìm giải pháp tối ưu cho khối Rubik bằng cách sử dụng cơ sở dữ liệu mẫu.

https://www.cs.princeton.edu/cifts/archive/fall06/cos402/ con / korfrubik.pdf

Tôi thực sự có nó hoạt động, tôi chỉ đang cố gắng cải thiện giải pháp của tôi.

Một điều mà Korf liếc qua trong bài báo của mình là cách anh ta lưu trữ và lập chỉ mục vào cơ sở dữ liệu mẫu. Lý tưởng nhất, tôi nghĩ rằng chúng tôi muốn sử dụng một thể hiện của khối rubik để tạo một chỉ mục thành một mảng.

Câu hỏi của tôi là về cách tốt nhất để tạo ra chỉ số này.

Giải pháp của tôi là tạo ra một hàm băm hoàn hảo tối thiểu. Điều này liên quan đến việc giữ TẤT CẢ các hình khối trong bộ nhớ cho đến khi tôi phát hiện ra toàn bộ cơ sở dữ liệu mẫu sau đó tạo ra một hàm băm hoàn hảo tối thiểu dựa trên điều đó. MPH mất vài giờ để chạy tùy thuộc vào kích thước cơ sở dữ liệu mẫu, nhưng tôi chỉ cần thực hiện một lần kể từ khi tôi lưu nó vào đĩa. Cuối cùng, tôi có thể vứt bỏ các khối chỉ lưu trữ MPH. Bằng cách đó, tôi có thể lấy khối rubik ngẫu nhiên, áp dụng mẫu, sau đó tra chỉ số mảng trong MPH để có chiều dài giải pháp ước tính.

Tôi tin rằng Korf và Shultz mô tả một cách tốt hơn để xác định chỉ số của khối lập phương trong bài báo năm 2005 của họ có tên là "Tìm kiếm theo chiều rộng quy mô lớn"

https://www.aaai.org/Papers/AAAI/2005/AAAI05-219.pdf

Bài viết này mô tả một thuật toán để tạo ra một chỉ mục dựa trên thứ tự từ điển của một hoán vị. Về cơ bản, bạn có thể lấy hoán vị {1, 2, 3} và chỉ ra rằng nó là nhỏ nhất với chỉ số là 0. {1, 3, 2} tiếp theo với chỉ số là 1, v.v.

Tôi cảm thấy mình có thể áp dụng thuật toán này cho khối rubik để lấy chỉ mục của nó trong cơ sở dữ liệu mẫu, nhưng tôi gặp khó khăn trong việc tìm ra cách nó hoạt động trong thực tế.

Ví dụ, cơ sở dữ liệu mẫu chỉ chứa tất cả các khối rubik đã được dán cạnh. Có chính xác 88.179.840 khối trong bộ này. Bất kỳ khối vuông nào trên khối rubik đều có thể ở một trong 24 trạng thái khác nhau. Trạng thái của hình khối góc thứ 8 có thể được tính dựa trên 7 hình khối khác vì vậy các hình khối trong cơ sở dữ liệu chỉ có các góc có 7 giá trị trong khoảng từ 0 đến 23

ví dụ: {0, 3, 6, 9, 12, 15, 18, 21} định nghĩa khối "đã giải quyết" với tất cả các nhãn dán được loại bỏ.

nếu tôi xoay mặt trước 90 độ thì hoán vị có thể là: {0, 3, 11, 23, 12, 15, 8, 20}

Có cách nào để đưa một chỉ mục ra khỏi những hoán vị này không?


Có lẽ bạn sẽ thấy điều này thú vị.
Tom van der Zanden 11/03/2016

hấp dẫn! bạn nói anh ấy "liếc qua" cái gì đó trong tờ giấy. sẽ tốt hơn nếu nói cụ thể hơn về phần không "xác thịt". bạn cũng nói bạn có nó làm việc thực hiện lập chỉ mục ban đầu của bạn là gì? Đây có phải là một dự án trường học? đề nghị thêm Trò chuyện Khoa học Máy tính về nó. cũng như viết blog về nó hoặc tìm nguồn mở mã có thể hữu ích cho người khác và dẫn đến chi tiết hơn. Ngoài ra, bài báo dường như không đề cập đến bất kỳ chức năng băm nào ...
vzn

Tôi đã triển khai thuật toán của Korf: github.com/benbotto/rubiks-cube-cracker . Tôi cũng vậy, thấy việc lập chỉ mục là khó khăn, vì vậy tôi đã viết một bài viết về nó trên Medium: Medium.com/@benjamin.botto/ chủ
avejidah

Câu trả lời:


6

Bạn không giải thích các số từ 0 đến 23 có nghĩa là gì, nhưng theo câu trả lời này , bạn có thể biểu thị trạng thái của các góc bằng tám cặp , trong đó là một hoán vị của , và (nói) được xác định bởi . Tổng cộng, điều này mang lại cho độ tự do. Giả sử rằng bạn có thể phân tách thành các cặp , bạn có thể dễ dàng chuyển đổi một vị trí thành một chỉ mục bằng cách mã hóa riêng phần hoán vị(pi,oi)(p0,,p7)(0,,7)oi{0,1,2}o7o0,,o68!37=88179840{0,,23}(pi,oi)(p0,,p7)(mà bài viết của AAAI giải thích cách thực hiện) và các giá trị , mà bạn có thể mã hóa trong cơ sở 3. Đặt hai giá trị lại với nhau theo cách rõ ràng (ví dụ: hoặc ), chúng tôi nhận được một chỉ mục.o0,,o637p+o8!o+p


Này Yuval, cảm ơn vì nhận xét. Đối với tôi, 0 đến 23 là cách tôi xác định vị trí / hướng duy nhất mà khối vuông có thể ở. 8 vị trí nhân 3 lần định hướng cho mỗi vị trí = 24. May mắn thay tôi có thể dễ dàng chia giá trị này thành các bộ định vị / định hướng riêng biệt. Câu trả lời của bạn đã đưa tôi đến mã này, đây là một triển khai thuật toán mà bạn mô tả. github.com/brownan/Rubiks-Cube-Solver/blob/master/cornertable.c Tôi sẽ cần làm một chút công việc để làm cho nó chung chung hơn (để tôi có thể xử lý các mẫu khác nhau ngoài "chỉ các góc") nhưng bây giờ Tôi đang đi đúng hướng thx!
Cosmosis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.