Tôi đang cố gắng tạo ra một chức năng giải thể cho một thuật toán trò chơi. Về cơ bản một hàm trả về true hoặc false cho một game nào đó nếu nó có khả năng giải được hay không.Thuật toán giải quyết trò chơi (Buttonia, biến thể tắt đèn)
Trò chơi là Buttonia.com (hiện không triển khai thuật toán), một loại trò chơi tắt đèn. Về cơ bản Bạn có một mạng lưới các nút, mỗi nút, khi được nhấn, sẽ thay đổi trạng thái của một số hàng xóm của nó. Hiện tại tôi tạo ra một cấu hình trò chơi ngẫu nhiên và sau đó áp dụng chẩn đoán càng nhiều càng tốt. Phần còn lại được quyết định bằng tìm kiếm bạo lực.
Tiến trình của tôi cho đến nay là tạo ra một hệ phương trình để mô hình hóa trò chơi. Khi mỗi nút cần phải thay đổi trạng thái một số lẻ lần để kết thúc trong tình trạng xuống, Đó là phương trình sẽ là:
button_A = 1 - (button_1 + button_2 + ... + button_X)% 2
Trong đó nút_1 qua nút_X là trạng thái của các nút có hiệu ứng trên button_A. Một số nút có thể được giải quyết ngay lập tức, nếu chúng không phụ thuộc vào người khác. Đối với phần còn lại, tôi thử một cấu hình cho đến khi tôi nhận được một cuộc xung đột và sau đó trở lại theo dõi.
Thuật toán hiện tại này là thiết thực cho các cấu hình trò chơi nhỏ hơn. Tôi đã thử nghiệm nó từ trò chơi 3x3 lên đến kích thước 10x10. Trường hợp 6x6 gần với giới hạn trên để chơi thực tế.
Các phương trình vô cùng cắt giảm không gian tìm kiếm từ vũ lực, làm cho nó thực tế. Có thể có một cách hoàn toàn toán học để giải quyết hệ phương trình.
mẫu 3x3 trò chơi trong ascii (từ buttonia.com/?game=2964):
||#
-o-
+#|
Legend:
o = affect only self
- = affect left and right neighbors
| = affect above and below neighbors
+ = affect left, right, above and below neighbors
# = affect all 8 surrounding neighbors
Solution, nhấn các nút này: (0,0), (2,0), (1, 2), (0, 1), (1, 1), (2,1)
phương trình cho trò chơi này:
Button_0_0 = 1 - (0) % 2
Button_1_0 = 1 - (Button_2_0) % 2
Button_2_0 = 1 - (0) % 2
Button_0_1 = 1 - (Button_0_0 + Button_0_2 + Button_1_2) % 2
Button_1_1 = 1 - (Button_1_0 + Button_2_0 + Button_0_1 + Button_2_1 + Button_1_2) % 2
Button_2_1 = 1 - (Button_2_0 + Button_1_2 + Button_2_2) % 2
Button_0_2 = 1 - (Button_1_2) % 2
Button_1_2 = 1 - (Button_0_2) % 2
Button_2_2 = 1 - (Button_1_2) % 2
giải pháp tiềm năng:
Thay đổi các hàm toán học để tránh sự cần thiết của mô đun cho phép chúng ta di chuyển các từ bên trái sang phải, tạo ra thiết lập ma trận gọn gàng mà chúng ta cần cho phương thức Gaussian. Vì vậy, hai phương trình đầu tiên sẽ lần lượt chuyển sang:
-1 = -1*B00 + 0*B10 + 0*B20 + 0*B01 + 0*B11 + 0*B21 + 0*B02 + 0*B12 + 0*B22
-1 = 0*B00 + -1*B10 + -1*B20 + 0*B01 + 0*B11 + 0*B21 + 0*B02 + 0*B12 + 0*B22
giải pháp thảo luận ở đây: Gaussian Elimination with custom operators
Bắt gần hơn. Hầu như đã sẵn sàng để đăng giải pháp đầy đủ: Inverting binary networks
Tôi có nghĩ rằng chỉ một người cho rằng địa chỉ đó có vẻ giống trang khiêu dâm không? =] –
Tôi đặt cược rằng một số guru Perl có thể đi ra với một biểu thức chính quy giải quyết vấn đề xD – fortran
trong tất cả sự trung thực, trò chơi đó là khá thú vị, nhưng bạn cần một chút giải thích văn bản ở trên cùng, nó đã cho tôi một phút hoặc lâu hơn để tìm ra những gì tôi phải làm! = D –