0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Chơi Tic-Tac-Toe Lượng Tử với Python và Qiskit

Đăng vào 6 ngày trước

• 8 phút đọc

Giới thiệu

Con gái tôi rất thích chơi Tic-Tac-Toe, trò chơi đơn giản, nhanh chóng và vô cùng thú vị. Khi xem cô bé chiến lược, tôi đã tự hỏi: liệu chúng ta có thể thêm một khía cạnh lượng tử vào trò chơi này không? Liệu chúng ta có thể biến trò chơi cổ điển này thành một trò chơi xác suất, không thể đoán trước và, theo một cách nào đó, "thật sự lượng tử"? Sự tò mò đó đã dẫn tôi đến Tic-Tac-Toe Lượng Tử, một trò chơi CLI nơi các ô có thể tồn tại trong trạng thái chồng chéo, và các nước đi của bạn có thể sụp đổ thành quyền sở hữu xác định. Bạn có thể tìm thấy mã nguồn tại đây.

Tại sao Tic-Tac-Toe Lượng Tử?

Điện toán lượng tử chủ yếu về xác suất và siêu vị. Một qubit có thể là 0, 1, hoặc cả hai cùng lúc… cho đến khi nó được đo. Tôi muốn có một cách đơn giản, tương tác để minh họa ý tưởng này, và một trò chơi nổi tiếng, tuy đơn giản như Tic-Tac-Toe dường như là sự lựa chọn hoàn hảo.

  • Ô trống: có sẵn.
  • Ô xác định: một người chơi sở hữu nó.
  • Ô chồng lấp: một "có thể" lượng tử, được chỉ định bằng dấu ?.

Mỗi nước đi có một cơ hội để đẩy một ô vào trạng thái chồng chéo, và một số hành động sẽ sụp đổ bảng, gán quyền sở hữu dựa trên các phép đo lượng tử.

Xây dựng trò chơi

Tôi đã triển khai trò chơi này bằng Python và Qiskit. Điều này thực sự là quá sức cho những gì tôi đang xây dựng, nhưng tôi muốn kết hợp một số khái niệm cụ thể của thư viện qiskit vào đây. Mỗi ô chồng lấp được đại diện bởi một qubit. Chúng tôi đã thử một vài cách tiếp cận khác nhau trước khi cuối cùng quyết định về logic được trình bày dưới đây. Cách tiếp cận ban đầu của chúng tôi là duy trì các trạng thái chồng lấp vô thời hạn. Điều này khiến cho việc chiến thắng trở nên vô cùng khó khăn, vì tất cả các ô chồng lấp phải sụp đổ theo cách chính xác. Chúng tôi có thể đã thực hiện một số điều chỉnh để điều này dễ xảy ra hơn, nhưng cuối cùng, chúng tôi đã quyết định chọn một gameplay đơn giản hơn.

Logic cốt lõi rất đơn giản:

  • Nước đi đầu tiên trên ô trống: quyền sở hữu xác định.
  • Nước đi trên ô đã sở hữu: đẩy nó vào trạng thái chồng lấp.
  • Sụp đổ: mô phỏng một phép đo lượng tử cho mỗi ô chồng lấp để xác định quyền sở hữu.

Cho phiên bản đầu tiên, tôi đã sử dụng sụp đổ một lần. Điều này có nghĩa là mỗi ô trong trạng thái chồng lấp được đo một lần, và kết quả ngay lập tức xác định chủ sở hữu.

python Copy
    def collapse_superposition(self):
        superposed_indices = self.get_superposition_cells()

        if not superposed_indices:
            return

        print(f"\nĐang sụp đổ {len(superposed_indices)} ô chồng lấp bằng phép đo lượng tử độc lập...")

        simulator = AerSimulator()

        for cell_idx in superposed_indices:
            # Xây dựng một mạch riêng cho mỗi ô
            qc = QuantumCircuit(1, 1)
            qc.h(0)  # đặt qubit vào trạng thái chồng lấp
            qc.measure(0, 0)

            # Thực hiện với 100 lần đo
            compiled_circuit = transpile(qc, simulator)
            job = simulator.run(compiled_circuit, shots=100)
            result = job.result()
            counts = result.get_counts(compiled_circuit)

            measurement = list(counts.keys())[0]
            clean_measurement = measurement.replace(' ', '')

            bit_value = int(clean_measurement)
            owner = 'X' if not bit_value else 'O'
            self.board[cell_idx] = {'state': 'deterministic', 'owner': owner}
            print(f"Ô {cell_idx} đã sụp đổ thành: {owner}")

Sau khi đo, X hoặc O được gán một cách xác định dựa trên kết quả.

Những phát hiện từ cách tiếp cận một lần

