Đề tài xây dựng game giải mê cung dùng các thuật toán trong việc tìm đường đi tối ưu

Khám phá đề tài xây dựng game giải mê cung. Ứng dụng thuật toán tìm đường đi tối ưu giúp bạn chinh phục mọi thử thách hóc búa trong game.

Chuyên ngành

Trí Tuệ Nhân Tạo

Người đăng

Ẩn danh

Thể loại

Tiểu luận cuối kỳ

2023

46
9
0

Phí lưu trữ

30 Point

Tóm tắt

I. Khám phá đề tài xây dựng game giải mê cung bằng AI

Đề tài xây dựng game giải mê cung là một lĩnh vực hấp dẫn, kết hợp giữa lập trình game và ứng dụng của trí tuệ nhân tạo. Mục tiêu cốt lõi là tạo ra một môi trường trực quan để mô phỏng và so sánh hiệu quả của các thuật toán tìm đường đi tối ưu. Việc này không chỉ mang lại giá trị giải trí mà còn có ý nghĩa lớn trong giáo dục và nghiên cứu khoa học. Các dự án, tiêu biểu như đồ án game được thực hiện tại các trường đại học, thường tập trung vào việc hiện thực hóa các giải thuật phức tạp thành những chuyển động dễ hiểu trên màn hình. Thông qua đó, người học có thể quan sát cách pathfinding AI hoạt động, từ việc khám phá các nút trên bản đồ đến khi tìm ra con đường hiệu quả nhất. Nền tảng của các game này thường dựa trên lý thuyết đồ thị, trong đó mê cung được biểu diễn dưới dạng một đồ thị với các ô là đỉnh và các lối đi là cạnh. Sự phát triển của các công cụ như thư viện Pygame trong Python hay engine Unity với lập trình C# đã giúp quá trình xây dựng game trở nên dễ dàng và hiệu quả hơn. Những công cụ này cung cấp đầy đủ các chức năng về đồ họa, xử lý sự kiện và âm thanh, cho phép nhà phát triển tập trung vào logic cốt lõi là mô phỏng thuật toán.

1.1. Tổng quan về trí tuệ nhân tạo trong game hiện nay

Ngày nay, trí tuệ nhân tạo trong game không còn là một khái niệm xa lạ. Nó là yếu tố then chốt quyết định độ thông minh của các nhân vật không do người chơi điều khiển (NPC), tạo ra những thử thách hấp dẫn và môi trường game sống động. Trong bối cảnh game giải mê cung, AI đóng vai trò là người giải quyết bài toán, tự động tìm ra lời giải. Các thuật toán tìm đường như A*, Dijkstra, BFS không chỉ được ứng dụng để giải mê cung mà còn trong việc điều hướng nhân vật, quản lý tài nguyên và ra quyết định chiến thuật trong nhiều thể loại game khác. Việc ứng dụng AI giúp giảm tải gánh nặng tính toán cho con người và tạo ra những trải nghiệm độc đáo, khó đoán trước.

1.2. Mục tiêu của đồ án game tìm đường đi ngắn nhất

Mục đích chính của các đề tài này là trực quan hóa quá trình hoạt động của các thuật toán tìm đường. Thay vì chỉ đọc lý thuyết, sinh viên và nhà nghiên cứu có thể thấy rõ từng bước đi, từng nút được duyệt và cách mỗi thuật toán tiếp cận vấn đề tìm đường đi ngắn nhất. Một mục tiêu quan trọng khác là so sánh hiệu suất. Đồ án thường xây dựng các chức năng đo lường các chỉ số như tổng số nút đã duyệt, tổng số bước di chuyển và thời gian thực thi. Dựa trên các kết quả này, có thể đưa ra kết luận về việc “thuật toán nào là tối ưu nhất cho một dạng mê cung cụ thể”, như được phân tích trong tài liệu gốc của Trường ĐH Sư phạm Kỹ thuật TP.HCM. Giá trị giáo dục của những dự án này là rất lớn, cung cấp một công cụ học tập tương tác và hiệu quả.

II. Thách thức trong việc tìm đường đi ngắn nhất cho game

Việc tìm đường đi tối ưu trong một mê cung không phải là bài toán đơn giản. Thách thức lớn nhất đến từ không gian trạng thái của mê cung, tức là tổng số các vị trí có thể có. Với một mê cung kích thước lớn, ví dụ như ma trận 50x50, không gian trạng thái có thể lên đến hàng nghìn nút. Việc duyệt qua toàn bộ không gian này để tìm ra con đường hiệu quả đòi hỏi một thuật toán có khả năng quản lý bộ nhớ và thời gian tính toán tốt. Một mê cung có thể được biểu diễn bằng ma trận kề hoặc danh sách kề, mỗi cách biểu diễn có ưu và nhược điểm riêng về không gian lưu trữ và tốc độ truy xuất. Thêm vào đó, các mê cung phức tạp thường có nhiều đường cụt, chu trình và các chướng ngại vật, làm tăng độ khó cho các thuật toán. Việc lựa chọn thuật toán phù hợp trở thành yếu tố quyết định. Một thuật toán không hiệu quả có thể dẫn đến thời gian chờ đợi lâu, tiêu tốn tài nguyên hệ thống và không đảm bảo tìm ra lời giải tối ưu. Do đó, việc hiểu rõ bản chất của từng thuật toán và đặc điểm của mê cung là vô cùng quan trọng để thực hiện tối ưu hóa game.

2.1. Bài toán mê cung và ứng dụng của lý thuyết đồ thị

Về bản chất, bài toán giải mê cung là một bài toán tìm đường đi trên đồ thị. Mỗi ô trong mê cung được xem là một đỉnh (node), và mỗi lối đi hợp lệ giữa hai ô liền kề được xem là một cạnh (edge). Điểm bắt đầu là đỉnh xuất phát, và điểm kết thúc là đỉnh đích. Dựa trên mô hình này, lý thuyết đồ thị cung cấp một bộ công cụ mạnh mẽ để phân tích và giải quyết vấn đề. Các thuật toán duyệt đồ thị như tìm kiếm theo chiều rộng (BFS)tìm kiếm theo chiều sâu (DFS) trở thành nền tảng cho việc khám phá mê cung. Việc áp dụng lý thuyết đồ thị giúp chuẩn hóa bài toán, cho phép áp dụng các giải thuật đã được chứng minh hiệu quả thay vì phải phát minh lại từ đầu.

2.2. Vấn đề tạo mê cung ngẫu nhiên và độ phức tạp

Để tăng tính tái sử dụng và thử thách của game, việc tạo mê cung ngẫu nhiên (procedural generation) là một chức năng quan trọng. Các thuật toán như Randomized Depth-First Search hay thuật toán Prim có thể được sử dụng để tự động sinh ra các mê cung phức tạp và không trùng lặp. Tuy nhiên, việc này cũng làm tăng độ phức tạp của bài toán tìm đường. Một mê cung được tạo ra ngẫu nhiên có thể có những cấu trúc rất oái oăm, đòi hỏi thuật toán tìm đường phải đủ thông minh để không bị mắc kẹt trong các nhánh dài hoặc các khu vực bị cô lập. Độ phức tạp của thuật toán (về thời gian và không gian) trở thành yếu tố cần cân nhắc kỹ lưỡng khi kích thước mê cung tăng lên.

III. Phương pháp tìm kiếm mù Giải pháp nền tảng cho AI

Các thuật toán tìm kiếm mù (uninformed search) là nhóm giải pháp cơ bản nhất trong trí tuệ nhân tạo trong game. Đặc điểm của chúng là không sử dụng bất kỳ thông tin bổ sung nào về khoảng cách hay vị trí tương đối của đích đến. Thay vào đó, chúng chỉ tuân theo một chiến lược duyệt cố định để khám phá không gian trạng thái. Hai đại diện tiêu biểu nhất là tìm kiếm theo chiều rộng (BFS)tìm kiếm theo chiều sâu (DFS). BFS hoạt động bằng cách khám phá tất cả các nút láng giềng ở độ sâu hiện tại trước khi đi xuống các nút ở độ sâu tiếp theo. Điều này đảm bảo rằng BFS luôn tìm thấy đường đi ngắn nhất về số bước trong một đồ thị không có trọng số. Ngược lại, DFS đi sâu nhất có thể theo một nhánh trước khi quay lui. Mặc dù DFS tiêu thụ ít bộ nhớ hơn BFS, nó không đảm bảo tìm được đường đi tối ưu và có thể bị mắc kẹt trong các nhánh vô hạn. Một thuật toán khác trong nhóm này là Uniform Cost Search (UCS), một biến thể của thuật toán Dijkstra, tối ưu hóa đường đi dựa trên chi phí tích lũy thay vì số bước.

3.1. So sánh tìm kiếm theo chiều rộng BFS và chiều sâu DFS

BFS sử dụng cấu trúc dữ liệu hàng đợi (queue) để quản lý các nút cần duyệt, đảm bảo duyệt theo từng tầng. Kết quả là BFS luôn tìm ra đường đi có số cạnh ít nhất từ điểm bắt đầu đến điểm kết thúc. Tuy nhiên, nhược điểm của nó là yêu cầu bộ nhớ lớn vì phải lưu trữ tất cả các nút ở biên giới tìm kiếm. Ngược lại, tìm kiếm theo chiều sâu (DFS) sử dụng ngăn xếp (stack), ưu tiên đi sâu vào một nhánh. DFS có ưu điểm về bộ nhớ nhưng lại không hoàn chỉnh (có thể không tìm thấy lời giải) và không tối ưu. Trong tài liệu tham khảo, kết quả thực nghiệm cho thấy BFS và DFS có hiệu năng rất khác biệt: BFS duyệt nhiều nút hơn nhưng tìm ra đường đi ngắn hơn nhiều so với DFS.

3.2. Thuật toán Uniform Cost Search UCS và chi phí đường đi

Uniform Cost Search (UCS) là một sự cải tiến so với BFS khi đồ thị có trọng số trên các cạnh. UCS luôn mở rộng nút có chi phí đường đi (g(n)) thấp nhất từ nút gốc. Về cơ bản, nó là một dạng của thuật toán Dijkstra. Trong bài toán mê cung đơn giản nơi mỗi bước đi có chi phí là 1, hoạt động của UCS tương tự như BFS. Tuy nhiên, nếu mê cung có các loại địa hình khác nhau (ví dụ: đi qua đầm lầy tốn 5 chi phí, đi trên cỏ tốn 1 chi phí), UCS sẽ tỏ ra vượt trội khi luôn tìm được con đường có tổng chi phí thấp nhất, không chỉ là con đường có ít bước đi nhất. Nó đảm bảo tính tối ưu về chi phí, một yếu tố quan trọng trong nhiều bài toán tối ưu hóa game.

IV. Top thuật toán tìm kiếm có thông tin tối ưu hóa game

Trái ngược với tìm kiếm mù, các thuật toán tìm kiếm có thông tin (informed search) sử dụng kiến thức bổ sung để hướng việc tìm kiếm về phía mục tiêu. Kiến thức này được thể hiện qua một heuristic function (hàm heuristic), một hàm ước tính chi phí từ nút hiện tại đến đích. Nhờ đó, chúng có thể loại bỏ các nhánh tìm kiếm vô ích và tìm ra lời giải nhanh hơn đáng kể. Thuật toán A* (A-star) là thuật toán nổi tiếng và hiệu quả nhất trong nhóm này. Nó kết hợp ưu điểm của UCS (tính toán chi phí thực g(n)) và Greedy Best-First Search (sử dụng hàm heuristic h(n)). A* đánh giá các nút dựa trên hàm f(n) = g(n) + h(n), đảm bảo tìm ra đường đi ngắn nhất nếu hàm heuristic là hợp lệ (admissible). Greedy Search chỉ dựa vào h(n), giúp tìm đường rất nhanh nhưng không đảm bảo tối ưu. Các biến thể khác như Beam Search cũng được sử dụng để giảm yêu cầu bộ nhớ bằng cách chỉ giữ lại một số lượng nút tốt nhất ở mỗi bước. Những thuật toán này là cốt lõi của pathfinding AI hiện đại.

4.1. Sức mạnh của thuật toán A và vai trò heuristic function

Thuật toán A* được coi là tiêu chuẩn vàng trong các bài toán tìm đường. Hiệu quả của nó phụ thuộc rất nhiều vào chất lượng của heuristic function. Một hàm heuristic tốt phải ước tính gần đúng với chi phí thực tế nhưng không bao giờ được đánh giá quá cao (tính chất admissible). Trong một mê cung dạng lưới, các hàm heuristic phổ biến là khoảng cách Manhattan (tổng chênh lệch tọa độ x và y) hoặc khoảng cách Euclidean (đường chim bay). Một hàm heuristic chính xác sẽ giúp A* tiến thẳng đến đích, trong khi một hàm heuristic kém có thể khiến A* hoạt động không khác gì BFS. Theo báo cáo phân tích, A* thường cân bằng tốt giữa số nút duyệt và độ tối ưu của đường đi.

4.2. Giải thuật Greedy Best First Search và Beam Search

Greedy Best-First Search là một thuật toán tham lam. Nó luôn chọn nút có vẻ tốt nhất tại thời điểm hiện tại, tức là nút có giá trị h(n) nhỏ nhất. Điều này giúp nó tìm đến đích rất nhanh. Tuy nhiên, sự "thiển cận" này có thể khiến nó đi vào những con đường dài và không tối ưu. Ngược lại, Beam Search là một biến thể của Best-First Search, nhưng nó chỉ giữ lại một số lượng giới hạn (beam width - k) các nút tốt nhất để xét ở bước tiếp theo. Điều này giúp kiểm soát việc sử dụng bộ nhớ, rất hữu ích trong các không gian trạng thái khổng lồ, nhưng cũng có thể làm mất đi lời giải tối ưu nếu nó bị loại bỏ sớm.

V. Phân tích hiệu quả các thuật toán trong đồ án thực tế

Việc đánh giá hiệu quả của các thuật toán không thể chỉ dựa trên lý thuyết. Cần có một môi trường thực nghiệm để so sánh các chỉ số hiệu năng một cách khách quan. Trong đề tài được tham khảo, nhóm sinh viên đã sử dụng ngôn ngữ Python và thư viện Pygame để xây dựng một game 2D mô phỏng quá trình giải mê cung. Giao diện trực quan cho phép người dùng chọn các thuật toán khác nhau (BFS, DFS, UCS, A*, Greedy, ID, Beam) và quan sát chúng hoạt động trên cùng một bản đồ. Việc so sánh được thực hiện trên các mê cung có kích thước khác nhau (30x30, 50x50, 70x70). Các chỉ số được ghi nhận bao gồm tổng số nút đã duyệt, số bước di chuyển của đường đi cuối cùng, và tổng thời gian thực thi. Kết quả từ việc mô phỏng thuật toán này cung cấp những bằng chứng rõ ràng về ưu và nhược điểm của mỗi phương pháp, giúp đưa ra lựa chọn phù hợp cho các bài toán cụ thể. Đây là một bước quan trọng trong quy trình nghiên cứu và tối ưu hóa game.

5.1. So sánh chi phí dựa trên số nút duyệt và thời gian chạy

Dựa trên Bảng 1 và Biểu đồ 1 trong tài liệu gốc, có thể thấy rõ sự khác biệt. Các thuật toán tìm kiếm có thông tin như Greedy và A* có số nút duyệt trung bình thấp hơn đáng kể so với các thuật toán tìm kiếm mù như BFS, UCS và đặc biệt là DFS. Cụ thể, Greedy chỉ duyệt trung bình 134 nút, trong khi BFS/UCS duyệt tới 1590 nút. Về thời gian thực thi, Greedy, A*, và Beam Search cũng cho kết quả nhanh nhất, thường dưới 5 giây trên bản đồ 50x50, trong khi các thuật toán khác có thể mất đến 8-10 giây. Điều này khẳng định hiệu quả của việc sử dụng heuristic.

