Thuật toán cho chỗ ngồi Zoombinis trên phà của Thuyền trưởng Cajun?


12

Gần đây tôi đã chơi bản phát hành lại Hành trình logic của Zoombinis và cố gắng thực hiện một số thuật toán máy tính có thể giải các câu đố khác nhau. Tôi bế tắc về cách tiếp cận câu đố trên phà của Thuyền trưởng Cajun.

Đối với những người không quen thuộc, Zoombini là một sinh vật có 4 thuộc tính: tóc, mắt, mũi và chân. Mỗi thuộc tính đó có 5 giá trị có thể; ví dụ, chân của Zoombini có thể là bánh xe, giày trượt patin, giày thể thao, lò xo hoặc chân vịt. Đây là một ví dụ về Zoombini với mái tóc rối bù, kính, mũi xanh và giày thể thao:

Trong câu đố trên phà, nhiệm vụ là sắp xếp một bộ sưu tập 16 Zoombinis trên 16 chỗ ngồi của một chiếc phà. Việc sắp xếp phải tuân theo quy tắc rằng bất kỳ hai ghế lân cận trực giao nào đều phải được chiếm bởi Zoombinis có chung ít nhất một tính năng. Nếu hai Zoombin có mái tóc khác nhau, đôi mắt khác nhau, mũi khác nhau đôi chân khác nhau, chúng có thể không ngồi cạnh nhau.

Việc sắp xếp chỗ ngồi thay đổi theo cấp độ; để cụ thể hóa, hãy tập trung vào mức độ "Rất cứng", trong đó 16 chỗ ngồi được sắp xếp theo dạng lưới 4 nhân 4. Dưới đây là một ví dụ về việc 15 Zoombin đã được ngồi hợp pháp, nhưng Zoombini cuối cùng đứng trên dock không thể được đặt ở ghế trống cuối cùng, bởi vì cô ấy sẽ không chia sẻ tính năng nào với Zoombini ở bên phải:

Ví dụ về câu đố gần hoàn thành

Có 16! 21 nghìn tỷ nhiệm vụ có thể của Zoombinis cho ghế ngồi. Vì vậy, chỉ cần chạy qua mọi nhiệm vụ có thể để xem nếu nó hợp pháp sẽ không thực tế. Một số heuristic tôi có thể sử dụng để tiếp cận vấn đề này hợp lý là gì?


2
Nó làm tôi nhớ đến sudoku và những người giải sudoku thường thực hiện một số kiểu quay lui.
mattecapu

2
Nếu bạn đã sẵn sàng và sẵn sàng tìm hiểu một số tài liệu phức tạp hơn, thì bạn có thể tìm thấy thông tin hữu ích bằng cách tìm kiếm Subgraph Isomorphism Problem. Vấn đề là tìm một biểu đồ trong một biểu đồ khác. Trong trường hợp của bạn, sơ đồ con sẽ là chỗ ngồi (các cạnh là kề), trong khi biểu đồ mẹ sẽ là zoombinis, trong đó các kết nối sẽ là sự hiện diện của một đặc điểm chung. Lưu ý rằng nói chung, vấn đề là NP-đầy đủ và thường được thực hiện bằng cách quay lại, tuy nhiên đối với một số trường hợp đặc biệt (trong đó biểu đồ của bạn rất có thể), các giải pháp đa thức hoặc thậm chí tuyến tính là có thể.
16:00

Đây là một ý tưởng tuyệt vời, tôi yêu thích zoombinis khi còn bé - tôi có thể làm điều tương tự!
AlexFoxGill

Câu trả lời:


8

Cảm ơn @mattecapu về thuật ngữ tìm kiếm hữu ích của Google về "thuật toán quay lui". Điều đó đã cho tôi thức ăn cho rằng tôi cần.

Trực giác hiện tại của tôi là có thể tốt hơn là điền vào chỗ ngồi trung tâm, nơi có 4 người hàng xóm đầu tiên, và tiết kiệm chỗ ngồi góc, nơi chỉ có 2 người hàng xóm cuối cùng. Vì vậy, tôi sắp xếp 16 ghế trống vào một danh sách liên kết theo thứ tự này:

13   5   6  14

 7   1   2   9

 8   3   4  10

15  11  12  16

Đây là một số mã giả mô tả chức năng mà tôi viết lên. Bạn cung cấp cho nó một danh sách chứa 16 Zoombinis và một con trỏ đến chỗ ngồi đầu tiên trong danh sách được liên kết.

function recursively_assign_seat(zoombini_list, seat):

    if zoombini_list is empty:
        return True

    else:
        for each z in zoombini_list:

            for each n in seat.neighbors:
                if not allowed_as_neighbors(z, n):
                    next z

            seat.occupant ← z
            if recursively_assign_seat(zoombini_list.remove(z), seat.next):
                return True
            else:
                seat.occupant ← None

        return False

Nó thực sự chạy nhanh đáng ngạc nhiên! Tôi cảm thấy rất hài lòng về điều đó.

Tôi chưa hoàn toàn bị thuyết phục rằng tôi đã sắp xếp danh sách các ghế theo thứ tự tốt nhất có thể. Có tất cả 24 hạn chế về vấn đề này và thứ tự lý tưởng của việc lấp đầy chỗ ngồi sẽ đối mặt với từng hạn chế đó càng sớm càng tốt trong quy trình lấp đầy chỗ ngồi, để các chi nhánh không thể được cắt tỉa nhanh chóng.


1
khi bạn điền 8bạn chỉ liền kề 2, nhưng bạn có thể điền 9vào liền kề với cả hai 73. công việc tốt đẹp mặc dù!
AlexFoxGill

Thực hiện chỉnh sửa đó; mặc dù vậy, vẫn không chắc chắn liệu lược đồ từ trong ra ngoài chỉ cần điền vào từng hàng một. Có lẽ tôi sẽ làm một số bài kiểm tra thời gian.
thecommexokid
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.