ứng dụng của thuật toán tìm kiếm để giải quyết bài toán đường đi trong mê cung

30 0 0
Tài liệu đã được kiểm tra trùng lặp
ứng dụng của thuật toán tìm kiếm để giải quyết bài toán đường đi trong mê cung

Đ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

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

Trang 1

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊNCHUYÊN NGHÀNH KHOA HỌC MÁY TÍNH

VÀ THÔNG TIN

BÁO CÁO SƠ BỘ ĐỀ TÀI CUỐI KỲCẤU TRÚC DỮ LIỆU VÀ GIẢI

THUẬT ĐỀ TÀI:

ỨNG DỤNG CỦA THUẬT TOÁN TÌMKIẾM ĐỂ GIẢI QUYẾT BÀI TOÁN

ĐƯỜNG ĐI TRONG MÊ CUNG

Nhóm: 16

Sinh viên thực hiện: Nguyễn Tuấn AnhĐinh Trường AnLớp: K67A3

Hà Nội, tháng 12, năm 2023

Trang 2

LỜI NÓI ĐẦU 4

NHẬN XÉT CỦA GIẢNG VIÊN 5

PHẦN I: CƠ SỞ LÝ THUYẾT 6

1 Các thuật toán tìm kiếm 6

1.1 Thuật toán tìm kiếm DFS (Tìm kiếm theochiều sâu) 6

1.1.1 Khái niệm 6

1.1.2 Ý tưởng 6

1.1.3 Ví dụ 7

1.1.4 Kết luận về thuật toán DFS 10

1.2 Thuật toán tìm kiếm BFS (Tìm kiếm theochiều rộng) 12

1.2.1 Khái niệm 12

1.2.2 Ý tưởng 13

1.2.3 Ví dụ 14

1.2.4 Kết luận về thuật toán BFS 17

1.3 Thuật toán Dijkstra 19

1.3.1 Khái niệm 19

1.3.2 Ý tưởng 20

1.3.3 Ví dụ 20

1.3.4 Kết luận về thuật toán Dijkstra 25

PHẦN 2: PHÂN TÍCH THIẾT KẾ SƠ BỘ 26

1 Biểu đồ lớp 26

2 Phân tích chương trình 26

Trang 4

LỜI NÓI ĐẦU

Chú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 thuậttoán tìm kiếm trong việc giải quyết bài toán tìm đường đi trongmê cung, một chủ đề quan trọng trong học phần “Cấu trúc dữliệu và thuật toán”.

Bài toán đường đi trong mê cung là một bài toán thú vị và cóứng dụng rộng trong nhiều lĩnh vực, từ robot di chuyển tự độngđến lập kế hoạch đường đi trong hệ thống định tuyến mạng.Mục tiêu của bài toán là tìm một đường đi từ một điểm xuất phátđến một điểm đích trong một mê cung phức tạp Để giải quyếtbài toán này, các thuật toán tìm kiếm được sử dụng để tạo ra cácchiến lược điều hướng thông minh và tìm ra đường đi tối ưu.Báo cáo này nhằm mục đích khám phá và giới thiệu về các thuậttoán tìm kiếm phổ biến trong giải quyết bài toán đường đi trongmê cung Chúng em sẽ giới thiệu các thuật toán như tìm kiếmtheo chiều rộng (BFS), tìm kiếm theo chiều sâu (DFS), thuậttoán A* và thuật toán Dijkstra Mỗi thuật toán sẽ được trình bàychi tiết, bao gồm nguyên lý hoạt động và ưu điểm, nhược điểmcủa chúng.

Chúng em hy vọng rằng báo cáo này sẽ giúp các bạn hiểu rõ hơnvề ứng dụng và lợi ích của việc áp dụng các thuật toán tìm kiếmtrong giải quyết bài toán đường đi trong mê cung Bạn cũng sẽtìm thấy thông tin chi tiết về các thuật toán tìm kiếm và nhữngứng dụng cụ thể của chúng trong thực tế.

Trang 5

NHẬN XÉT CỦA GIẢNG VIÊN

Trang 6

PHẦN I: CƠ SỞ LÝ THUYẾT

1 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ềusâu)

1.1.1 Khái niệm

- Tìm kiếm theo chiều sâu (DFS) là một thuật toán để duyệt quahoặc tìm kiếm cấu trúc dữ liệu dạng cây hoặc đồ thị Thuật toánbắt đầu tại nút gốc (chọn một số nút tùy ý làm nút gốc trongtrường hợp đồ thị) và kiểm tra từng nhánh càng xa càng tốttrước khi quay lui.

- Kết quả của một DFS là một cây bao trùm (spanning tree) Câykhung (spanning tree) là một đồ thị không có vòng lặp Để thựchiện duyệt theo DFS, chúng ta cần sử dụng cấu trúc dữ liệu ngănxế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.

Trang 7

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ằngcá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:

Visited 0

Stack 1 2 30

3

Trang 8

2 Tiếp theo chúng ta truy cập phần từ ở đầu ngăn xếp, tức là 1và đi đến các nút liền kề của nó Vì 0 đã được truy cập nêntiếp theo 2 sẽ được xét:

Visited 0 1Stack 2 3

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 Stackvà duyệt nó:

Visited 0 1 2Stack 4 3

Trang 9

4 Vì đỉnh 4 không còn các đỉnh nào liền kề chưa xét, vì vậy tasẽ duyệt nó và đưa vào Stack

Visited 0 1 2 4Stack 3

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ànthành tìm kiếm theo chiều sâu trong đồ thị ví dụ:

Stack0

Trang 10

VìStacktrống,vậynênchúngtađãhoànthànhviệctìmkiếmtheochiềusâu(DFS) củađồthịtrên

1.1.4 Kết luận về thuật toán DFS1 Độ phức tạp

Trong trường hợp tốt nhất, khi duyệt qua tất cả các đỉnh và cạnhtrong đồ 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ị Tuynhiên, nếu đồ thị không liên thông, thuật toán DFS chỉ duyệt quacá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ạnhtrong 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.

3

Trang 11

- 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 đingắn nhất.

- Dễ rơi vào vòng lặp vô hạn: Nếu đồ thị có chu trình, và khôngcó 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ànbộ đồ thị và tiêu tốn nhiều thời gian và bộ nhớ.

4 Kết luận

Trang 12

- Mặc dù DFS có những ưu điểm như đơn giản, hiệu quả trongtì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ó chutrì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ãitrong 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ấpmột cách tiếp cận đơn giản và linh hoạt để khám phá và tìm hiểuvề các thành phần trong đồ thị.

- Tóm lại, DFS là một thuật toán quan trọng và hữu ích tronglĩnh vực đồ thị, tuy có nhược điểm nhất định, nhưng vẫn đángxem xét và áp dụng trong các bài toán tương ứng.

1.2 Thuật toán tìm kiếm BFS (Tìm kiếm theo chiềurộng)

1.2.1 Khái niệm

- Tìm kiếm theo chiều rộng (BFS) là một thuật toán để duyệt đồthị hoặc cây BFS áp dụng cho cây và đồ thị gần như giống nhau.Sự khác biệt duy nhất là đồ thị có thể chứa các chu trình, vì vậychúng ta có thể duyệt lại cùng một nút Để tránh xử lý lại cùngmột nút, chúng ta sử dụng mảng boolean đã truy cập, mảng này

Trang 13

sẽ đánh dấu các đỉnh đã truy cập BFS sử dụng cấu trúc dữ liệuhàng đợi (queue) để tìm đường đi ngắn nhất trong biểu đồ.- Thuật toán BFS duyệt qua các đỉnh theo cấp độ, bắt đầu từđỉnh gốc và đi sâu vào các đỉnh kề trước khi đi sâu vào các đỉnhkhác Do đó, BFS tìm kiếm theo chiều rộng trong đồ thị vàthường được sử dụng để tìm kiếm đường đi ngắn nhất giữa haiđỉnh trong đồ thị không có trọng số hoặc có trọng số bằng nhautrên các cạnh.

1.2.2 Ý tưởng

- Triển khai BFS tiêu chuẩn sẽ đặt mỗi đỉnh của đồ thị vào mộttrong hai loại: visited, not visited Mục đích của thuật toán làđánh dấu mỗi đỉnh là đã thăm để tránh các chu trình.Cách thuật toán hoạt động như sau:

1 Lấy một đỉnh bất kỳ trong đồ thị thêm vào cuối hàng đợi.2 Lấy phân tử đầu tiên của hàng đợi và thêm nó vào danh sách

đã duyệt.

3 Tạo một danh sách các đỉnh liền kề của đỉnh đang xét Thêmnhững đỉnh không có trong danh sách đã duyệt vào cuối hàngđợi.

4 Tiếp tục lặp lại bước 2 và 3 cho đến khi hàng đợi trống.

Trang 19

của đồ thị Mặc dù nó có nhược điểm như sử dụng không gianlớn và có thể rơi vào vòng lặp vô hạn, nhưng với ưu điểm củamình, BFS vẫn là một công cụ mạnh mẽ trong việc giải quyếtcác bài toán liên quan đến đồ thị.

1.3 Thuật toán Dijkstra1.3.1 Khái niệm

- Theo Wikipedia, thuật toán Dijkstra, mang tên của nhà khoahọc máy tính người Hà Lan Edsger Dijkstra vào năm 1956 và ấnbản năm 1959, là một thuật toán giải quyết bài toán đường đingắn nhất nguồn đơn trong một đồ thị có hướng không có cạnhmang trọng số âm.

