1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tiểu luận áp dụng học tăng cường để dạy ai chơi rắn săn mồi

31 3 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 31
Dung lượng 438,9 KB

Nội dung

TRƯỜNG ĐẠI HỌC NGUYỄN TẤT THÀNH KHOA CÔNG NGHỆ THÔNG TIN TIỂU LUẬN ÁP DỤNG HỌC TĂNG CƯỜNG ĐỂ DẠY AI CHƠI RẮN SĂN MỒI Giảng viên giảng dạy Sinh viên thực MSSV Chun ngành Mơn học Khóa : TS Đặng Như Phú : Trần Tiến Đạt : 2000005374 : Trí tuệ nhân tạo : Hệ thống thơng minh : 2020 Tp HCM, tháng năm 2023 TRƯỜNG ĐẠI HỌC NGUYỄN TẤT THÀNH KHOA CÔNG NGHỆ THÔNG TIN TIỂU LUẬN ÁP DỤNG HỌC TĂNG CƯỜNG ĐỂ DẠY AI CHƠI RẮN SĂN MỒI Giảng viên hướng dẫn: Sinh viên thực : MSSV : Sinh viên thực : MSSV : Sinh viên thực : MSSV : Ngành/ chun ngành : Mơn học : Khố : TS Đặng Như Phú Mai Gia Hưng 2000004237 Trần Tiến Đạt 2000005374 Lê Nguyễn Tường Vy 2000004366 Trí tuệ nhân tạo Hệ thống thông minh 2020 Tp HCM, tháng năm 2023 LỜI CẢM ƠN Mang kiến thức giáo viên, lời truyền đạt kinh nghiệm giáo viên người trước chúng em xin chân thành cám ơn đội ngũ giáo viên khoa Công Nghệ Thông Tin trường Đại Học Nguyễn Tất Thành truyền đạt cho em kiến thức quý báu cho chúng em suốt học kì vừa qua Nhờ có lời dạy bảo hướng dẫn giáo viên mà em hoàng thành đồ án kết thúc môn Bài đồ án em thực vịng tuần Trong q trình làm có nhiều lúc em cịn bỡ ngỡ gặp nhiều khó khăn thiếu sót hoàng thành đồ án Bài đồ án đơn giản để làm đồ án kết thúc môn e dành nhiều công sức tâm huyết thân để hồng thành Em mong thầy cô thông cảm cho chúng em nhận ý kiến đóng góp q báu từ thầy để em hồn thiện kiến thức thân phát triển tương lai Một lần chúng em xin cám ơn đội ngũ giáo viên trường khoa nhiều Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi TRNG I HC NGUYN TT THNH TRUNG TM KHO THÍ BM-ChT11 KỲ THI KẾT THÚC HỌC PHẦN HỌC KỲ … … NĂM HỌC …… - ….… PHIẾU CHẤM THI TIỂU LUẬN/ĐỒ ÁN Môn thi:Hệ thống thông minh .Lớp học phần:20DTH1C Nhóm sinh viên thực : 1.Mai Gia Hưng .Tham gia đóng góp: 2.Trần Tiến Đạt .Tham gia đóng góp: Lê Nguyễn Tường Vy Tham gia đóng góp: Tham gia đóng góp: .Tham gia đóng góp: .Tham gia đóng góp: .Tham gia đóng góp: .Tham gia đóng góp: Ngày thi: Phòng thi: Đề tài tiểu luận/báo cáo sinh viên : Phần đánh giá giảng viên (căn thang rubrics mơn học): Tiêu chí (theo Điểm tối Đánh giá GV CĐR HP) đa Cấu trúc 1,5 báo cáo Nội dung - Các nội dung thành phần - Lập luận - Kết luận Trình bày TỔNG ĐIỂM Điểm đạt 0.5 10 Giảng viên chấm thi (ký, ghi rõ họ tên) Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi LI M U Trong nhng nm gn õy, trí tuệ nhân tạo (AI) phát triển nhanh chóng ứng dụng nhiều lĩnh vực khác nhau, từ cơng nghiệp đến y tế, giáo dục, tài nhiều lĩnh vực khác Trong đó, lĩnh vực Học tăng cường (Reinforcement Learning - RL) trở nên ngày phổ biến, nhờ khả việc giải tốn tối ưu hóa định môi trường động, không chắn Trong tiểu luận này, chúng em trình bày việc áp dụng Học tăng cường để dạy cho rắn chơi game săn mồi Đây ví dụ minh họa cho việc ứng dụng RL vào thực tiễn, giúp hiểu rõ khái niệm Học tăng cường cách hoạt động Trong tiểu luận này, chúng em trình bày việc thiết kế mơi trường cho trò chơi rắn săn mồi, với cách tiếp cận để xử lý tạo liệu huấn luyện, cách thiết kế mơ hình RL để giúp cho rắn tự học cách di chuyển săn mồi cách thông minh Chúng em đề cập đến số kỹ thuật khác RL, bao gồm giải thuật Q-learning, Deep QNetwork (DQN) nhiều Bài tiểu luận mong muốn giúp độc giả hiểu rõ Học tăng cường cách áp dụng vào thực tiễn Ngoài ra, viết hy vọng cung cấp cho độc giả nhìn tổng quan việc ứng dụng AI vào toán thực tế Chúng em hy vọng viết hữu ớch v thỳ v cho cỏc bn Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi MỤC LỤC LỜI MỞ ĐẦU DANH MỤC BẢNG, HÌNH KÍ HIỆU CÁC CỤM TỪ VIẾT TẮT CHƯƠNG .7 Tổng quan đề tài .7 Tổng quan đề tài Lý chọn đề tài Mục tiêu nghiên cứu Đối tượng nghiên cứu CHƯƠNG .9 Cơ sở lý thuyết Giới thiệu học máy(Machine Learning) Giới thiệu Học sâu (Deep Learning) 10 Học tăng cường(Reinforcement Learning) .11 PyTorch .11 Pygame 12 CHƯƠNG 12 Các nghiên cứu liên quan .12 Các nghiên cứu nước 12 Các nghiên cứu nước 13 Các thuật toán sử dụng báo cáo .14 CHƯƠNG 14 Xây dựng mơ hình 14 Chuẩn bị 14 Quy trình 15 Mô hình 16 Tính tốn giá trị Q 17 Lựa chọn hành động tối ưu 18 Huấn luyện cập nhật mơ hình .18 CHƯƠNG 19 Các bước thực .19 Thiết lập môi trường game Snake 20 Khởi tạo mơ hình Neural Network thuật toán Q-learning 24 Huấn luyện mơ hình 25 Kiểm tra đánh giá mơ hình 26 CHƯƠNG 28 Kết luận hướng phát triển .28 Kết luận 28 Hướng phát triển .28 DANH MỤC TÀI LIỆU THAM KHẢO .29 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi DANH MC BNG, HèNH Hỡnh 1.hc máy(Machine Learning)………………………………………………… Hình2 Học sâu (Deep Learning)………………………………………………………10 Hình3 Học tng cng11 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi K HIU CC CM T VIẾT TẮT Chữ viết tắt AI RL DQN Ý nghĩa Artificial Intelligence Reinforcement Learning Deep Q-Network Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi CHNG Tổng quan đề tài Tổng quan đề tài Bài tiểu luận tập trung vào ứng dụng kỹ thuật Học tăng cường (Reinforcement Learning) để dạy cho trí tuệ nhân tạo (Artificial Intelligence) chơi trị chơi rắn săn mồi (Snake game) Học tăng cường phương pháp học máy (Machine Learning) mà tác nhân (agent) học cách tương tác với môi trường (environment) để đạt mục tiêu cụ thể (objective) Trong trường hợp này, mục tiêu trí tuệ nhân tạo phải điều khiển rắn di chuyển ăn mồi cách hiệu quả, tránh va chạm với tường Bài tiểu luận giới thiệu mơ hình học tăng cường áp dụng cho trò chơi rắn săn mồi, bao gồm thành phần định hành động, nhớ chiến lược học tối ưu Ngoài ra, tiểu luận giới thiệu số kỹ thuật thủ thuật để tăng tính hiệu trí tuệ nhân tạo trò chơi rắn săn mồi Với kiến thức học tăng cường kinh nghiệm trò chơi rắn săn mồi, đồng thời sử dụng thư viện học máy ngơn ngữ lập trình phổ biến Python, tiểu luận trình bày chi tiết trình áp dụng Học tăng cường để dạy AI chơi rắn săn mồi, đồng thời đánh giá hiệu kỹ thuật Lý chọn đề tài Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Bi tiu lun chn ti ỏp dụng Học tăng cường để dạy AI chơi rắn săn mồi ví dụ minh họa cho việc áp dụng Học tăng cường thực tế Học tăng cường phương pháp học máy quan trọng ứng dụng rộng rãi nhiều lĩnh vực trò chơi điện tử, robot tự động, tự động hóa sản xuất, tài chính, y tế, vv Ngồi ra, trò chơi rắn săn mồi trò chơi phổ biến thú vị, chơi rộng rãi nhiều tảng nhiều người yêu thích Việc áp dụng Học tăng cường để dạy cho trí tuệ nhân tạo chơi trị chơi khơng thú vị mà giúp ta hiểu rõ cách thức tiến trình mà hệ thống Học tăng cường hoạt động Với kiến thức kinh nghiệm Học tăng cường thư viện học máy ngôn ngữ lập trình phổ biến, tiểu luận trình bày chi tiết trình áp dụng Học tăng cường để dạy cho trí tuệ nhân tạo chơi trị chơi rắn săn mồi, từ đánh giá hiệu kỹ thuật Mục tiêu nghiên cứu Nghiên cứu tập trung vào sử dụng mơ hình ResNet để phân loại đối tượng ảnh với độ xác cao thực thí nghiệm để đánh giá hiệu mơ hình Ngồi ra, mục tiêu nghiên cứu tìm hiểu sâu cấu trúc cách hoạt động mơ hình ResNet xử lý ảnh Đối tượng nghiên cứu Đối tượng nghiên cứu tiểu luận trí tuệ nhân tạo áp dụng vào trò chơi rắn săn mồi Cụ thể, đối tượng nghiên cứu phương pháp kỹ thuật học tăng cường áp dụng để dạy cho trí tuệ nhân tạo chơi trị chơi rắn sn mi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi tớnh bng s im c ghi rắn ăn thức ăn Nếu rắn đâm vào tường đâm vào thể mình, giá trị phần thưởng âm Sau tính tốn giá trị phần thưởng, sử dụng thuật toán Q-learning để học cách đưa hành động tối ưu trò chơi Rắn Trong Q-learning, tính tốn giá trị Q cho cặp trạng thái hành động, sau cập nhật giá trị Q sau lần chơi Việc cập nhật giá trị Q thực cách sử dụng công thức sau: Trong Q(s, a) Q-value thực action a state s; r(s, a) reward nhận được; s' state γ hệ số discount, đảm bảo "xa" đích Q-value nhỏ Quy trình Để xây dựng mơ hình học tăng cường (reinforcement learning), cần: + Xây dựng môi trường game: viết này, sử dụng Pygame để tạo môi trường chơi rắn + Xây dựng mơ hình Q-network: mạng nơ-ron nhân tạo (neural network) sử dụng để ước tính giá trị Q hành động trạng thái xác định Trong viết này, sử dụng mạng nơ-ron tuyến tính đơn giản với hai lớp tuyến tính + Xác định siêu tham số hàm mát: Trong viết này, sử dụng giảm dần tốc độ học (learning rate) hàm mát (MSE loss) + Xác định thuật toán huấn luyện: Trong viết này, sử dụng thuật toỏn Qlearning hun luyn mụ hỡnh 15 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi + Huấn luyện mơ hình: Chúng ta sử dụng thuật tốn Q-learning để huấn luyện mơ hình, cách lặp lại việc chơi game cập nhật giá trị Q dựa kinh nghiệm chơi game Mơ hình Chuẩn bị đầu vào Thiết lập mơ hình Thiết lập tối ưu hóa Huấn luyện mơ hình Kiểm tra sử dụng mơ hình Đây bước mơ hình áp dụng thuật tốn tăng cường vào việc huấn luyện AI chơi rắn săn mồi:  Chuẩn bị liệu đầu vào: thông tin trạng thái trị chơi, bao gồm vị trí rắn, thc n v cỏc vt cn 16 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Thiết lập mơ hình: bao gồm định nghĩa mơ hình mạng nơ-ron thông số liên quan số lượng lớp, kích thước đầu vào/đầu ra, hệ số học tập  Thiết lập tối ưu hóa: để mơ hình học cải thiện sau lần chơi, cần thiết lập tối ưu hóa, bao gồm hàm mát thuật toán tối ưu  Huấn luyện mơ hình: cung cấp liệu đầu vào đầu cho mơ hình, để học cách dự đoán phản hồi tối ưu trạng thái trị chơi  Kiểm tra sử dụng mơ hình: sau huấn luyện xong, ta sử dụng mơ hình để chơi trị chơi kiểm tra kết quả, lưu trữ sử dụng cho mục đích khác Tính tốn giá trị Q Sau có liệu cho mơ hình, cần tính tốn giá trị Q (Qvalue) cho hành động game rắn Giá trị Q tính dựa cơng thức Bellman, cơng thức quan trọng lý thuyết học tăng cường Cụ thể, giá trị Q cho trạng thái hành động tính tổng giá trị phần thưởng giá trị tối đa Q cho trạng thái tiếp theo, điều chỉnh hệ số chiết khấu γ Để tính tốn giá trị Q cho trạng thái hành động, cần cập nhật bảng Q sau lượt chơi Trong trình đào tạo, sử dụng giá trị Q để cập nhật bảng Q, từ giúp AI học cách đưa hành động tối ưu trạng thái Để thực tính tốn giá trị Q, sử dụng thuật toán Q-learning Thuật toán sử dụng bảng Q để lưu trữ giá trị Q cho trạng thái hành động Mỗi lần AI chơi game, cập nhật bảng Q dựa công thức Bellman, sau lượt chơi, AI đào tạo lại liệu để cải thin kh nng chi ca nú 17 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Túm lại, tính tốn giá trị Q bước quan trọng việc xây dựng mơ hình dạy AI chơi game rắn thuật toán tăng cường với PyTorch Pygame Việc tính tốn giá trị Q giúp AI học cách đưa hành động tối ưu trạng thái, từ cải thiện khả chơi Lựa chọn hành động tối ưu Sau có liệu cho mơ hình, cần tính tốn giá trị Q (Qvalue) cho hành động game rắn Giá trị Q tính dựa công thức Bellman, công thức quan trọng lý thuyết học tăng cường Cụ thể, giá trị Q cho trạng thái hành động tính tổng giá trị phần thưởng giá trị tối đa Q cho trạng thái tiếp theo, điều chỉnh hệ số chiết khấu γ Để tính tốn giá trị Q cho trạng thái hành động, cần cập nhật bảng Q sau lượt chơi Trong trình đào tạo, sử dụng giá trị Q để cập nhật bảng Q, từ giúp AI học cách đưa hành động tối ưu trạng thái Để thực tính tốn giá trị Q, sử dụng thuật toán Q-learning Thuật toán sử dụng bảng Q để lưu trữ giá trị Q cho trạng thái hành động Mỗi lần AI chơi game, cập nhật bảng Q dựa công thức Bellman, sau lượt chơi, AI đào tạo lại liệu để cải thiện khả chơi Tóm lại, tính tốn giá trị Q bước quan trọng việc xây dựng mơ hình dạy AI chơi game rắn thuật tốn tăng cường với PyTorch Pygame Việc tính tốn giá trị Q giúp AI học cách đưa hành động tối ưu trạng thái, từ cải thiện khả chơi Huấn luyện cập nhật mơ hình Sau thiết lập mơ hình neural network tính tốn giá trị Q, ta bắt đầu huấn luyện mơ hình 18 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi u tiờn, chỳng ta cn to trạng thái ban đầu trị chơi Sau đó, mơ hình chọn hành động dựa chiến lược mà học từ q trình tính tốn giá trị Q Hành động thực trò chơi trả trạng thái điểm thưởng tương ứng Tiếp theo, mơ hình tính tốn lại giá trị Q cho trạng thái cũ hành động thực hiện, dựa công thức Q-learning Giá trị Q cập nhật vào nhớ dài hạn , từ mơ hình học cách ưu tiên hành động dẫn đến trạng thái tốt đạt điểm số cao Tiếp tục lặp lại trình trò chơi kết thúc đạt số lần lặp huấn luyện cần thiết Trong q trình huấn luyện, mơ hình dần học cách chơi rắn thơng minh đạt điểm số cao Sau huấn luyện xong, ta lưu lại mơ hình để sử dụng sau thử nghiệm trị chơi khác Ta tinh chỉnh tham số mơ hình để cải thiện hiệu suất 19 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi CHNG Cỏc bc thc hin Thiết lập môi trường game Snake Để thiết lập môi trường game Snake, cần cài đặt thư viện Pygame Sau đó, tạo class SnakeGame để tạo môi trường game Class chứa phương thức để di chuyển rắn, tạo thức ăn, kiểm tra xem rắn chạm vào tường hay chạm vào chưa Class chứa phương thức để lấy trạng thái môi trường game xử lý hành động chọn mơ hình học máy Cuối cùng, tạo hàm main để chạy trò chơi Snake hiển thị kết - Nhập thư viện cần thiết + pygame: thư viện hỗ trợ tạo game Python + random: thư viện sinh số ngẫu nhiên + Enum: lớp liệt kê hỗ trợ định nghĩa số sử dụng chương trình + namedtuple: lớp cho phép định nghĩa kiểu liệu (tên namedtuple) giống lớp tuple thuộc tính truy cập tên Các namedtuple thường sử dụng để tạo ghi nhỏ, dễ đọc dễ sử dụng + numpy: thư viện tính tốn khoa học Python - Khởi tạo màng hình chơi: def init (self, w=640, h=480):         self.w = w         self.h = h         # khởi tạo hiển thị         self.display = pygame.display.set_mode((self.w, self.h))         pygame.display.set_caption('Snake')         self.clock = pygame.time.Clock()   self.reset() 20 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi init () : Hàm sử dụng để khởi tạo thuộc tính trị chơi chiều rộng chiều cao hình, điểm số, mảng rắn, thức ăn, đồng hồ, v.v - Bắt đầu trạng thái trò chơi def reset(self):         # bắt đầu trạng thái trò chơi         self.direction = Direction.RIGHT         self.head = Point(self.w/2, self.h/2)         self.snake = [self.head,                       Point(self.head.x-BLOCK_SIZE, self.head.y),                       Point(self.head.x-(2*BLOCK_SIZE), self.head.y)]         self.score =         self.food = None         self._place_food()         self.frame_iteration = reset() : Hàm sử dụng để khởi động lại trò chơi Nó thiết lập lại giá trị ban đầu biến, điểm số, định hướng rắn, vị trí rắn, thức ăn, v.v… - Tạo thức ăn  def _place_food(self):         x = random.randint(0, (self.w-BLOCK_SIZE )//BLOCK_SIZE )*BLOCK_SIZE         y = random.randint(0, (self.h-BLOCK_SIZE )//BLOCK_SIZE )*BLOCK_SIZE         self.food = Point(x, y)         if self.food in self.snake:             self._place_food() _place_food() :hàm sử dụng để đặt thức ăn cho rắn Trước đặt thức ăn, hàm sinh ngẫu nhiên tọa độ x, y để đặt thức ăn Tuy nhiên, thức ăn đặt vị trí có đường rắn, hàm gọi đệ quy để đặt lại thức ăn - Bước chơi trò chơi rắn def play_step(self, action):         self.frame_iteration +=         # thu thập đầu vào người dùng         for event in pygame.event.get():             if event.type == pygame.QUIT:                 pygame.quit()                 quit()             # di chuyển         self._move(action) # cập nhật đầu         self.snake.insert(0, self.head)               # kiểm tra trò chơi kết thúc         reward = game_over = False 21 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi if self.is_collision() or self.frame_iteration > 100*len(self.snake):             game_over = True             reward = -10             return reward, game_over, self.score         # đặt thức ăn cần di chuyển         if self.head == self.food:             self.score +=             reward = 10             self._place_food()         else:             self.snake.pop()         # cập nhật giao diện người dùng đồng hồ         self._update_ui()         self.clock.tick(SPEED)         # quay lại trò chơi ghi điểm         return reward, game_over, self.score play_step() : Hàm sử dụng để chơi lượt trò chơi, dựa hành động đưa mơ hình trí tuệ nhân tạo Nó di chuyển rắn đặt lại thức ăn cần thiết, sau trả lại giá trị thưởng, trạng thái kết thúc điểm số.Cụ thể: + Bước 1: Lấy input từ người dùng Trong trường hợp này, ta không sử dụng input từ người dùng mà sử dụng model để dự đoán hành động + Bước 2: Di chuyển rắn Hướng di chuyển xác định cách thay đổi thuộc tính self.direction Vị trí đầu rắn cập nhật theo hướng di chuyển Thêm đầu rắn vào danh sách điểm rắn + Bước 3: Kiểm tra xem trò chơi kết thúc hay chưa Nếu rắn chạm vào tường chạm vào thân trị chơi kết thúc Trong trường hợp này, ta giới hạn số bước tối đa mà rắn thực (tức độ dài rắn nhân 100) Nếu trò chơi kết thúc, ta trả reward -10 game_over True + Bước 4: Nếu đầu rắn ăn thức ăn, ta tăng điểm lên 1, đặt lại vị trí thức ăn trả reward 10 Nếu không, ta loại bỏ phần đuôi rắn + Bước 5: Cập nhật giao diện người dùng đồng hồ + Bước 6: Trả reward, game_over số điểm người chơi - Va chạm  def is_collision(self, pt=None):         if pt is None:             pt = self.head         # ranh giới lt truy cp 22 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi if pt.x > self.w - BLOCK_SIZE or pt.x < or pt.y > self.h - BLOCK_SIZE or pt.y < 0:             return True         # đánh         if pt in self.snake[1:]:             return True         return False is_collision() : Hàm sử dụng để kiểm tra xem rắn chạm vào tường hay chưa - Cập nhật giao diện     def _update_ui(self):         self.display.fill(BLACK)         for pt in self.snake:             pygame.draw.rect(self.display, BLUE1, pygame.Rect(pt.x, pt.y, BLOCK_SIZE, BLOCK_SIZE))             pygame.draw.rect(self.display, BLUE2, pygame.Rect(pt.x+4, pt.y+4, 12, 12))         pygame.draw.rect(self.display, RED, pygame.Rect(self.food.x, self.food.y, BLOCK_SIZE, BLOCK_SIZE))         text = font.render("Score: " + str(self.score), True, WHITE)         self.display.blit(text, [0, 0])         pygame.display.flip() _update_ui() : Hàm sử dụng để cập nhật giao diện người dùng (hiển thị đối tượng hình) điểm số  - Cài đặt hướng di chuyển cho rắn def _move(self, action):         # [thẳng, phải, trái]         clock_wise = [Direction.RIGHT, Direction.DOWN, Direction.LEFT, Direction.UP]         idx = clock_wise.index(self.direction)         if np.array_equal(action, [1, 0, 0]):             new_dir = clock_wise[idx] # không thay đổi         elif np.array_equal(action, [0, 1, 0]):             next_idx = (idx + 1) %             new_dir = clock_wise[next_idx] # rẽ phải r -> d -> l -> u         else: # [0, 0, 1]             next_idx = (idx - 1) %             new_dir = clock_wise[next_idx] # rẽ trái r -> u -> l -> d         self.direction = new_dir         x = self.head.x         y = self.head.y         if self.direction == Direction.RIGHT:             x += BLOCK_SIZE         elif self.direction == Direction.LEFT:             x -= BLOCK_SIZE elif self.direction == Direction.DOWN: 23 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi y += BLOCK_SIZE         elif self.direction == Direction.UP:             y -= BLOCK_SIZE         self.head = Point(x, y) _move() : Hàm sử dụng để di chuyển rắn dựa hành động đưa mơ hình trí tuệ nhân tạo Nó cập nhật hướng di chuyển rắn di chuyển đầu rắn đến vị trí hình Trong hàm _move, mảng clock_wise chứa hướng di chuyển theo chiều kim đồng hồ khởi tạo Hàm lấy hướng di chuyển rắn tìm vị trí clock_wise Nếu hành động chọn [1, 0, 0] rắn di chuyển thẳng mà không thay đổi hướng Nếu hành động chọn [0, 1, 0] rắn rẽ phải theo thứ tự hướng di chuyển clock_wise (phải -> xuống -> trái -> lên) Cuối cùng, hành động chọn [0, 0, 1] rắn rẽ trái theo thứ tự hướng di chuyển clock_wise (phải -> lên -> trái -> xuống) Sau đó, hướng lưu trữ biến new_dir Tiếp theo, hàm di chuyển đầu rắn theo hướng cập nhật giá trị self.head Point(x, y) Khởi tạo mơ hình Neural Network thuật tốn Q-learning -Mơ hình xây dựng với lớp kế thừa từ nn.Module, có lớp tuyến tính (Linear) với số chiều lớp định nghĩa input_size, hidden_size output_size Hàm forward mơ hình định nghĩa để thực truyền tiến (feedforward) liệu qua lớp trả đầu Lớp thứ sử dụng hàm kích hoạt ReLU để tính tốn giá trị đầu truyền tiếp đến lớp thứ hai Lớp thứ hai tính tốn giá trị đầu cuối mơ hình Ngồi ra, mơ hình cịn có hàm lưu trữ (save) để lưu trữ trọng số mơ hình vào tệp tin có tên "model.pth" Hàm sử dụng module os để kiểm tra tạo thư mục "model" khơng tồn class Linear_QNet(nn.Module):     def init (self, input_size, hidden_size, output_size):         super(). init ()         self.linear1 = nn.Linear(input_size, hidden_size)         self.linear2 = nn.Linear(hidden_size, output_size) 24 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi def forward(self, x):       x = F.relu(self.linear1(x))         x = self.linear2(x)         return x     def save(self, file_name='model.pth'):         model_folder_path = './model'         if not os.path.exists(model_folder_path):             os.makedirs(model_folder_path)         file_name = os.path.join(model_folder_path, file_name)         torch.save(self.state_dict(), file_name) Huấn luyện mơ hình Class QTrainer sử dụng để huấn luyện mơ hình học tăng cường Trong đó, mơ hình học tăng cường đưa vào để xác định hành động tối ưu tình định Các tham số cần định để khởi tạo QTrainer bao gồm mơ hình học tăng cường, tỷ lệ học (lr) hệ số chiết khấu (gamma) Phương thức train_step() sử dụng để thực bước huấn luyện trình học tăng cường Trước bắt đầu, trạng thái, hành động, phần thưởng, trạng thái trạng thái kết thúc chuyển đổi sang định dạng tensor PyTorch Bước tính tốn giá trị Q dự đốn mơ hình với trạng thái Sau đó, ta tạo tensor target với giá trị chép pred ban đầu Tiếp theo, với trạng thái tiếp theo, ta tính tốn giá trị Q sử dụng công thức Q_new = r + y * max(next_predicted Q value) trạng thái trạng thái kết thúc Ở đây, r phần thưởng y hệ số chiết khấu Sau đó, giá trị gán vào tensor target Cuối cùng, ta tính tốn sai số cách sử dụng hàm MSELoss PyTorch giá trị dự đoán pred giá trị mục tiêu target Tiếp theo, ta sử dụng thuật tốn lan truyền ngược để tính tốn đạo hàm hàm mát tham số mụ hỡnh Cui 25 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi cựng, ta s dng tối ưu Adam để cập nhật tham số mơ hình đưa đến trạng thái trình huấn luyện class QTrainer:     def init (self, model, lr, gamma):         self.lr = lr         self.gamma = gamma         self.model = model         self.optimizer = optim.Adam(model.parameters(), lr=self.lr)         self.criterion = nn.MSELoss()     def train_step(self, state, action, reward, next_state, done):         state = torch.tensor(state, dtype=torch.float)         next_state = torch.tensor(next_state, dtype=torch.float)         action = torch.tensor(action, dtype=torch.long)         reward = torch.tensor(reward, dtype=torch.float)         # (n, x)         if len(state.shape) == 1:             # (1, x)             state = torch.unsqueeze(state, 0)             next_state = torch.unsqueeze(next_state, 0)             action = torch.unsqueeze(action, 0)             reward = torch.unsqueeze(reward, 0)             done = (done, )         # 1: giá trị Q dự đoán với trạng thái         pred = self.model(state)         target = pred.clone()         for idx in range(len(done)):             Q_new = reward[idx]             if not done[idx]:                 Q_new = reward[idx] + self.gamma * torch.max(self.model(next_state[idx]))             target[idx][torch.argmax(action[idx]).item()] = Q_new         # 2: Q_new = r + y * max(next_predicted Q value) -> làm điều không thực         # pred.clone()         # preds[argmax(action)] = Q_new         self.optimizer.zero_grad()         loss = self.criterion(target, pred)         loss.backward()         self.optimizer.step() Kiểm tra đánh giá mơ hình import matplotlib.pyplot as plt from IPython import display plt.ion() def plot(scores, mean_scores): display.clear_output(wait=True) display.display(plt.gcf()) 26 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi   plt.clf()     plt.title('Đang huấn luyện ')     plt.xlabel('Số lần chơi')     plt.ylabel('Điểm')     plt.plot(scores)     plt.plot(mean_scores)     plt.ylim(ymin=0)     plt.text(len(scores)-1, scores[-1], str(scores[-1]))     plt.text(len(mean_scores)-1, mean_scores[-1], str(mean_scores[-1]))     plt.show(block=False)     plt.pause(.1) Hàm plot sử dụng để vẽ biểu đồ điểm số ván chơi trình huấn luyện biểu đồ điểm số trung bình Cụ thể, hàm nhận vào hai đối số scores mean_scores Biến scores lưu trữ điểm số ván chơi, mean_scores lưu trữ giá trị trung bình điểm số số ván chơi gần Hàm plot xóa hiển thị đầu ra, sau vẽ biểu đồ với trục x số lần chơi trục y điểm số Đồ thị có hai đường: đường màu xanh thể điểm số ván chơi, đường lại đường màu cam thể giá trị trung bình điểm số số ván chơi gần Hàm plot hiển thị điểm số ván chơi điểm số trung bình cuối đồ thị Sau đó, hàm tiếp tục hiển thị đồ thị mà khơng chặn trình duyệt, tạm dừng chương trình 0,1 giây để tránh hiển th th quỏ nhanh 27 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi CHNG Kết luận hướng phát triển Kết luận Trong tiểu luận này, chúng em trình bày việc sử dụng học tăng cường để giúp cho rắn chơi trị chơi săn mồi thơng minh Điều giúp hiểu rõ khái niệm học tăng cường cách hoạt động Chúng em giải thích cách thiết kế môi trường, tạo liệu huấn luyện thiết kế mơ hình học tăng cường PyTorch Pygame Bên cạnh đó, chúng em đề cập đến số kỹ thuật học tăng cường khác nhau, bao gồm giải thuật Q-learning, Deep Q-Network (DQN) nhiều Việc áp dụng học tăng cường vào thực tiễn ngày phổ biến, giúp cho việc giải tốn tối ưu hóa định môi trường động, không chắn trở nên hiệu Với phát triển trí tuệ nhân tạo, học tăng cường ứng dụng nhiều lĩnh vực khác nhau, từ công nghiệp đến y tế, giáo dục, tài nhiều lĩnh vực khác Hướng phát triển Chúng em nghĩ số hướng phát triển đơn giản là: + Tăng cường tính tương tác rắn với môi trường: Để tăng khả chơi game rắn, ta tăng cường tính tương tác với mơi trường cỏch thit k 28 Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi Tiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằiTiỏằu.luỏưn.Ăp.dỏằƠng.hỏằãc.tng.cặỏằãng.ỏằ.dỏĂy.ai.chặĂi.rỏn.sn.mỏằi

Ngày đăng: 02/11/2023, 00:37

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w