Chơi trò chơi với sụp đổ một lần đã tiết lộ một số hành vi thú vị:

  • Kết quả rất không thể đoán trước: vì mỗi lần sụp đổ chỉ đo một lần, bảng có thể thay đổi mạnh mẽ từ lượt này sang lượt khác.
  • Khó khăn trong việc lập chiến lược: bạn có thể cố gắng đẩy một ô vào trạng thái chồng lấp để có lợi thế xác suất, nhưng nó sẽ sụp đổ ngược lại với bạn ngay lập tức.
  • Mô hình phát sinh thú vị: xem cách một ô "lật" từ trạng thái chồng lấp sang quyền sở hữu xác định rất đẹp và thể hiện tinh thần của sự không chắc chắn lượng tử.

Tóm lại: sụp đổ một lần rất thú vị, hỗn loạn và rất "giống lượng tử".

Sụp đổ nhiều lần: Một cách tiếp cận khoa học hơn

Đối với những ai muốn có một mô phỏng lượng tử thống kê hơn, tôi cũng đã triển khai một sụp đổ nhiều lần. Ở đây, mỗi ô được đo 100 lần, và kết quả của đa số quyết định quyền sở hữu.

python Copy
    def collapse_superposition(self):  # sụp đổ nhiều lần
        """Sụp đổ tất cả các ô chồng lấp bằng phép đo lượng tử độc lập cho mỗi ô"""
        superposed_indices = self.get_superposition_cells()

        if not superposed_indices:
            return

        print(f"\nĐang sụp đổ {len(superposed_indices)} ô chồng lấp bằng phép đo lượng tử độc lập...")

        simulator = AerSimulator()

        for cell_idx in superposed_indices:
            # Xây dựng một mạch riêng cho mỗi ô
            qc = QuantumCircuit(1, 1)
            qc.h(0)  # đặt qubit vào trạng thái chồng lấp
            qc.measure(0, 0)

            # Thực hiện với 100 lần đo
            compiled_circuit = transpile(qc, simulator)
            job = simulator.run(compiled_circuit, shots=100)
            result = job.result()
            counts = result.get_counts(compiled_circuit)

            # Đếm số lượng cho ô này
            ones = counts.get('1', 0)
            zeros = counts.get('0', 0)
            owner = 'O' if ones >= zeros else 'X'

            self.board[cell_idx] = {'state': 'deterministic', 'owner': owner}
            print(f"Ô {cell_idx} đã sụp đổ thành: {owner}")

Cách tiếp cận này gần hơn với 50/50 và giảm tính ngẫu nhiên so với phiên bản sụp đổ một lần. Nó trở nên dễ đoán hơn, và người chơi có thể bắt đầu phát triển các chiến lược xung quanh xác suất, thay vì chỉ đơn thuần là hỗn loạn.

Bài học rút ra

  1. Cơ học lượng tử có thể thú vị và tương tác. Sử dụng một trò chơi đơn giản, bạn có thể minh họa trạng thái chồng lấp, phép đo và xác suất mà không cần toán nặng nề.
  2. Ngẫu nhiên so với chiến lược: các sụp đổ một lần cảm thấy cực kỳ lượng tử, trong khi các sụp đổ nhiều lần giới thiệu một loại khả năng dự đoán xác suất.
  3. Python + Qiskit rất dễ tiếp cận: bạn không cần một máy tính lượng tử thực sự để thử nghiệm, và các mô phỏng như Aer giúp dễ dàng khám phá các khái niệm tại chỗ.

Hãy thử ngay

Tôi đã mở mã nguồn cho trò chơi Tic-Tac-Toe Lượng Tử CLI, vì vậy bạn có thể thử nghiệm và xem cách mà sự không thể đoán trước lượng tử ảnh hưởng đến chiến lược của bạn.

Những điểm nổi bật để thử nghiệm:

  • Chơi bằng sụp đổ một lần… hãy chuẩn bị cho sự hỗn loạn.
  • Thử phương pháp sụp đổ nhiều lần, và xem cách mà xác suất làm mượt các kết quả.
  • Đẩy các ô xác định vào trạng thái chồng lấp, và xem các viên xúc xắc lượng tử lăn!

Tic-Tac-Toe Lượng Tử không chỉ là một dự án Python thú vị… nó là một giới thiệu thực hành về hành vi lượng tử. Dù bạn là một lập trình viên tò mò về điện toán lượng tử, hay chỉ là ai đó muốn một góc nhìn mới mẻ về Tic-Tac-Toe, dự án này cung cấp một cái nhìn nhỏ về cách mà cơ học lượng tử hoạt động trong thực tế.

Có một kịch bản trong trò chơi mà tôi chưa đề cập, hãy thử tìm lỗi xem nào!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào