2011-08-27 54 views
7

trong trò chơi này: http://www.mathsisfun.com/games/allout.html Hàm giải quyết có thể giải quyết mọi trường hợp, bất kể bạn "lạm dụng" bảng gốc như thế nào. Vui lòng cho tôi biết thuật toán để giải quyết trò chơi này. Tôi đã cố gắng suy nghĩ trong nhiều ngày nhưng vẫn không tìm thấy đầu mối để giải quyết tất cả các trường hợp.Bất kỳ thuật toán nào cho trò chơi "Lật tất cả" (Light Out)?

OK, sau khi đọc một số câu trả lời và bình luận (và có một cái nhìn lướt qua ánh sáng ra khỏi trò chơi), tôi mở rộng câu hỏi của tôi:

Liệu trò chơi khác nhau nếu tôi mở rộng kích thước của lưới điện (như để 25x25)? Vẫn còn bất kỳ thuật toán nào có thể giải quyết được bất kỳ trường hợp nào, trong thời gian chấp nhận được (< 2s)?

+1

Xem thêm [Tắt đèn] (http://en.wikipedia.org/wiki/Lights_Out_%28game%29). – trashgod

Trả lời

7

Trò chơi này thường được gọi là Lights Out và có một số giải pháp thanh lịch, tất cả đều dựa trên một số toán học tiêu chuẩn nhưng có phần nâng cao. Tôi sẽ không mô tả tất cả chúng ở đây nhưng nếu bạn Google một chút bạn có thể tìm thấy tất cả các loại giải thích khác nhau từ các thủ tục đơn giản để biến đổi thành đại số tuyến tính hoặc lý thuyết nhóm. Một số liên kết:

http://www.hamusutaa.com/pilot/solution.html

http://www.ripon.edu/academics/macs/summation/2010/articles/M.%20Madsen%20-%20Lights%20Out.pdf

http://people.math.sfu.ca/~jtmulhol/math302/notes/24-Lights-Out.pdf

Sửa: Re: Câu hỏi thứ hai của bạn. Thuật toán được trình bày trong liên kết thứ hai tôi đăng có thể giải quyết một bảng n x n trong thời gian O (n^6), nghĩa là bạn có thể nhanh chóng giải quyết một bảng 25 x 25.

+0

Có, tôi đang đọc nó, rất thú vị! Sẽ quay lại ngay sau khi tôi đọc xong. –

0

Giống như hầu hết "trò chơi" vấn đề AI, có một cách tiếp cận chung:

Thực hiện một cấu trúc cây trong đó mỗi nút là trạng thái trò chơi và trẻ em của các quốc gia đại diện cho sự chuyển tiếp giữa các trạng thái.

Hoặc thực hiện điều này dưới dạng tìm kiếm rộng đầu tiên (nếu bạn giữ nhật ký các trạng thái trong quá khứ bạn đã nhìn thấy và từ chối xem lại, và bạn không quan tâm đến việc tìm giải pháp tối ưu) hoặc với một heuristic lạc quan cho phép bạn sử dụng A *. Một heuristic khá khủng khiếp tôi có thể nghĩ đến là "Số vòng tròn cần được lật để giành chiến thắng trong câu đố, chia cho 5." Tôi không chắc chắn nếu có một tốt hơn; Tôi muốn được quan tâm đến việc lắng nghe ý kiến ​​của mọi người về điều này (Lưu ý rằng nó phải lạc quan, nghĩa là, heuristic không bao giờ có thể tính toán được số lượng di chuyển cần thiết.)

Đi sâu vào chi tiết hơn một chút đây là một chủ đề lớn, và bên cạnh đó, nó khá đơn giản nếu bạn biết làm thế nào để làm một tìm kiếm rộng đầu tiên hoặc A *.

+0

Tôi vẫn không biết A * có thể giải quyết trò chơi này như thế nào (tôi chưa nghiên cứu đầy đủ A *), BFS có vẻ như có thể, nhưng ... bắt đầu từ đâu? Trong lưới 25x25, có thể không phù hợp với bộ nhớ điện thoại với mọi trường hợp. –

+0

@ W.N. Yeah, thẳng đứng BFS sẽ không thể làm 25x25, ít nhất là không thanh lịch. A * là doable nếu bạn có thể nghĩ về một heuristic hữu ích hơn. Nếu không có ai (có lẽ một lý thuyết hợp lý sẽ giải quyết một vấn đề thoải mái? Ví dụ, hãy thử giải quyết một phiên bản của trò chơi này khi bạn lật một hình vuông, nó và 4 xung quanh nó lật, nhưng chỉ khi chúng là sai màu.) Nếu ngay cả điều đó cũng không đủ tốt, bạn sẽ phải xem xét vấn đề này một cách cụ thể và xem xét các thủ thuật cụ thể mà bạn có thể sử dụng để giải quyết nó. – Jeremy

4

Có một phương pháp nổi tiếng để giải quyết vấn đề này. Cho x_1, ..., x_n là các biến tương ứng với việc bạn nhấn nút n'th như một phần của giải pháp và để a_1, ..., a_n là trạng thái ban đầu.

Hãy nói rằng bạn đang giải quyết một vấn đề 3x3, và các biến được thiết lập như thế này:

x_1 x_2 x_3 
x_4 x_5 x_6 
x_7 x_8 x_9 

và trạng thái ban đầu này là:

a_1 a_2 a_3 
a_4 a_5 a_6 
a_7 a_8 a_9 

Bây giờ, bạn có thể viết ra một số phương trình (trong modul số học 2) mà dung dịch phải thỏa mãn.Về cơ bản, nó mã hóa quy tắc về thiết bị chuyển mạch nào gây ra một ánh sáng cụ thể để chuyển đổi.

a_1 = x_1 + x_2 + x_4 
a_2 = x_1 + x_2 + x_3 + x_5 
... 
a_5 = x_2 + x_4 + x_5 + x_6 + x_8 
... 
a_9 = x_6 + x_8 + x_9 

Bây giờ bạn có thể sử dụng loại bỏ gaussian để giải quyết tập phương trình đồng thời này. Bởi vì bạn đang làm việc trong modulo số học 2, nó thực sự dễ dàng hơn một chút so với phương trình đồng thời so với số thực. Ví dụ, để loại bỏ x_1 trong phương trình 2, chỉ cần thêm phương trình đầu tiên vào phương trình.

a_1 + a_2 = (x_1 + x_2 + x_4) + (x_1 + x_2 + x_3 + x_5) = x_3 + x_4 + x_5 

Cụ thể, đây là thuật toán khử Gauss trong số học modulo 2:

  • Chọn một phương trình với một x_1 trong đó. Đặt tên nó là E_1.
  • Thêm E_1 vào mọi phương trình chưa đặt tên khác có x_1 trong đó.
  • Lặp lại cho x_2, x_3, ...., x_n.

Bây giờ, E_n là phương trình chỉ chứa x_n. Bạn có thể thay thế giá trị cho x_n bạn nhận được từ điều này vào các phương trình trước đó. Lặp lại cho E_ {n-1}, ..., E_1.

Nói chung, điều này giải quyết được vấn đề trong hoạt động O (n^3).

Dưới đây là một số mã.

class Unsolvable(Exception): 
    pass 

def switches(vs): 
    n, m = len(vs), len(vs[0]) 
    eqs = [] 
    for i in xrange(n): 
     for j in xrange(m): 
      eq = set() 
      for d in xrange(-1, 2): 
       if 0 <= i+d < n: eq.add((i+d)*m+j) 
       if d != 0 and 0 <= j+d < m: eq.add(i*m+j+d) 
      eqs.append([vs[i][j], eq]) 

    N = len(eqs) 
    for i in xrange(N): 
     for j in xrange(i, N): 
      if i in eqs[j][1]: 
       eqs[i], eqs[j] = eqs[j], eqs[i] 
       break 
     else: 
      raise Unsolvable() 
     for j in xrange(i+1, N): 
      if i in eqs[j][1]: 
       eqs[j][0] ^= eqs[i][0] 
       eqs[j][1] ^= eqs[i][1] 

    for i in xrange(N-1, -1, -1): 
     for j in xrange(i): 
      if i in eqs[j][1]: 
       eqs[j][0] ^= eqs[i][0] 
       eqs[j][1] ^= eqs[i][1] 
    return [(i//m,i%m) for i, eq in enumerate(eqs) if eq[0]] 

print switches(([1, 0, 0], [0, 1, 0], [0, 0, 1], [0, 0, 0])) 

Bạn đặt trạng thái ban đầu cho một hàng tại một thời điểm. Nó trả về các công tắc mà bạn cần nhấn để tắt tất cả các đèn.

Điều này giải quyết được vấn đề 50x50 trong chưa đầy nửa giây trên máy tính xách tay của tôi.

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