- Trọng số không âm là các cạnh mang tính tổng thể hơn làkhoảng cách hình học giữa 2 định, vì vậy thuật toán sẽ có tínhchính xác cao hơn.

- Ví dụ, để biểu diễn đường đi ngắn nhất từ thành phố A đếnthành phố B, chúng ta dùng các đỉnh của đồ thị để thị phạm cácthành phố và các cạnh để biểu diễn các đường nối giữa chúng.Trọng số các cạnh sẽ được xem như độ dài của các con đường,vì vậy mà chúng không âm, nhờ đó thuật toán sẽ chỉ ra conđường ngắn nhất.

- Thuật toán thường được sử dụng trong định tuyến với mộtchương trình con trong các thuật toán đồ thị hay trong côngnghệ Hệ thống định vị toàn cầu (GPS).

Trang 20

1.3.2 Ý tưởng

Ý tưởng cơ bản của thuật toán như sau:

Bước 1: Từ đỉnh gốc, khởi tạo khoảng cách tới chính nó là 00,khởi tạo khoảng cách nhỏ nhất ban đầu tới các đỉnh khác là +∞.Ta được danh sách các khoảng cách tới các đỉnh.

Bước 2: Chọn đỉnh a có khoảng cách nhỏ nhất trong danh sáchnày và ghi nhận Các lần sau sẽ không xét tới đỉnh này nữa.Bước 3: Lần lượt xét các đỉnh kề b của đỉnh a Nếu khoảng cáchtừ đỉnh gốc tới đỉnh b nhỏ hơn khoảng cách hiện tại đang đượcghi nhận thì cập nhật giá trị và đỉnh kề a vào khoảng cách hiệntại của b.

Bước 4: Sau khi xét tất cả đỉnh kề b của đỉnh a Lúc này ta đượcdanh sách khoảng cách tới các điểm đã được cập nhật Quaylại Bước 2 với danh sách này Thuật toán kết thúc khi chọn đượckhoảng cách nhỏ nhất từ tất cả các điểm.

1.3.3 Ví dụ

Để dễ dàng hiểu ý tưởng của thuật toán Chúng ta cùng xem vídụ với đồ thị vô hướng G Thuật toán Dijkstra sẽ tìm khoảngcách từ đỉnh gốc 0 tới tất cả các đỉnh còn lại trong đồ thị G:1 Đầu tiên, khởi tạo khoảng cách nhỏ nhất ban đầu tới các đỉnh

khác là +∞ và khoảng cách tới đỉnh gốc là 0 Ta được danhsách các khoảng cách tới các đỉnh:

0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)

Trang 21

2 Tiếp theo, ta xét các đỉnh kề của đỉnh 0: Xét đỉnh 1, khoảngcách từ đỉnh 0 đến đỉnh 1 là 2.5 < ∞ nên ta nhận giá trị mớilà (2.5,0) (nghĩa là đỉnh liền kề trước là đỉnh 0, khoảng cáchtừ đỉnh 1 đến đỉnh 0 là 2.5) Xét tương tự cho đỉnh 2 và đỉnh3 ta được:

0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)- (2.5, 0) (2.0,0) (2.1,0) (∞,-) (∞,-)

0.80.62.5 1.0

45

Trang 22

3 Sau khi xét tất cả các đỉnh ta chọn đỉnh 2 có khoảng cáchnhỏ nhất và ghi nhận để xét tiếp Tiếp tục xét đỉnh kề của 2là đỉnh 4 và 5 Xét đỉnh 4, khoảng cách từ đỉnh gốc đến đỉnh4 sẽ bằng khoảng cách từ đỉnh gốc tới đỉnh 2 cộng khoảngcách từ 2 đến 4 Nghĩa là 2.0+0.6=2.6 nên ta ghi nhậnkhoảng cách tại đỉnh 4 là (2.6,2) Xét tương tự cho đỉnh 5:

0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)- (2.5, 0) (2.0,0) (2.1,0) (∞,-) (∞,-)- (2.5, 0) - (2.1,0) (2.6,2) (3.5,2)

0.80.62.5 1.0

4 Lúc này ta chọn được đỉnh 3 có khoảng cách nhỏ nhất, xétđỉnh kề của đỉnh 3 là đỉnh 5 Khoảng cách từ gốc tới đỉnh5 là 2.1+2.5=4.6 lớn hơn khoảng cách hiện tại được ghi nhận,vì vậy giá trị tại đỉnh 5 không đổi:

0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)0

45

Trang 23

- (2.5, 0) (2.0,0) (2.1,0) (∞,-) (∞,-)- (2.5, 0) - (2.1,0) (2.6,2) (3.5,2)- (2.5, 0) - - (2.6,2) (3.5,2)

