LỜI NÓI ĐẦUChúng em xin trân trọng giới thiệu báo cáo “Ứng dụng thuậttoán tìm kiếm trong giải quyết bài toán đường đi trong mê cung”.Báo cáo này tập trung vào việc khám phá và ứng dụng c
CƠ SỞ LÝ THUYẾT
Các thuật toán tìm kiếm
1.1 Thuật toán tìm kiếm DFS (Tìm kiếm theo chiều sâu)
- Tìm kiếm theo chiều sâu (DFS) là một thuật toán để duyệt qua hoặc tìm kiếm cấu trúc dữ liệu dạng cây hoặc đồ thị Thuật toán bắt đầu tại nút gốc (chọn một số nút tùy ý làm nút gốc trong trường hợp đồ thị) và kiểm tra từng nhánh càng xa càng tốt trước khi quay lui.
- Kết quả của một DFS là một cây bao trùm (spanning tree) Cây khung (spanning tree) là một đồ thị không có vòng lặp Để thực hiện duyệt theo DFS, chúng ta cần sử dụng cấu trúc dữ liệu ngăn xếp có kích thước tối đa bằng tổng số đỉnh trong biểu đồ. 1.1.2 Ý tưởng Để cài đặt DFS, ta cần thực hiện các bước sau:
1 Lấy một đỉnh bất kỳ trong đồ thì đưa vào ngăn xếp.
2 Lấy top value của ngăn xếp để duyệt và thêm vào visited list.
3 Tạo một list bao gồm các đỉnh liền kề của đỉnh đang xét,
4 thêm những đỉnh không có trong visited list vào ngăn xếp.
5 Tiếp tục lặp lại bước 2 và bước 3 đến khi ngăn xếp rỗng. 1.1.3 Ví dụ
Hãy xem thuật toán tìm kiếm DFS hoạt động thế nào với 1 ví dụ. Chúng ta có 1 đồ thị vô hướng 5 đỉnh:
1 Chúng ta bắt đầu từ đỉnh 0, thuật toán DFS bắt đầu bằng cách đưa nó vào Visited và đưa tất cả các cạnh liền kề đỉnh đang xét vào Stack:
2 Tiếp theo chúng ta truy cập phần từ ở đầu ngăn xếp, tức là 1 và đi đến các nút liền kề của nó Vì 0 đã được truy cập nên tiếp theo 2 sẽ được xét:
3 Chúng ta đang xét tới đỉnh 2, đỉnh 2 có 1 nút liền kề chưa được xét là 4, vì vậy ta thêm đỉnh đó vào vị trí đầu của Stack và duyệt nó:
4 Vì đỉnh 4 không còn các đỉnh nào liền kề chưa xét, vì vậy ta sẽ duyệt nó và đưa vào Stack
5 Và cuối cùng là duyệt đỉnh 3 trong Stack, nó cũng không có bất kỳ đỉnh liền kề nào chưa được duyệt, vì thế ta đã hoàn thành tìm kiếm theo chiều sâu trong đồ thị ví dụ:
VìStacktrống,vậynênchúngtađãhoànthànhviệctìm kiếmtheochiềusâu(DFS) củađồthịtrên
1.1.4 Kết luận về thuật toán DFS
Trong trường hợp tốt nhất, khi duyệt qua tất cả các đỉnh và cạnh trong đồ thị, độ phức tạp thời gian của DFS là O(V + E), trong đó V là số lượng đỉnh và E là số lượng cạnh trong đồ thị Tuy nhiên, nếu đồ thị không liên thông, thuật toán DFS chỉ duyệt qua các đỉnh thuộc thành phần liên thông chứa đỉnh bắt đầu, do đó độ phức tạp thời gian có thể là O(V + E') với E' là số lượng cạnh trong thành phần liên thông chứa đỉnh bắt đầu.
2 Ưu điểm của thuật toán DFS
- Đơn giản và dễ hiểu: Thuật toán DFS dễ dàng triển khai và hiểu, không yêu cầu nhiều kiến thức phức tạp.
- Hiệu quả trong tìm kiếm đường đi: DFS có thể tìm kiếm đường đi từ một đỉnh đến một đỉnh khác trong đồ thị Nếu có một đường đi tồn tại, DFS sẽ tìm ra đường đi đầu tiên mà nó gặp được.
- Sử dụng ít bộ nhớ: Thuật toán DFS chỉ sử dụng một ngăn xếp để lưu trữ các đỉnh trong quá trình duyệt, do đó tiêu thụ ít bộ nhớ hơn so với thuật toán BFS (Breadth-First Search).
3 Nhược điểm của thuật toán DFS
- Không tìm kiếm tối ưu: DFS không đảm bảo tìm kiếm đường đi ngắn nhất trong đồ thị Nếu có nhiều đường đi từ đỉnh A đến đỉnh B, DFS có thể tìm ra một đường đi dài hơn so với đường đi ngắn nhất.
- Dễ rơi vào vòng lặp vô hạn: Nếu đồ thị có chu trình, và không có cơ chế để kiểm tra và tránh việc lặp lại các đỉnh, DFS có thể rơi vào vòng lặp vô hạn, không bao giờ kết thúc.
- Phụ thuộc vào thứ tự duyệt: Kết quả của thuật toán DFS có thể thay đổi dựa trên thứ tự duyệt qua các đỉnh Nếu thứ tự duyệt được thay đổi, kết quả cũng sẽ thay đổi.
- Không phù hợp cho đồ thị lớn và sâu: Nếu đồ thị rất lớn và có độ sâu lớn, DFS có thể gặp khó khăn trong việc duyệt qua toàn bộ đồ thị và tiêu tốn nhiều thời gian và bộ nhớ.
- Mặc dù DFS có những ưu điểm như đơn giản, hiệu quả trong tìm kiếm đường đi và sử dụng ít bộ nhớ, nhưng nó cũng có nhược điểm DFS không đảm bảo tìm kiếm đường đi ngắn nhất, có thể rơi vào vòng lặp vô hạn trong trường hợp đồ thị có chu trình, phụ thuộc vào thứ tự duyệt và khó khăn khi áp dụng cho đồ thị lớn và sâu.
- Tuy nhiên, thuật toán DFS vẫn có giá trị và ứng dụng rộng rãi trong việc giải quyết các bài toán liên quan đến tìm kiếm, đường đi, cấu trúc dữ liệu đồ thị và nhiều lĩnh vực khác Nó cung cấp một cách tiếp cận đơn giản và linh hoạt để khám phá và tìm hiểu về các thành phần trong đồ thị.
PHÂN TÍCH THIẾT KẾ SƠ BỘ
Chương trình sẽ đưa ra những sự lựa chọn sau cho người dùng:
- Tùy chỉnh số lượng “Rows” và “Columns” cho lưới
- Lựa chọn “Make Maze” để tạo ra 1 mê cung ngẫu nhiên
- Lựa chọn “Clear” để xóa tiến trình hiện tại đang thực hiện
- Lựa chọn “Animation” để thực hiện quá trình tìm kiếm điểm đích và tìm đường đi ngắn nhất từ điểm đầu được chọn đến điểm đích đó
- Các lựa chọn “DFS”, “BFS”, “Dijkstra” để lựa chọn thuật toán thực hiện
- Lựa chọn “Diagonal Movements” để có cho đi đường chéo hay không
- Ngoài ra còn 1 số những chú thích trên giao diện dùng để chú thích cho người dùng hiểu được chức năng của nó
Sau khi lựa chọn “Make Maze” thì chương trình sẽ thực hiện tạo
1 mê cung ngẫu nhiên như sau:
Sau đó, chúng ta có thể lựa chọn 1 lựa chọn thuật toán ngẫu nhiên để giải đường đi trong mê cung, ở đây, chúng ta thử chọn thuật toán tìm kiếm “DFS”:
Hình4:Giảiquyếtmêcungbằng thuậttoánDFSHoặc chúng ta cũng có thể chọn thuật toán Dijkstra: