Hướng dẫn chess ai python code - cờ vua mã trăn ai
Tác giả: Lauri Hartikka Show Chúng ta hãy cùng khám phá một số khái niệm cơ bản sẽ giúp chúng ta tạo ra một AI cờ vua đơn giản:
Ở mỗi bước, chúng tôi sẽ cải tiến thuật toán bằng một trong những kỹ thuật lập trình game cờ vua đã qua thử nghiệm. Tôi sẽ chứng minh làm thế nào để tác động đến lối chơi của thuật toán. Bạn có thể xem thuật toán AI hoàn chỉnh trên GitHub. Bước 1: Hiển thị các bước di chuyển và bàn cờChúng tôi sẽ sử dụng thư viện chess.js để phát triển các bước di chuyển và chessboard.js để hiển thị bàn cờ. Thư viện tạo ra các bước di chuyển cơ bản tuân theo tất cả quy luật của cờ vua. Dựa vào điều này, chúng ta có thể tính toán tất cả các bước đi hợp lý cho một ván chơi nhất định. Sử dụng các thư viện này sẽ giúp chúng ta có thể dồn toàn tâm toàn ý vào công việc thú vị nhất: tạo ra thuật toán tìm nước cờ tốt nhất. Chúng ta sẽ bắt đầu bằng cách tạo ra một chức năng chỉ trả về một nước đi ngẫu nhiên từ tất cả hướng có thể: Có thể bạn quan tâmvar calculateBestMove =function(game) { //generate all the moves for a given position var newGameMoves = game.ugly_moves(); return newGameMoves[Math.floor(Math.random() * newGameMoves.length)]; }; Mặc dù thuật toán này không tạo nên đối thủ cứng tay, tuy nhiên đó là một khởi đầu tốt, chúng ta thực sự đã có thể chơi với nó: Bước 2: Dự đoán các nước điBây giờ chúng ta hãy cố gắng hiểu được bên nào mạnh hơn ở vị trí nào đó. Cách đơn giản nhất để đạt được điều này là tính toán sức mạnh tương đối của các quân cờ trên bàn bằng cách sử dụng bảng sau: Với chức năng dự đoán, chúng ta có thể tạo ra một thuật toán chọn nước cờ đạt hiểu quả cao nhất: var calculateBestMove = function (game) { var newGameMoves = game.ugly_moves(); var bestMove = null; //use any negative large number var bestValue = -9999; for (var i = 0; i < newGameMoves.length; i++) { var newGameMove = newGameMoves[i]; game.ugly_move(newGameMove); //take the negative as AI plays as black var boardValue = -evaluateBoard(game.board()) game.undo(); if (boardValue > bestValue) { bestValue = boardValue; bestMove = newGameMove } } return bestMove; Cải tiến duy nhất đạt được là thuật toán của chúng ta sẽ nắm bắt được một phần phương thức di chuyển nếu có thể. Bước 3: Tìm kiếm nước đi hiểu quả nhất bằng MinimaxTiếp theo, chúng ta sẽ tạo ra các hướng đi có thể xảy ra từ đó thuật toán có thể chọn bước di chuyển tốt nhất. Điều này được thực hiện bằng cách sử dụng thuật toán Minimax. Trong thuật toán này, hướng đi của tất cả các nước cờ có thể được tính toán kỹ trong từng tình huống nhất định, và vị trí được dự đoán cuối cùng là hiệu quả nhất. Sau đó, chúng ta sẽ trả lại giá trị nhỏ nhất hoặc lớn nhất của child cho parent node, tùy thuộc vào việc đó là cờ trắng hoặc đen để di chuyển. (Đó là, chúng tôi cố gắng để giảm thiểu hậu quả hoặc tối đa hóa hiệu quả ở mỗi tình huống.) var minimax = function (depth, game, isMaximisingPlayer) { if (depth === 0) { return -evaluateBoard(game.board()); } var newGameMoves = game.ugly_moves(); if (isMaximisingPlayer) { var bestMove = -9999; for (var i = 0; i < newGameMoves.length; i++) { game.ugly_move(newGameMoves[i]); bestMove = Math.max(bestMove, minimax(depth - 1, game, !isMaximisingPlayer)); game.undo(); } return bestMove; } else { var bestMove = 9999; for (var i = 0; i < newGameMoves.length; i++) { game.ugly_move(newGameMoves[i]); bestMove = Math.min(bestMove, minimax(depth - 1, game, !isMaximisingPlayer)); game.undo(); } return bestMove; } Với minimax, thuật toán của chúng tôi bắt đầu hiểu một số chiến thuật cơ bản của cờ vua: Hiệu quả của thuật toán minimax chủ yếu dựa vào khám phá ra nước cờ tiếp theo đó mà chúng ta có thể đạt được. Đây là điều chúng tôi sẽ cải thiện trong bước tiếp theo. Bước 4: Tinh chỉnh Alpha-betaViệc tinh chỉnh Alpha-beta là một phương pháp tối ưu hóa thuật toán minimax cho phép chúng ta bỏ qua một số hướng trong tất cả hướng đi có thể. Điều này giúp chúng tôi dự đoán hướng bằng minimax hiệu quả, trong khi sử dụng cùng một thuật toán. Việc giảm thiểu alpha-beta dựa trên tình huống mà chúng ta có thể ngừng đưa ra hướng đi nếu chúng ta thấy hướng đi đó dẫn đến một kết quả tồi tệ hơn là bước di chuyển đã tìm ra từ trước. Việc điều chỉnh alpha-beta không ảnh hưởng đến kết quả của thuật toán minimax, nó chỉ làm cho thuật toán nhanh hơn. Thuật toán alpha-beta cũng hiệu quả hơn nếu chúng ta tìm ra những hướng đi dẫn tới các nước cờ tốt đầu tiên. Với alpha-beta, chúng tôi đạt được sự cải thiện đáng kể cho thuật toán minimax, như thấy trong ví dụ sau: Theo link này để thử phiên bản cải tiến alpha-beta của AI cờ vua. Bước 5: Cải thiện chức năng dự đoánChức năng dự đoán ban đầu khá là đơn giản vì chúng chỉ đếm các nước đi được tìm thấy trên bàn cờ. Để cải thiện điều này, chúng tôi thêm vào dự đoán một yếu tố có tính đến vị trí của các quân cờ. Ví dụ, một con mã nằm ở giữa bàn cờ là tốt hơn (vì nó có nhiều lựa chọn hơn và vì vậy hoạt động mạnh hơn) so với một con mã trên mép của bàn cờ. Chúng ta sẽ sử dụng các ô mà từng quân cờ có thể đi được dựa trên nguồn chess-programming-wiki nhờ vậy mà chất lượng AI được cải thiện. Với những cải tiến sau đây, chúng tôi bắt đầu có được một thuật toán chơi cờ với những nước đi “hợp lý”, ít nhất là từ quan điểm của một kỳ thủ bình thường: Kết luậnSức mạnh của ngay cả một thuật toán chơi cờ vua đơn giản cũng có là không tạo ra những sai lầm ngu ngốc. Tuy nhiên, nó vẫn còn thiếu về phần lên chiến lược. Với các phương pháp tôi giới thiệu ở đây, chúng tôi đã có thể lập trình một thuật toán chơi cờ vua có thể chơi cơ bản. Về phần “AI” (các nước đi ngẫu nhiên bị loại bỏ) của thuật toán cuối cùng chỉ có 200 dòng code, điều này khá đơn giản để thực hiện. Bạn có thể kiểm tra phiên bản hoàn chỉnh trên GitHub. Một số cải tiến khác chúng tôi có thể thực hiện cho thuật toán như:
Nếu bạn muốn tìm hiểu thêm, hãy thử xem qua chess programming wiki. Đó là một nguồn thông tin hữu ích để bạn có thể khám phá vượt qua khái niệm cơ bản mà tôi giới thiệu ở bài này. Cảm ơn bạn đã đọc bài viết này! Đừng bỏ lỡ những bài viết hay về Machine Learning:
Xem thêm tuyển dụng kỹ sư AI hot nhất trên TopDev Bài viết gốc được đăng tải tại Freecodecamp |
Bài Viết Liên Quan
Các vòng lặp trong Python là gì?
vòng lặp for được sử dụng khi bạn có một khối mã mà bạn muốn lặp lại một số lần cố định. Vòng lặp for luôn được sử dụng kết hợp với một ...
Làm cách nào để đặt tên động cho một hàm trong JavaScript?
Sử dụng tên động/duy nhất cho các hàm JavaScriptCó những trường hợp bạn sẽ cần sử dụng tên động/duy nhất cho các hàm JavaScriptXem xét tình huống sauĐiều ...
Docker-php
Codefresh có thể làm việc với các dự án Php sử dụng bất kỳ framework phổ biến nào (Laravel, Symphony, CakePHp, v.v. )Dự án php ví dụBạn có thể xem dự án ví ...
Bao nhiêu tiền trong tiếng Anh là gì?
Câu hỏi “How many” & “How much”HOW MANY1 – Cách sử dụng “How many” có nghĩa là “bao nhiêu”, nó được dùng trong câu hỏi hỏi về số lượng của các ...
Định dạng ngày giờ trong Python là gì?
Mô-đun datetime trong Python cung cấp các phương thức để làm việc với các giá trị ngày và giờ. Để sử dụng mô-đun này, trước tiên chúng ta phải nhập nó ...
Tôi có thể thêm HTML vào Python không?
Mô-đun này định nghĩa một lớp dùng làm cơ sở để phân tích cú pháp các tệp văn bản được định dạng bằng HTML (Ngôn ngữ đánh dấu siêu văn bản) và ...
Chúc mừng năm mới 2023
Tết Nguyên đán là một lễ kỷ niệm lớn không chỉ ở Trung Quốc, mà trên toàn thế giới. Việc đánh dấu năm mới âm lịch mang đến pháo hoa, diễu hành, ánh ...
Môi trường thời gian chạy Python trực tuyến
Python 3 Chạyđầu vào stdinnullđầu raCách sử dụng Trình biên dịch/Thông dịch viên Python trực tuyến nàyĐể chạy mã Python trực tuyến, hãy viết mã Python của ...
Mô hình lập trình tuyến tính trong Excel là gì?
Để cho Bộ giải Excel biết ô nào trên trang tính đại diện cho các biến quyết định, ràng buộc và hàm mục tiêu, chúng tôi bấm vào nút Bộ giải trên tab Dữ ...
Tệp python mở dòng mới
Python is the main dynamic language used at Google. This style guide is a list of dos and don’ts for Python programsTo help you format code correctly, we’ve created a settings file for Vim. For ...
Có phải tất cả các chương trình Python đều là mã nguồn mở không?
Python đang bùng nổ và trang Github của nó cũng vậy. Năm nay thật tuyệt vời đối với Python và chúng tôi đã thấy một số dự án mã nguồn mở Python rất mạnh ...
Từ Cần Thơ đến Đà Lạt bao nhiêu km
Bài viết sau đây của Hoa Dalat Travel về Cần Thơ Đi Đà Lạt sẽ cung cấp cho các bạn những thông tin cực kỳ hữu ích. Đặc biệt là những du khách mới đi ...
Python json null không được xác định
Tài liệu này mô tả cách tạo bảng có cột SELECT TO_JSON(STRUCT(1 AS id, [10,20] AS coordinates)) AS pt; 0, chèn dữ liệu JSON vào bảng BigQuery và truy vấn dữ liệu ...
Thách thức css và giải pháp
Vượt qua 835 dự án, trong đó Đông Nam Á có 74 và Việt Nam có 16 dự án, đội GDSC của Trường Đại học Hoa Sen (HSU) đã xuất sắc trở thành một trong ba đội ...
Windows 7 có chạy được python không
Python là ngôn ngữ lập trình chính phát triển nhanh nhất trên thế giới. Bạn muốn tham gia với tư cách là một lập trình viên Python và cài đặt Python trên máy ...
JavaScript là gì và nó được sử dụng như thế nào trong trang web?
JavaScript là một ngôn ngữ lập trình máy tính năng động. Nó nhẹ và được sử dụng phổ biến nhất như một phần của trang web, việc triển khai của nó cho ...
MySQL đóng kết nối
Bảo trì cơ sở dữ liệu hoặc máy chủ thường được thực hiện bởi quản trị viên cơ sở dữ liệu vào ban đêm. Tuy nhiên, những thói quen này đôi khi bị ...
Làm cách nào để thêm không gian trong PHP?
Như những người viết mã HTML đều hiểu, khoảng trắng (dòng trống, tab và các khoảng trắng thừa khác) trong mã của bạn có thể giúp duy trì môi trường lập ...
Giao điểm của n danh sách Python
Trước khi bắt đầu hướng dẫn này, khái niệm giao lộ sẽ được giải thích. Dưới đây, hai được đưa ra làm ví dụDanh sách1 = [4, 7, 23, 9, 6, 11]List2 = [6, 5, ...
KẾT HỢP MySQL
Trong bài viết này, tôi sẽ thảo luận về Chức năng COALESCE của MySQL với các ví dụ. Vui lòng đọc bài viết trước của chúng tôi, nơi chúng tôi đã thảo ...