5.2. Đánh giá độ tối ưu của đường đi qua số bước di chuyển

Tuy nhiên, hiệu suất không chỉ được đo bằng tốc độ. Bảng 2 và Biểu đồ 2 cho thấy một bức tranh khác. Các thuật toán như BFS, UCS, và thuật toán A* luôn tìm ra đường đi có số bước di chuyển ngắn nhất (trung bình 34 bước). Ngược lại, DFS, mặc dù là một thuật toán tìm kiếm mù, lại cho ra đường đi rất dài (trung bình 267 bước). Greedy Best-First Search, dù nhanh, cũng không đảm bảo đường đi ngắn nhất (trung bình 36 bước). Kết quả này nhấn mạnh sự đánh đổi kinh điển trong khoa học máy tính: tốc độ so với tính tối ưu. A* nổi lên như một lựa chọn cân bằng nhất, vừa nhanh vừa đảm bảo tìm ra đường đi ngắn nhất.

VI. Hướng phát triển cho đề tài game giải mê cung thông minh

Đề tài xây dựng game giải mê cung với các thuật toán tìm đường tối ưu có tiềm năng phát triển rất lớn, không chỉ dừng lại ở việc mô phỏng. Một trong những hướng đi hấp dẫn là tích hợp các kỹ thuật tạo mê cung ngẫu nhiên (procedural generation) phức tạp hơn để tạo ra vô số màn chơi độc đáo. Điều này không chỉ tăng giá trị chơi lại của game mà còn là một môi trường thử nghiệm đa dạng cho các thuật toán. Hơn nữa, có thể phát triển các thuật toán pathfinding AI nâng cao hơn, ví dụ như Jump Point Search (JPS) cho các bản đồ dạng lưới, hoặc các thuật toán có khả năng xử lý môi trường động, nơi các chướng ngại vật có thể di chuyển. Một hướng khác là ứng dụng học máy (Machine Learning) để AI có thể "học" cách giải mê cung hiệu quả hơn qua nhiều lần chơi, thay vì chỉ tuân theo một thuật toán cố định. Việc kết hợp giữa lý thuyết đồ thị và các mô hình học máy hứa hẹn sẽ mở ra một kỷ nguyên mới cho trí tuệ nhân tạo trong game, tạo ra những NPC có khả năng thích ứng và giải quyết vấn đề như con người.

6.1. Tích hợp thuật toán tạo mê cung ngẫu nhiên phức tạp

Hướng phát triển đầu tiên là cải tiến hệ thống procedural generation. Thay vì chỉ tạo ra các mê cung đơn giản, có thể áp dụng các thuật toán như Wilson's Algorithm hoặc Kruskal's Algorithm để tạo ra các mê cung có cấu trúc đa dạng hơn, ít thiên vị hơn. Thậm chí có thể tạo ra các mê cung có nhiều tầng, không gian ba chiều hoặc có các yếu tố đặc biệt như cổng dịch chuyển, chìa khóa và cửa khóa. Những mê cung này sẽ đặt ra những thách thức mới cho các thuật toán tìm đường đi tối ưu và tạo ra một nền tảng nghiên cứu phong phú hơn.

6.2. Tiềm năng ứng dụng pathfinding AI trong các lĩnh vực khác

Kiến thức và kỹ năng từ việc xây dựng game giải mê cung có thể được áp dụng rộng rãi. Trong ngành logistics, các thuật toán này được dùng để tối ưu hóa tuyến đường vận chuyển. Trong robot học, chúng giúp robot tự hành điều hướng trong môi trường phức tạp. Trong thiết kế mạch điện, chúng được dùng để tìm đường đi cho các vi mạch. Do đó, việc nghiên cứu sâu về pathfinding AI không chỉ phục vụ cho ngành công nghiệp game mà còn mở ra nhiều cơ hội trong các lĩnh vực công nghệ cao khác, đóng góp vào sự phát triển của tự động hóa và trí tuệ nhân tạo nói chung.

20/09/2025

Trích đoạn nội dung tài liệu

TRƯỜNG ĐH SƯ PHẠM KỸ THUẬT TP. HỒ CHÍ MINH KHOA CÔNG NGHỆ THÔNG TIN TIỂU LUẬN CUỐI KỲ Môn học: TRÍ TUỆ NHÂN TẠO ĐỀ TÀI: XÂY DỰNG GAME GIẢI MÊ CUNG DÙNG CÁC THUẬT TOÁN TRONG VIỆC TÌM ĐƯỜNG ĐI TỐI ƯU Giảng viên: PGS. Hoàng Văn Dũng Danh sách sinh viên thực hiện Mã số Họ và tên Mức độ đóng góp (%) SV 21110837 Nguyễn Quốc Lân 100% 21110822 Võ Minh Đạt 100% 21110154 Trần Đình Duy 100% TP. Hồ Chí Minh, tháng 11 năm 2023 MỤC LỤC PHẦN 1.Phát biểu bài toán.Mục đích, yêu cầu cần thực hiện.1Môi trường lập trình.2Thư viện chính sử dụng.Giải thuật BFS.Mô tả trong code.Giải thuật DFS.Mô tả trong code.Giải thuật UCS.Mô tả trong code.Giải thuật Greedy Search.Mô tả trong code.Mô tả trong code.Giải thuật ID.Mô tả trong code.Giải thuật Beam Search.Mô tả trong code.

PHÂN TÍCH, THIẾT KẾ GIẢI PHÁP.Thiết kế giao diện.Giao diện trang chủ.Giao diện người chơi.Giao diện AI.Các chức năng khác:.Dừng khẩn cấp. THỰC NGHIỆM, PHÂN TÍCH, ĐÁNH GIÁ KẾT QUẢ.Thuật toán BFS.Thuật toán DFS.Thuật toán UCS.Thuật toán Greedy.Thuật toán ID.Thuật toán Beam.Phân tích chi phí cho nhiều map và trung bình.Đánh giá kết quả các thuật toán.Đánh giá kết quả thực hiện.Hướng phát triển. 36 TÀI LIỆU THAM KHẢO. 38 DANH MỤC HÌNH ẢNH Hình 1.

Code cho thuật toán BFS. Code cho thuật toán DFS. Code cho thuật toán UCS. Code cho thuật toán Greedy.

Code cho thuật toán Astar. Code cho thuật toán ID. Code cho thuật toán Beam. Giao diện trang chủ.

Giao diện chế độ người chơi. Giao diện chế độ AI chơi. Dừng khẩn cấp. Demo thuật toán BFS.

Demo thuật toán DFS. Demo thuật toán UCS. Demo thuật toán Greedy. Demo thuật toán A*.

Demo thuật toán ID. Demo thuật toán Beam.31 DANH MỤC BẢNG Bảng 1. Bảng so sánh tổng số nút duyệt. Bảng so sánh số bước di chuyển.

Bảng so sánh tổng thời gian thực thi.34 DANH MỤC BIỂU ĐỒ Biểu đồ 1. Biểu đồ cột so sánh số nút duyệt giữa các thuật toán. Biểu đồ cột so sánh số bước di chuyển giữa các thuật toán. Biểu đồ cột so sánh thời gian chạy giữa các thuật toán.