0.80.62.5 1.0

5 Đỉnh 1 là đỉnh được chọn tiếp theo, xét đỉnh kề của 1 là đỉnh4 Khoảng cách từ đỉnh gốc không nhỏ hơn khoảng cách hiệntại nên ta không cập nhật gì ở đỉnh này:

0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)- (2.5, 0) (2.0,0) (2.1,0) (∞,-) (∞,-)- (2.5, 0) - (2.1,0) (2.6,2) (3.5,2)- - - - (2.6,2) (3.5,2)

5

Trang 24

0.80.62.5 1.0

6 Chọn được đỉnh 4 để xét tiếp theo, có đỉnh kề là đỉnh 5 chưaxét, ta có 2.6 + 0.8 = 3.4 < 3.5 nên ta cập nhật giá trị mới chođỉnh 5:

0 (∞,-) (∞,-) (∞,-) (∞,-) (∞,-)- (2.5, 0) (2.0,0) (2.1,0) (∞,-) (∞,-)- (2.5, 0) - (2.1,0) (2.6,2) (3.5,2)- - - - (2.6,2) (3.5,2)

Tới đây thì thuật toán kết thúc vì đã tìm được khoảng cách nhỏnhất đỉnh gốc được chọn là đỉnh 0 đến tất cả các đỉnh.

0.80.62.5 1.0

45

Trang 25

Hình1.3.6:Bước6vídụDijkstra1.3.4 Kết luận về thuật toán Dijkstra1 Độ phức tạp:

Độ phức tạp thời gian của thuật toán Dijkstra là O(V^2), trongđó V là số lượng đỉnh trong đồ thị Điều này đúng khi sử dụngma trận trọng số để lưu trữ các cạnh của đồ thị Tuy nhiên, nếusử dụng danh sách kề, độ phức tạp có thể được cải thiện thànhO((V + E) log V), trong đó E là số lượng cạnh trong đồ thị.2 Ưu điểm của thuật toán Dijkstra:

- Dijkstra là một thuật toán rất mạnh và phổ biến để tìm đườngđi ngắn nhất trong đồ thị có trọng số không âm.

- Nó đảm bảo tìm ra đường đi ngắn nhất từ đỉnh gốc đến tất cảcác đỉnh khác trong đồ thị.

- Dijkstra có thể được sử dụng trong nhiều bài toán thực tế nhưtìm đường đi trong mạng lưới, lập lịch giao thông, tìm đường đitrong hệ thống định tuyến, v.v

3 Nhược điểm của thuật toán Dijkstra:

- Thuật toán Dijkstra không hoạt động đúng với đồ thị có trọngsố âm Nếu đồ thị chứa trọng số âm, cần sử dụng thuật toán khácnhư Bellman-Ford.

- Độ phức tạp của Dijkstra tăng theo cấp số nhân khi số lượngđỉnh tăng lên Vì vậy, nếu đồ thị rất lớn, việc tính toán có thể trởnên chậm chạp.

Trang 26

4 Kết luận:

- Thuật toán Dijkstra là một thuật toán quan trọng và hữu ích đểtìm đường đi ngắn nhất trong đồ thị có trọng số không âm Nócó độ phức tạp thời gian tương đối tốt và có thể được áp dụngtrong nhiều bài toán thực tế Tuy nhiên, cần lưu ý rằng Dijkstrakhông hoạt động với đồ thị có trọng số âm và có thể trở nênchậm chạp khi đồ thị rất lớn.

PHẦN 2: PHÂN TÍCH THIẾT KẾ SƠ BỘ

1 Biểu đồ lớp

….……….Phầnnàynhómemvẫnđangtrongquátrìnhnghiêncứunênchưachorađượcsơđồlớpạ………2 Phân tích chương trình

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ánthực hiện

Trang 27

- Lựa chọn “Diagonal Movements” để có cho đi đường chéo haykhô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ạo1 mê cung ngẫu nhiên như sau:

Trang 28

Sau đó, chúng ta có thể lựa chọn 1 lựa chọn thuật toán ngẫunhiên để giải đường đi trong mê cung, ở đây, chúng ta thử chọnthuật toán tìm kiếm “DFS”:

Trang 29

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:

Trang 30

Hình5:Giải quyết mê cungbằngthuậttoánDijkstra

KẾT LUẬN:

Do vẫn chưa thực hiện xong phần lựa chọn cho người dùng, nênbọn em chỉ báo cáo được tới đây thôi ạ, mong thầy có thể đưa ra1 số nhận xét để bài báo cáo cuối kỳ của bọn em được hoànthiện hơn

Ngày đăng: 14/05/2024, 16:09

Tài liệu cùng người dùng

Tài liệu liên quan