Source: Wikipedia - Cách một cá nhân thông thường chơi Tetris: • Đảm bảo độ cao hiện tại là tối thiểu: Khi các viên gạch Tetris chạm đến độ cao tối đa, thì người chơi sẽ thua cuộc, nên
Trang 1Thành phố Hồ Chí Minh, tháng 6 năm 2021
🙡🕮🙣
ĐỒ ÁN 1
Đề tài: Huấn luyện AI chơi game Tetris
Giáo viên hướng dẫn: Huỳnh Tuấn Anh
Sinh viên thực hiện: Dư Chế Anh - 18520445
Thi Thanh Chương -18520539
Trang 33
NHẬN XÉT
Trang 4
4
LỜI CẢM ƠN
Cảm ơn thầy Huỳnh Tuấn Anh vì đã cung cấp cho nhóm chúng em nói riêng
và các sinh viên trong lớp nói chung những đề tài đồ án thú vị ạ, nhóm chúng
em đã có những kiến thức mới và kinh nghiệm làm việc nhóm thú vị
Trong quá trình làm việc, khó tránh được các sai sót từ nhỏ đến lớn, mong
các thầy cô quan tâm và góp ý tận tình giúp nhóm chúng em có thể phát triển
hơn ạ
Cảm ơn các thầy cô ạ!
Trang 55
Contents
GIỚI THIỆU 6
1 Mục đích tài liệu: 6
2 Đề tài: 6
3 Vấn đề: 6
4 Hướng giải quyết: 6
5 Mục tiêu: 6
KẾ HOẠCH VÀ PHÂN TÍCH 7
1 Kế hoạch 7
2 Phân tích 7
Thực thi 10
1 Tetris: 10
2 Bot: 10
3 AI 11
NGHIÊN CỨU 12
Case #1: Ai cơ bản train ở 1 seed 13
Case #2: AI cơ bản train ở nhiều seed 14
Case #3: AI với fitness mới và train ở 1 seed 15
Case #4: AI tự train vs AI tự train 17
KẾT LUẬN 19
THAM KHẢO 20
Records 21
Record1 21
Record 2 21
Record 3 22
Record 4 23
Record 5 23
Trang 66
GIỚI THIỆU
1 Mục đích tài liệu:
Tài liệu này được xây dựng với mục đích giới thiệu đề tài, ghi nhận và phân
tích quá trình tiếp nhận và giải quyết vấn đề, từ ban đầu cho đến khi hoàn thành
đồ án
2 Đề tài:
Huấn luyện AI chơi game Tetris
3 Vấn đề:
Tetris mà một tựa game cần chú ý nhiều input
Các sinh viên thực hiện đề tài không có kinh nghiệm với học máy hoặc trí tuệ
nhân tạo
4 Hướng giải quyết:
Sử dụng ngôn ngữ lập trình Python cho dự án, vì số lượng tài liệu và hướng
Trang 77
KẾ HOẠCH VÀ PHÂN TÍCH
1 Kế hoạch
Nghiên cứu Nghiên cứu về Python và ứng dụng trong AI
Thực thi Tạo ra bot chơi Tetris, bot sẽ được feed thông số đầu vào
Huấn luyện Biến bot thành AI, bot sẽ tự huấn luyện để lấy thông số đầu vào
2 Phân tích
- Tetris: Mục tiêu của trò chơi là di chuyển các khối gạch đang rơi từ từ xuống
trong kích thước hình chữ nhật 20 hàng x 10 cột (trên màn hình) Chỗ nào có
gạch rồi thì không di chuyển được tới vị trí đó Người chơi xếp những khối hình
sao cho khối hình lấp đầy 1 hàng ngang để ghi điểm và hàng ngang ấy sẽ biến
mất (Source: Wikipedia)
- Cách một cá nhân thông thường chơi Tetris:
• Đảm bảo độ cao hiện tại là tối thiểu: Khi các viên gạch Tetris chạm
đến độ cao tối đa, thì người chơi sẽ thua cuộc, nên ta phải đảm bào được khi chọn vị trí đặt gạch ta sẽ tối ưu độ cao của chúng
• Đảm bảo người chơi clear được số hàng nhiều nhất (ghi điểm nhiều nhất): Người chơi sẽ ghi điểm trong game bằng các clear các hàng, nên điểm sẽ là cách chúng ta độ hiệu quả của AI
Trang 88
• Đảm bảo số lượng lỗ giữa cột là nhỏ nhất: Các lỗ giữa hàng sẽ gây
cản trở cho việc ghi điểm và clear nhiều hàng một lúc nên chúng ta phải đảm bảo cho việc trên
• Đảm bảo các cột có độ lệch không lớn: Nếu độ lệch giữa các cột gần
nhau lớn thì chúng sẽ giới hạn số lượng gạch có thể được đặt trên chúng
nên cần phải tối ưu thông số này
Bumpiness = |3-5| + |5-6| + |6-5| + |5-4| + |4-5| = 6
Trang 99
- AI phù hợp: Sau nhiều lần nghiên cứu tài liệu và video hướng dẫn thì nhóm
đã đi đến quyết định chọn Genetic Algorithm (thuật toán di truyền) để sử dụng
cho hệ thống
• Giới thiệu về thuật toán di truyền: Là một mô hình mô phỏng thuyết
chọn lọc tự nhiên của Darwin
• Quy trình thực thi thuật toán di truyền:
1 Tạo ra một quần thể với số lượng các cá thể cho trước mang thông số ngẫu nhiên
2 Tính fitness cho từng cá thể trong quần thể (fitness là hàm tính độ phù hợp cho hệ thống, như tetris thì fitness sẽ trả về số điểm hoặc số line đã clear)
3 Chọn ra các các thể có fitness cao nhất để
đi lai tạo
4 Các cá thể lai tạo sẽ tạo ra các cá thể mới,
có thông số ngẫu nhiên (có thể lớn hoặc nhỏ hơn cá thể bố và mẹ)
5 Các cá thể vừa được lai tạo có tỉ lệ nhỏ bị đột biến, khi cá thể bị đột biến, thông số của cá thể sẽ có sự thay đổi
6 Sau đó chúng ta tổng hợp các cá thể tốt nhất của đời này và các cá thể mới được lai tạo, tổng hợp lại để tạo thành một quần thể mới
7 Lặp lại quá trình cho đến khi nào đạt nhu cầu của người lập trình, ta thu kết quả và lấy cá thể có kết quả tốt nhất
Trang 1010
Thực thi
1 Tetris:
Vì đây là đồ án huấn luyện AI chơi game tetris nên nhóm
bỏ qua bước phát triển game tetris bằng cách clone một
tetris repo trên github về và phát triển tính năng AI thêm
vào repo trên (info)
Repo có chức năng cơ bản, đọc dễ hiểu và có khả năng
chỉnh sửa cao
2 Bot:
Trong quá trình phân tích nhóm đã đưa ra các thông số cần đảm bảo với một
người chơi tetris thông thường, đó là: Độ cao hiện tại, số dòng clear, số lượng
lỗ giữa các cột, độ lệch giữa các cột Để chơi tetris người chơi phải cân nhắc
các thông số trên (ở tốc độ của con người) để đưa ra quyết định hợp lý, máy
tính cũng tương tự, ta sẽ đưa các thông số vào cho AI để chúng quyết định
xem nên tiến hành bước gì tiếp theo
Nhưng chỉ các thông số trên thôi thì là chưa đủ, chúng đều quan trọng, nhưng
đối với người chơi thì clear dòng sẽ quan trọng hơn thảy và người chơi sẽ quan
trọng việc hạn chế lỗ giữa cột hơn là đảm bảo độ cao hiện tại Vì vậy để đưa
ra lựa chọn chính xác, ta phải cho mỗi thông số một cân nặng (weight)
Từ đó ta đưa ra cách tính điểm:
a=Aggregate Height b=Lines Clear c=Holes d=Bumpiness score = a*w1 + b*w2 + c*w3 + d*w4
Với w1 – w4 là các weight tương ứng
với các thông số trên Và khi xử lý, ta
Trang 1111
Sau khi tạo nên các hàm tính toán cần thiết, ta chỉ việc cho chúng 1 bộ weights
phù hợp May mắn thay có một dự án có bộ weights sẵn cho các thông số
tương tự nên ta có thể áp dụng chúng vào bot để cho bot hoạt động được
Weights= [-0.510066, 0.760666, -0.35663, -0.184483] (source)
3 AI
Đầu tiên nhóm tạo một class chứa các hàm của thuật toán tiến hóa
Trong đó hàm tính fitness của một quần thể sẽ trả về điểm số của từng cá thể
trong một quần thể với một số lượng gạch giới hạn nào đó (piecelimit)
Sau đó chúng ta áp dụng mô hình thuật toán tiến hóa để dự án có thể tự đưa
ra weights phù hợp
Trang 1212
NGHIÊN CỨU
Lưu ý:
• Các kết quả nghiên cứu sau được tiến hành với fastmode=True (các viên
gạch được rơi ngay) và sẽ không hiển thị GUI để đảm bảo độ chính xác của kết quả (hiển thị GUI sẽ ảnh hưởng đến kết quả tùy theo sức mạnh của phần cứng)
• Weight được lấy từ ví dụ trên mạng trong bài đã được huấn luyện rất
nhiều và có thể chơi tetris liên tục 2 tuần liền, và clear hơn 2 triệu lines
mà vẫn không có dấu hiệu thua cuộc, nên nhóm thấy đây sẽ là một mốc
so sánh tốt
• Kiểm tra file readme.md trên github repo nếu muốn tiến hành thực thi lại các thí nghiệm sau
Để đánh giá kết quả nghiên cứu, chúng ta sẽ so sánh kết quả khi dùng weight
huấn luyện được với dùng weight của ví dụ trên mạng
Weight trên mạng ta sẽ gọi là demo_weight =
[-0.510066, 0.760666, -0.35663, -0.184483]
Weight ta train được sẽ gọi là trained_weight
Trang 1313
Case #1: Ai cơ bản train ở 1 seed Đặc điểm:
▪ Các viên gạch và thứ tự gạch xuất hiện luôn là giống nhau (dùng seed)
▪ AI được train với seed=1
Fitness được đo bằng số điểm đạt được
Kết quả huấn luyện ( record1 )
Cá
thể
SL Đời
SL lai
SL gạch
Max fitness Weight của cá thể tốt nhất
Train fitness/demo fitness
Phân tích case#1:
- AI của chúng ta được huấn luyện
qua 5 đời, mỗi đời gồm 5 cá thể, với
giới hạn gạch là 100
- Ở 1.1, các thông số của được set
tương tự như lúc AI được huấn
luyện, nên điểm số cho ra đạt được
93% so với demo_weight
- Ở 1.2, vì số lượng gạch tăng lên
nhiều hơn so với lúc huấn luyện nên
- Cần có thêm nhiều cá thể ở mỗi
đời, thêm nhiều đời cho quần thể
- Huấn luyện với seed nhất định sẽ tối ưu thời gian (nếu ta kiểm thử ở seed đó), nhưng khả năng cao sẽ phát sinh vấn đề khi sử dụng AI trong thực tiễn
Trang 1414
Case #2: AI cơ bản train ở nhiều seed Đặc điểm:
▪ Các viên gạch và thứ tự gạch xuất hiện luôn là ngẫu nhiên
▪ AI được train với seed=random
Fitness được đo bằng số điểm đạt được
Kết quả huấn luyện ( record2 )
Cá
thể
SL Đời
SL lai
SL gạch
Max fitness Weight của cá thể tốt nhất
Train fitness/demo fitness
Phân tích case #2:
- AI của chúng ta được huấn luyện
qua 10 đời, mỗi đời gồm 10 cá
Kết luận case#2:
- Huấn luyện AI với các seed ngẫu
nhiên có khả năng tạo ra AI tốt hơn
- Huấn luyện AI với seed ngẫu nhiên cần rất nhiều cá thể mỗi đời và cần qua rất nhiều đời để đạt được khả năng ứng dụng cao (khi so với ứng
dụng trong case #2)
Trang 1515
Case #3: AI với fitness mới và train ở 1 seed Đặc điểm:
▪ Các viên gạch và thứ tự gạch xuất hiện được xác định bằng seed
▪ AI được train với seed=1
Fitness được đo bằng:
số lượng line đã xóa*1000 + số lượng gạch đã đặt
Kết quả huấn luyện ( record3 )
Cá
thể
SL Đời
SL lai
SL gạch
Max fitness Weight của cá thể tốt nhất
->fitness tối đa có thể đạt được là: 300*0.4*1000 + 300 =120,300
▪ Ta sẽ giới thiệu thêm thông số nằm sau fitness của 2 weight đó là tỉ lệ của chúng so với fitness tối đa đối với thông số của chúng
▪ Với các bài train ở số lượng gạch là vô hạn thì chúng sẽ được giám sát kèm với UI nên số điểm có thể thấp hơn số điểm tối đa
STT seed
Số lượng gạch
Theoretical maximum
Trained fitness Demo fitness
Train fitness/
demo fitness
(98.3%)
117,300 (97.5%) 1.008
(98.3%)
237,600 (98.7%) 0.995
3.3 1 1,000 401,000 399,000
(99.5%)
400,000 (99.7%) 0.997
Trang 1616
(99%)
196,500 (98%) 1.010
3.5 2 Infinite Infinite
1,535,862 (99%,thua ở line 3862)
1,049,655 (98.5%, thua ở line 2655)
▪ Có sự khác biệt rất lớn khi thay đổi công thức tính fitness
Kết luận case#3:
▪ Huấn luyện AI tetris muốn đạt hiệu quả cao, nhanh chóng thì ta tính fitness bằng số lượng line đã clear, sẽ tốt hơn là tính điểm, vì công thức tính điểm là số lượng line clear = [1,2,3,4] thì sẽ có số điểm là [40,100,300,1200], vì công thức tính điểm chơi ưu tiên clear nhiều line một lúc, có thể mang lại nguy hiểm cho AI vì độ cao trung bình sẽ được đẩy lên để ưu tiên clear nhiều line AI với fitness theo số line đã clear thì
sẽ ưu tiên clear line trước, dẫn đến độ cao trung bình thấp, khiến chúng
sống được lâu hơn
▪ Cần có kiểm chứng về thực lực của các AI với các bộ fitness khác nhau
Trang 1717
Case #4: AI tự train vs AI tự train Đặc điểm:
▪ Khi so sánh với nhau các AI sẽ được so sánh bằng số điểm đạt được
▪ Các viên gạch và thứ tự gạch xuất hiện được xác định bằng seed
▪ 2 AI sẽ được train ở seed = 1
▪ Ta sẽ train 2 AI đối đầu với nhau
Fitness của AI 1 được đo bằng:
số lượng line đã xóa*1000 + số lượng gạch đã đặt
Kết quả huấn luyện AI 1 ( record4 )
Cá
thể
SL Đời
SL lai
SL gạch
Max fitness Weight của cá thể tốt nhất
5 5 2 300 119,300 [0.40254199, 0.83214954, 1.22852379,
-0.60817082]
Fitness của AI 2 được đo bằng số điểm đạt được
Kết quả huấn luyện AI 2 ( record5 )
Cá
thể
SL Đời
SL lai
SL gạch
Max fitness Weight của cá thể tốt nhất
STT seed Số lượng
gạch
AI 1 Score
AI 2 Score
Trang 1818
4.5 2 Infinite 337,842
(lost)
1,550,578 (lost) 0.217881332
▪ AI được huấn luyện với fitness ưu tiên clear nhiều hàng một lúc (AI 2)
sẽ có hiệu năng tốt hơn trong số lượng gạch được cho phép
▪ AI được huấn luyện với fitness ưu tiên độ cao của các cột (AI 1) sẽ có
khả năng tồn tại tốt hơn (4.4)
▪ Nếu muốn đánh giá AI bằng các seed khác nhau thì nên thử ở nhiều seed vì kết quả sẽ phụ thuộc vào seed đó (4.5)
Trang 1919
KẾT LUẬN
Sau các bài nghiên cứu và huấn luyện thì nhóm đã có nhiều kiến thức và đã
tạo được một AI có khả năng chơi Tetris hơn 34,000,000 điểm AI được huấn
luyện qua 20 đời, gồm 20 cá thể, 5000 gạch giới hạn và được huấn luyện hoàn
chỉnh trong vòng 13h (Video)
Sau khi hoàn thành đồ án và tiến hành các bài nghiên cứu, nhóm đã biết thêm
được nhiều nội dung liên quan đến AI nói chung và AI cho game Tetris nói
riêng
Các kiến thức trên có thể được dùng cho học tập và các dự án sau này, nhóm
rất vui vì đã chọn được một đề tài tốt và mang lại nhiều kiến thức bổ ích
Cảm ơn các thầy cô hoặc các bạn đã đọc qua báo cáo