Trong bài toán cờ tướng: Trạng thái ban đầu là trạng thái bàn cơ hai bên khi bắt đầu chơi.. Bảng đánh giá giá trị theo vị trí của từng quân Hàm lượng giá của chương trình sử dụn
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIÊ ̣N CÔNG NGHÊ ̣ THÔNG TIN VÀ TRUYỀN THÔNG
*
BÁO CÁO MÔN HỌC
TRÍ TUÊ ̣ NHÂN TẠO
Đề tài: Chương trı̀nh trò chơi cờ tướng
sử du ̣ng giải thuâ ̣t cắt tı̉a α-β
Giảng viên: Nguyễn Nhâ ̣t Quang
Nhóm sinh viên thực hiê ̣n:
1 Trần Văn Thành 20133560 CNTT-TT 2.04
2 Đă ̣ng Bá Tú 20134472 CNTT-TT 2.01
3 Vũ Thi ̣ Nga 20132741 CNTT-TT 2.04
Hà Nô ̣i
Ngày 15 tháng 11 năm 2015
Trang 2LỜI MỞ ĐẦU
Trı́ tuê ̣ nhân ta ̣o (hay AI: Articifial Intelligence) là mô ̣t ngành khoa ho ̣c ngày càng phát triển ma ̣nh mẽ và có ứng du ̣ng rô ̣ng rãi trong cuô ̣c sống Rõ ràng máy tı́nh với
đô ̣ thông minh nhất đi ̣nh có ảnh hưởng không nhỏ đến cuô ̣c sống ngày nay và trong tương lai phát triển của văn minh nhân loa ̣i Mô ̣t trong những ứng du ̣ng có thể kể đến của AI đó là viê ̣c xây dựng, phát triển các trò chơi đối kháng Cờ tướng cũng là mô ̣t trong số đó
Cờ tướng có nguồn gốc từ Trung Quốc, là trò chơi trı́ tuê ̣ dành cho hai người, cùng với cờ vua trở thành hai loa ̣i cờ phổ biến nhất trên thế giới
Để tı̀m hiểu sâu hơn về AI nói chung cũng như các kı̃ thuâ ̣t tı̀m kiếm nói riêng, chúng em quyết đi ̣nh lựa cho ̣n đề tài: “Chương trı̀nh trò chơi cờ tướng sử du ̣ng giải thuâ ̣t cắt tı̉a α-β”
Do thời gian ha ̣n he ̣p cũng như viê ̣c thiếu nhiều kı̃ năng trong xây dựng, thiết kế phần mềm cũng như những hiểu biết về AI, đề tài của chúng em vẫn còn nhiều ha ̣n chế Rất mong nhâ ̣n đươ ̣c sư ̣ đóng góp ý kiến của thầy và các ba ̣n để đề tài ngày càng hoàn thiê ̣n hơn
Trang 3MỤC LỤC
I Giới thiệu mô tả bài toán thực tế………
II Phương pháp giải quyết bài toán………
III Các tài nguyên, dữ liệu sử dụng từ bên ngoài………
IV Các vấn đề gặp phải………
V Phương pháp giải quyết………
VI Đánh giá………
VII Ý tưởng cải tiến………
Trang 4NỘI DUNG
I Giới thiê ̣u, mô tả bài toán thực tế
Cờ tướng là loa ̣i cờ diễn ra giữa hai người chơi Xét mô ̣t ván cờ, 2 người chơi lần lươ ̣t thay phiên nhau đi các quân cờ trên bàn cờ sao cho phù hơ ̣p với luâ ̣t chơi môn cờ tướng để nhằm chiếu tướng đối phương và dành chiến thắng Bài toán đă ̣t ra là cần xây dựng mô ̣t chương trı̀nh để máy tı́nh có thể tự đô ̣ng chơi cờ, thi đấu với đối thủ là con người, đảm bảo chất lươ ̣ng nước đi cũng như chi phı́ vı̀ thời gian
Chương trı̀nh chơi cờ có các chức năng sau:
- Ta ̣o môi trường là giao diê ̣n bàn cờ và các quân cờ cho 2 đối thủ người chơi và máy tı́nh
- Máy tı́nh sinh nước đi tự đô ̣ng khi đến lươ ̣t đảm bảo đúng luâ ̣t chơi bằng viê ̣c đánh giá điểm khi đi thử từng quân cờ, lấy điểm quân cờ đa ̣t giá tri ̣ lớn nhất và thư ̣c hiê ̣n nước đi đó
- Sau đó đến lươ ̣t người chơi thực hiê ̣n nước đi của mı̀nh
- Chương trı̀nh tiếp tu ̣c lă ̣p la ̣i như vâ ̣y đến khi người chơi thoát chương trı̀nh hoă ̣c xác đi ̣nh đươ ̣c người thắng cuô ̣c
II Phương pháp giải quyết bài toán
Trò chơi đươ ̣c biểu diễn trong mô ̣t không gian tra ̣ng thái Nút gốc biểu diễn tra ̣ng thái bắt đầu, mỗi nước đi sẽ biến đổi tra ̣ng thái hiê ̣n hành thành mô ̣t tra ̣ng
Trang 5thái mới Các tra ̣ng thái bàn cờ khác nhau đươ ̣c biểu diễn thành mô ̣t cây trò chơi, chương trı̀nh tiến hành tı̀m kiếm trên cây để tı̀m nước đi tốt nhất
Chương trı̀nh sẽ đươ ̣c dự tı́nh trước mô ̣t đô ̣ sâu lớp của cây tı̀m kiếm, các tra ̣ng thái trên mức đó đươ ̣c đánh giá theo mô ̣t hàm heuristic Chương trı̀nh sử du ̣ng giải thuâ ̣t cắt tı̉a α-β.Ý tưởng của tı̀m kiếm α-β đó là thay vı̀ tı̀m kiếm toàn bô ̣ không gian đến mô ̣t đô ̣ sâu cố đi ̣nh, tı̀m kiếm α-β thực hiê ̣n theo kiểu tı̀m kiếm sâu Giá tri ̣ α liên quan đến các nút MAX và có khuynh hướng không bao giờ giảm, trong khi giá tri ̣ β la ̣i liên quan đến các nút MIN và có khuynh hướng không bao giờ tăng
Hai luâ ̣t cắt tı̉a dựa trên các giá tri ̣ α, β:
- Quá trı̀nh tı̀m kiếm có thể kết thúc bên dưới mô ̣t nút MIN nào có giá tri ̣ β nhỏ hơn hoă ̣c bằng giá tri ̣ α của mô ̣t nút cha MAX bất kı̀ nào đó
- Quá trı̀nh tı̀m kiếm có thể kết thúc bên dưới mô ̣t nút MAX nào có giá tri ̣ α nhỏ hơn hoă ̣c bằng giá tri ̣ β của mô ̣t nút cha MIN bất kı̀ nào đó
Giải thuâ ̣t giúp tı̉a bớt nhánh trên cây trò chơi, từ đó tăng hiê ̣u quả tı̀m kiếm
Ta xét chi tiết phương pháp đươ ̣c dùng để giải quyết bài toán:
1 Biểu diễn các quân cờ
- Ta xây dư ̣ng các lớp biểu diễn cho từng quân cờ
- Trong mỗi lớp ta sẽ ta ̣o mô ̣t hàm getValue() trả la ̣i giá tri ̣ của quân đó Bên
ca ̣nh đó, ở các lớp Cannon, Chariot, Horse, Soldier, ta dùng mô ̣t mảng lưu
la ̣i giá tri ̣ khác nhau ta ̣i mỗi vi ̣ trı́ của chúng trên bàn cờ Các giá tri ̣ dùng để phu ̣c vu ̣ cho viê ̣c xây dư ̣ng hàm lươ ̣ng giá sau này
- Dư ̣a trên luâ ̣t chơi của môn cờ tướng, trong mỗi lớp ta cũng xây dựng hàm để kiểm tra các nước đi hơ ̣p lê ̣ cho từng quân cờ, đảm bảo đươ ̣c vi ̣ trı́ giới
ha ̣n, tı́nh bi ̣ chă ̣n của mô ̣t số quân
2 Hàm lươ ̣ng giá thế cờ
Trang 6Như đã trı̀nh bày ở trên, trong mỗi lớp biểu diễn quân cờ sẽ có hàm để trả
la ̣i giá tri ̣ của quân cờ đó Để tı́nh giá tri ̣ của mô ̣t thế cờ, ta thiết kế mô ̣t hàm lươ ̣ng giá đơn giản Đó là, lấy tổng điểm quân mı̀nh trừ đi tổng điểm quân đối phương
Giá tri ̣ của các quân cờ đươ ̣c tı́nh dựa theo cách tı́nh giá tri ̣ trong tài liê ̣u
“Computer Chinese Chess”
Dưới đây là giá tri ̣ mă ̣c đi ̣nh của các quân cờ:
General Chariot Cannon Elephant Horse Advisor Soldier
Giá tri ̣ vi ̣ trı́ của các quân:
Cannon: int[][]=
{6, 4, 0, -10, -12, -10, 0, 4, 6},
{2, 2, 0, -4, -14, -4, 0, 2, 2},
{2, 2, 0, -10, -8, -10, 0, 2, 2},
{0, 0, -2, 4, 10, 4, -2, 0, 0},
{0, 0, 0, 2, 8, 2, 0, 0, 0},
{-2, 0, 4, 2, 6, 2, 4, 0, -2},
{0, 0, 0, 2, 4, 2, 0, 0, 0},
{4, 0, 8, 6, 10, 6, 8, 0, 4},
{0, 2, 4, 6, 6, 6, 4, 2, 0},
{0, 0, 2, 6, 6, 6, 2, 0, 0}
Chariot: int[][]=
{14, 14, 12, 18, 16, 18, 12, 14, 14}, {16, 20, 18, 24, 26, 24, 18, 20, 16}, {12, 12, 12, 18, 18, 18, 12, 12, 12}, {12, 18, 16, 22, 22, 22, 16, 18, 12}, {12, 14, 12, 18, 18, 18, 12, 14, 12}, {12, 16, 14, 20, 20, 20, 14, 16, 12}, {6, 10, 8, 14, 14, 14, 8, 10, 6}, {4, 8, 6, 14, 12, 14, 6, 8, 4}, {8, 4, 8, 16, 8, 16, 8, 4, 8}, {-2, 10, 6, 14, 12, 14, 6, 10, -2}};
Trang 7Horse: int[][]=
{4, 8, 16, 12, 4, 12, 16, 8, 4},
{4, 10, 28, 16, 8, 16, 28, 10, 4},
{12, 14, 16, 20, 18, 20, 16, 14, 12},
{8, 24, 18, 24, 20, 24, 18, 24, 8},
{6, 16, 14, 18, 16, 18, 14, 16, 6},
{4, 12, 16, 14, 12, 14, 16, 12, 4},
{2, 6, 8, 6, 10, 6, 8, 6, 2},
{4, 2, 8, 8, 4, 8, 8, 2, 4},
{0, 2, 4, 4, -2, 4, 4, 2, 0},
{0, -4, 0, 0, 0, 0, 0, -4, 0}
Soldier: int[][]=
{0, 3, 6, 9, 12, 9, 6, 3, 0}, {18, 36, 56, 80, 120, 80, 56, 36, 18} {14, 26, 42, 60, 80, 60, 42, 26, 14} {10, 20, 30, 34, 40, 34, 30, 20, 10}, {6, 12, 18, 18, 20, 18, 18, 12, 6}, {2, 0, 8, 0, 8, 0, 8, 0, 2},
{0, 0, -2, 0, 4, 0, -2, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}
3 Giải thuâ ̣t tı̀m kiếm α-β
Là một giải thuật cho bài toán tìm kiếm có đối thủ dựa trên ý tưởng về chiến lược tối ưu cho mỗi nước đi tiếp theo của mỗi bên
Có sử dụng tri thức bổ sung giúp cắt một bộ phận thuộc tập khả năng mà không có khả năng tạo ra nước đi tốt hơn nước khác
Trong bài toán cờ tướng:
Trạng thái ban đầu là trạng thái bàn cơ hai bên khi bắt đầu chơi
Các toán tử là các nước đi hợp lệ
Trạng thái kết thúc là tính thế khi một trong hai bên bị mất tướng
III Các phương pháp, tư liệu sử dụng từ bên ngoài
-Tư liệu tham khảo từ bài viết của Shi-Jim Yen, Jar-hang Chen,Tai-Ning Yang, Shun-Chin Hsu (Taipei, Taiwan);
(http://web.csie.ndhu.edu.tw/sjyen/Papers/2004CCC.pdf)
Bảng đánh giá giá trị ban đầu của các quân
Trang 8 Bảng đánh giá giá trị theo vị trí của từng quân
Hàm lượng giá của chương trình sử dụng ý tưởng của tài liệu đã nên
đó là sử dụng các giá trị vị trí và chỉ số của quân mà đánh giá giá trị ước lượng của thế cờ
Ngoài ra các thư viện sử dụng trong chương trình gồm có:
Các gói thư viện chuẩn do java cung cấp
Trang 9IV Những vấn đề khó khăn gặp phải
Trong thời gian chấp nhận được, thuật toán cắt tỉa chỉ có độ sâu tối đa thấp (<=4)
Chương trình sử dụng quá nhiều bộ nhớ RAM (> 700MB)
Sử dụng hàm lượng giá chưa tốt dẫn đến chất lượng các nước đánh của máy tính chưa cao
Vấn đề đọc ghi dữ liệu đồng thời (Concurrent Modification)
Vấn đề khi chạy đa luồng do chưa sử dụng tốt việc chia công việc cho các luồng và phải phụ thuộc máy ảo Java xử lý với luồng
V Phương pháp giải quyết
Sử dụng cấu trúc dữ liệu hàng đợi ưu tiên để sắp xếp các trạng thái bàn cờ theo giá trị ước lượng tại mỗi độ sâu trước khi tìm kiếm ở độ sâu thấp hơn
Tối ưu bộ nhớ thông qua việc : không tạo ra bộ nhớ mới để lưu trữ cả trạng thái của bàn cờ mà chỉ lưu trữ vết thay đổi của trạng thái bàn cờ mức hiện tại
so với mức cha
Tăng tốc độ chương trình bằng cách tính giá trị ước lượng của thế cờ ngay tại lúc thay đổi sang thế cờ khác mà không phải tính tất cả tại lúc so sánh
Hàm lượng giá có sử dụng việc tăng giá trị ước lượng hơn khi là nước chiếu
và khi một nước cờ có khả năng bắt quân đối thủ
VI Đánh giá về chương trình
Trang 10 Ưu điểm:
Đã có sự thông minh cơ bản của trò chơi cờ tướng
Với độ sâu cắt tỉa là 6 chương trình đủ thông minh để chơi thắng người chơi có trình độ trung bình
Hoàn toàn có thể chơi với người chơi và không gặp bug
Nhược điểm:
Độ sâu của cắt tỉa chưa bằng với phần lớn các chương trình đánh cờ tướng hiện tại
Cấu trúc lưu trữ của dữ liệu trong chương trình chưa tối ưu nên chương trình vẫn còn yêu cầu nhiều bộ nhớ
Hàm ước lượng trạng thái đang còn cơ bản
Một số kết quả đạt được của chương trình
Trang 11VII Hướng phát triển
Tối ưu hàm lượng giá
Tạo cơ sở dữ liệu cho các nước đi đầu
Tăng tầm quan trọng của các thế cờ tại các nước cuối
Sử dụng cách thức lưu trữ trạng thái bàn cờ khác (qua giá trị số )
Thực hiện việc tính toán song song hàm cắt tỉa