Biểu đồ so sánh tổng hợp các thuật toán.35 DANH MỤC CÁC TỪ VIẾT TẮT Từ viết tắt Từ đầy đủ BFS Breadth First Search DFS Depth First Search UCS Uniform Cost Search ID Iterative Deepening A* A-star AI Artificial Intelligence Avg Average PHẦN 1.1 Lời nói đầu Ngày nay cùng với sự phát triển về khoa học và kỹ thuật là sự phát triển mạnh mẽ của nền công nghệ thông tin. Trong công nghiệp, nghiên cứu khoa học thì công nghệ thông tin đống vai trò rất quan trong trong sự phát triển của đât nước cũng như toàn thế giới Trên thế giới cũng như ở Việt Nam, công nghệ thông tin đã trở thành một ngày công nghiệp mũi nhọn, nó là một ngày khoa học kỹ thuật không thể thiếu trong việc áp dụng vào các hoạt động xã hội và khoa học. Nền công nghiệp hiện nay mang tính chất tự động hóa cao kèm theo đó là sự đòi hỏi về việc ứng dụng công nghệ thông tin cho lĩnh vực này. Vậy để có thể đáp ứng tốt những yêu cầu của ngày càng cao hơn trong lĩnh vực tự động hóa người ta đã tiến hành lập trình cho những cỗ máy, những người máy có thể tư duy như con người nhằm giảm bớt các gánh nặng công việc.

Việc ứng dụng trí tuệ nhân tạo đã tạo ra một cuộc cách mạng lớn trong việc tìm hiểu và chinh phục những điều mà con người không dám mơ tới. Đó là những robot thông minh, những cỗ máy thông minh có thể thay thế con người làm việc trong những môi trường khắc nghiệt hay chinh phục không gian bao la.Và bên cạnh đó là việc ứng dụng những thành tựu đó vào lĩnh vực giải trí của con người. Đó là những con vật robot, những trò chơi. Đó là những ứng dụng lớn lao của trí tuệ nhân tạo vào của sống của con người.

Trong bài tập lớn này chúng em sử dụng những thuật toán đã học cùng với giao diện trực quan mô tả cách thức hoạt động của các thuật toán AI để sinh viên dể dàng hiểu được cũng như vận dụng chúng cho chính công việc của họ sau này. Mặc dù rất cố gắng để hoàn thành công việc, xong thời gian có hạn và kiến thức chưa nhiều nên việc chương trình còn nhiều thiếu sót cần được bổ xung. Vì vậy chúng em mong nhận được những đóng góp của thầy cô và bạn bè để chương trình ngày càng hoàn thiện hơn và giúp ích được nhiều hơn.2 Phát biểu bài toán Bài toán đặc ra là dùng các giải thuật đã học trong trí tuệ nhân tạo để giải mã một mê cung và tìm đường đi đến vị trí chìa khóa và vị trí cửa cuối cùng.3 Mục đích, yêu cầu cần thực hiện Mục đích của đề tài này là dùng giao diện trực quan mô tả quá quá trình giải mã các thuật toán AStar, Breadth First Search, Depth First Search, Uniform-Cost Search, Greedy Search, Iterative Deepening Search, Beam Search đồng thời tính toán thời gian thực thi của từng thuật toán cho từng không gian trạng thái khác nhau. Bài toán tìm đường đi trong một mê cung dùng để mô phỏng đánh giá các thuật toán trong việc giải mã các mê cung khác nhau, từ đó đưa ra nhận xét và kết luận về việc giải mã mê cung, đánh giá không gian trạng thái cũng như tính toán thời gian thực hiện thuật toán để xác định với mỗi không gian trạng thái khác nhau thì ta cần sử dụng thuật toán nào để tối ưu hóa nhất có thể.

Đồ án học phần này có giá trị như một phần mô phỏng phục vụ cho mục đích giáo dục sau này.1 Môi trường lập trình Với bài tập lớn này chúng em sử dụng Python làm ngôn ngữ chính để viết code với trình soạn thảo code Visual Studio Code và trình biên dịch spyder (anaconda3) 2.2 Thư viện chính sử dụng Thư viện chính được nhóm chúng em sử dụng là pygame. Đây là thư viện mã nguồn mở trên ngôn ngữ Python dùng để lập trình video game. Pygame chứa đầy đủ các công cụ hỗ trợ lập trình game như đồ họa, hoạt hình, âm thanh, và sự kiện điều khiển. Pygame cũng đồng thời cung cấp các công cụ tích hợp hiệu ứng âm thanh cũng như nhạc nền cho game.

Cuối cùng, các sự kiện điều khiển từ bàn phím, chuột cũng được Pygame hỗ trợ một cách hiệu quả. Trong đề tài này, nhóm chúng em sử dụng Pygame để xây dựng giao diện và mô phỏng chuyển động thuật toán. Đầu mỗi file, khai báo thư viện pygame qua câu lệnh ‘import pygame’.3 Giải thuật BFS Thuật toán duyệt đồ thị ưu tiên chiều rộng là thuật toán tìm kiếm mù mà những đỉnh gần với đỉnh gốc sẽ được duyệt trước. Ý tưởng Với đồ thị không trọng số và đỉnh nguồn s.

Đồ thị này có thể là đồ thị có hướng hoặc vô hướng, điều đó không quan trọng đối với thuật toán. Đầu tiên ta thăm đỉnh nguồn s. Việc thăm đỉnh s sẽ phát sinh thứ tự thăm các đỉnh (u1 , u2 ,…up) kề với s (những đỉnh gần s nhất). Tiếp theo, ta thăm đỉnh u1, khi thăm đỉnh u1 sẽ lại phát sinh yêu cầu thăm những đỉnh (v1, v2, …, vp) kề với u1.

Nhưng rõ ràng những đỉnh v này “xa” s hơn những đỉnh uu nên chúng chỉ được thăm khi tất cả những đỉnh uu đều đã được thăm. Tức là thứ tự thăm các đỉnh sẽ là: s, u1 , u2, …, up , v1, v2, …, vp. Mô tả trong code def bfs(GUI, Grid, start, end):   Grid.append((count, start))   states_history = {start}   came_from = {}   while len(states) != 0:     if abortCatch():       return (0, 0)     current = states.pop(0)[1]     if current == end:       came_from.pop(start)       return came_from, count     for nei in Grid.neighbors[flat(current, Grid.size)]:       if (nei in came_from):         if (came_from[nei] not in came_from):           came_from[nei] = current       else:         came_from[nei] = current       if nei not in states_history:         count += 1         states.append((count, nei))         states_history.add(nei)         if nei != end:           simulate(GUI, nei)   return 0, 0 Hình 1. Code cho thuật toán BFS 4 2.4 Giải thuật DFS Thuật toán tìm kiếm theo chiều sâu là một thuật toán duyệt hoặc tìm kiếm trên một cây hoặc một đồ thị.

Thuật toán khởi đầu tại gốc (hoặc chọn một đỉnh nào đó coi như gốc) và phát triển xa nhất có thể theo mỗi nhánh.1 Ý tưởng Đây là thuật toán tìm các đỉnh bằng cách duyệt theo chiều sâu. Đầu tiên ta thăm đỉnh nguồn s. Xuất phát từ 1 đỉnh và đi cho đến khi không thể đi tiếp, sau đó đi về lại đỉnh đầu. Trong quá trình quay lại: Nếu gặp đường đi khác thì đi cho đến khi không đi tiếp được nữa.

Nếu không tìm ra đường đi nào khác thì ngừng việc tìm kiếm. Trong quá trình đi đến đỉnh khác, thuật toán sẽ lưu lại đỉnh cha vừa đi qua để khi đi ngược lại từ đỉnh Kết thúc đến đỉnh Xuất phát, ta có thể xem được đường đi từ đỉnh Kết thúc đến đỉnh Bắt Đầu (có thể số lần đi không ít nhất, các bạn có thể tham khảo thuật toán BFS).2 Mô tả trong code def dfs(GUI, Grid, start, end):   Grid.append((count, start))   states_history = {start}   came_from = {}   while len(states) != 0:     if abortCatch():       return (0, 0)     current = states.pop()[1]     if current == end:       came_from.pop(start) 5       return came_from, count     neis = Grid.neighbors[flat(current, Grid.shuffle(neis)     for nei in neis:       if (nei in came_from):         if (came_from[nei] not in came_from):           came_from[nei] = current       else:         came_from[nei] = current       if nei not in states_history:         count += 1         states.append((count, nei))         states_history.add(nei)         if nei != end:           simulate(GUI, nei)   return 0, 0 Hình 2.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