1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Báo cáo bài tập lớn môn Đại số tuyến tính Đề tài thuật toán floyd warshall tìm Đường Đi ngắn nhất

18 2 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 876,79 KB

Nội dung

CHƯƠNG II: GIỚI THIỆU CHUNG Thuật toán Floyd-Warshall là một thuật toán trong lý thuyết đồ thị dùng để tìm đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị có trọng số, bao gồm cả trọng

Trang 1

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH

TRƯỜNG ĐẠI HỌC BÁCH KHOA



BÁO CÁO BÀI TẬP LỚN Môn:  Đại số tuyến tính

Đề tài: Thuật toán Floyd Warshall tìm đường đi ngắn nhất

GVHD:Vũ Thị Bích Trâm

Lớp: L14 Nhóm: 24

 

Trang 2

MỤC LỤC

CHƯƠNG I: MỞ ĐẦU 3

CHƯƠNG II: GIỚI THIỆU CHUNG 4

CHƯƠNG III: CƠ SỞ LÝ THUYẾT 5

3.1 Đồ thị 5

3.1.1 Đồ thị vô hướng 6

3.1.2 Đồ thị có hướng 6

3.2 Ma trận kề của đồ thị 7

3.3 Ma trận trọng số của đồ thị 8

CHƯƠNG IV THUẬT TOÁN FLOYD WARSHALL 10

4.1 Ý tưởng 10

4.2 Thực hiện thuật toán bằng Matlab 11

4.2.1 Câu lệnh sử dụng: 11

4.2.2 Bài code: 12

4.3 Ví dụ: 13

CHƯƠNG V: MỘT SỐ THUẬT TOÁN KHÁC ĐỂ TÌM ĐƯỜNG ĐI NGẮN NHẤT 16

5.1 Thuật toán Dijkstra: 16

5.2 Thuật toán Bellman-Ford: 16

5.3 Thuật toán A*: 16

CHƯƠNG VI: KẾT LUẬN 17

TÀI LIỆU THAM KHẢO 18

Trang 3

CHƯƠNG I: MỞ ĐẦU   Môn học Đại số tuyến tính tại Đại học Bách Khoa TP.HCM cung cấp kiến thức

cơ bản và ứng dụng của đại số tuyến tính trong các bài toán kỹ thuật Nội dung của môn học bao gồm các chủ đề quan trọng như không gian vector, ma trận, định thức,

hệ phương trình tuyến tính, không gian Euclid, ánh xạ tuyến tính, trị riêng – vector riêng, chéo hóa ma trận, và dạng toàn phương

Đại số tuyến tính là môn học quan trọng giúp sinh viên xây dựng nền tảng toán học vững chắc cho các môn cao cấp khác và ứng dụng rộng rãi trong thực tiễn Môn học này cung cấp các công cụ toán học cần thiết để giải quyết các vấn đề kỹ thuật, như mô hình hóa và tối ưu hóa trong các lĩnh vực cơ khí, điện tử, xây dựng,

và xử lý tín hiệu Đồng thời, nó là nền tảng của nhiều phương pháp trong trí tuệ nhân tạo, học máy, và khoa học dữ liệu, giúp sinh viên hiểu sâu về cách phân tích

dữ liệu và áp dụng thuật toán Việc học đại số tuyến tính cũng giúp rèn luyện tư  duy logic và kỹ năng phân tích, từ đó nâng cao khả năng giải quyết vấn đề, một kỹ năng cần thiết cho nhiều ngành nghề kỹ thuật và công nghệ

  Với bài tập lớn này và cùng đề tài mà nhóm chúng em nghiên cứu - Thuật toán Floyd Warshall tìm đường đi ngắn nhất, dù rằng sẽ có những sai sót nhất định, nhưng chúng em sẽ cố gắng hoàn thiện nhất có thể Rất mong rằng sẽ nhận được sự  góp ý của cô và các bạn!

Trang 4

CHƯƠNG II: GIỚI THIỆU CHUNG

  Thuật toán Floyd-Warshall là một thuật toán trong lý thuyết đồ thị dùng để tìm đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị có trọng số, bao gồm cả trọng số

âm Nó là một thuật toán sử dụng phương pháp quy hoạch động, qua đó dần dần cập nhật ma trận khoảng cách giữa các cặp đỉnh thông qua các đỉnh trung gian Đặc điểm nổi bật của thuật toán này là nó không yêu cầu phải biết trước các đỉnh nguồn,

mà tính toán đường đi ngắn nhất cho tất cả các cặp đỉnh trong đồ thị

  Thuật toán được phát triển năm 1962 bởi Robert Floyd và Stephen Warshall, kết hợp các ý tưởng về tìm đường đi ngắn nhất và xác định tính kết nối trong đồ thị

 Ưu điểm:

-Tìm đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị, dễ triển khai và có ứng dụng rộng rãi trong phân tích mạng và tối ưu hóa hệ thống

 Nhược điểm:

-Độ phức tạp và yêu cầu bộ nhớ lớn, không hiệu quả cho đồ thị lớn hoặc khi chỉ cần tìm đường đi từ một nguồn

Ứng dụng:

-Mạng máy tính: Tối ưu hóa đường truyền giữa các nút

-Hệ thống giao thông: Tính toán tuyến đường ngắn nhất

-Phân tích đồ thị xã hội: Tìm mối quan hệ giữa các đối tượng

-Phát hiện chu trình âm: Kiểm tra sự ổn định trong hệ thống tài chính

-Lập lịch và tối ưu hóa: Tối ưu hóa tuyến đường và lịch trình trong vận tải

Trang 5

CHƯƠNG III: CƠ SỞ LÝ THUYẾT

3.1 Đồ thị

 Định nghĩa 1: Đồ thị

 Đồ thịlà một cấu trúc gồm nhiều điểm (gọi là đỉnh hoặc nút) được kết nối với nhau bởi các đường (gọi là cạnh)

 Định nghĩa 2: Đỉnh kề và cạnh liên thuộc

 Hai đỉnh kề nhau:Hai đỉnh được gọi là kề nhau nếu chúng được nối trực tiếp với nhau bởi một cạnh

 Cạnh liên thuộc: Một cạnh được gọi là liên thuộc với hai đỉnh nếu nó nối trực tiếp hai đỉnh đó

 Đỉnh đầu của cạnh:Hai đỉnh mà một cạnh nối đến được gọi là các đỉnh đầu của cạnh đó

 Lưu ý:

  Bậc của đỉnh:Bậc của một đỉnh là số lượng các cạnh liên thuộc với đỉnh đó

Nó cho biết đỉnh đó "nối kết" với bao nhiêu đỉnh khác trong đồ thị

  Đỉnh cô lập:Đỉnh cô lập là đỉnh không có cạnh nào liên thuộc, tức là nó

"đứng một mình" trong đồ thị

  Đỉnh treo:Đỉnh treo chỉ có một cạnh liên thuộc, nó như một "cành cây" lẻ loi trong đồ thị

Trang 6

3.1.1 Đồ thị vô hướng 

Đồ thị vô hướng G là một cặp không có thứ tự G=(V, E), trong đó:

-V  là tập các đỉnh hoặc nút

- E là tập các cạnh Hai đỉnh thuộc một cạnh được gọi là các đỉnh đầu

cuối của cạnh đó

 Hình 3a Đồ thị vô hướng

3.1.2 Đồ thị có hướng

Đồ thị có hướng G là một cặp có thứ tự  G=(V, A), trong đó:

-V  là tập các đỉnh hoặc nút

- A là tập các cạnh có hướng hoặc gọi là cung

 Lưu ý: Một cạnhe = (u, v)được coi là có hướng từ u tớiv; khi đóu được gọi

là điểm đầu/gốc và v được gọi là điểm cuối/ngọn của cạnh

 Hình 3b Đồ thị có hướng

Trang 7

3.2 Ma trận kề của đồ thị

Khái niệm: Xét đồ thị G=(X, U) (có hướng hay vô hướng), giả sử tập X gồm

n đỉnh và được sắp thứ tự X={x1, x2, ,xn}, tập U gồm n cạnh và được sắp thứ tự U={u1, u2, ,un}

Ma trận kề của đồ thị G, ký hiệu A(G), là một ma trận nhị phân cấp n x n được định nghĩa như sau: A=(Aij) với:x

• A=(Aij)= 1 nếu có cạnh nối xi tới xj

• A=(Aij) = 0 nếu không có cạnh nối xi tới x j

Ví dụ:

 Hình 3c Đồ thị vô hướng G1 và Ma trận kề A1 của G1

 Nhận xét: Trong trường hợp đồ thị vô hướng, ma trận sẽ đối xứng qua đường chéo vì với mỗi cạnh (i, j) thì cũng sẽ có một cạnh (j, i) tương ứng

 Hình 3d Đồ thị có hướng G2 và Ma trận kề A2 của G2

Trang 8

➢ Ưu điểm:

Đơn giản, dễ cài đặt, dễ dàng kiểm tra 2 đỉnh có kề nhau hay không bằng cách kiểm tra giá trị của Aij

➢ Nhược điểm:

Tốn bộ nhớ nên không thể biểu diễn được đồ thị với số đỉnh lớn

3.3 Ma trận trọng số của đồ thị

Khái niệm: Xét đồ thị G=(X, U) (có hướng hay vô hướng), giả sử tập X gồm n đỉnh và được sắp thứ tự X={x1, x2, , xn}, tập U gồm n cạnh và được sắp thứ 

tự U={u1, u2, , un}

Ma trận kề của đồ thị G, ký hiệu B(G), là một ma trận cấp n x n được định nghĩa như sau: B=(Bij) với:

• B=(Bij)=trọng số của cạnh nối i và j nếu có cạnh nối xi tới x j

• B=(Bij) = 0 nếu không có cạnh nối xi tới x j

 Như vậy, ma trận trọng số được xem là gần giống với ma trận kề, tuy nhiên

ma trận kề chỉ biểu diễn 0 và 1 tượng trưng cho việc 2 đỉnh có kề nhau hay không, còn ma trận trọng số biểu diễn thêm cả trọng số của cạnh/cung nối 2 đỉnh đó nếu chúng kề nhau.

Ví dụ:

 Hình 3e Đồ thị vô hướng G1 và Ma trận trọng số B1 của G1

 Nhận xét: Trong trường hợp đồ thị vô hướng, ma trận sẽ đối xứng qua

đường chéo vì với mỗi cạnh (i, j) có trọng số a thì cũng sẽ có một cạnh (j, i) có trọng số a tương ứng.

Trang 9

 Hình 3f Đồ thị có hướng G2 và Ma trận trọng số B2 của G2

Trang 10

CHƯƠNG IV THUẬT TOÁN FLOYD WARSHALL

4.1 Ý tưởng

  Từ bài toán đã cho, ta chuyển các số liệu về dạng ma trận trọng số A

  Ban đầu, mỗi phần tử A[i,j] được lấp đầy bởi khoảng cách nối trực tiếp từ đỉnh i tới đỉnh j; nếu độ dài đường đi từ đỉnh i tới đỉnh j chưa xác định được ô đó sẽ có giá trị là∞ Trên đường chéo chính của ma trận, các phần tử có giá trị là 0 (bởi độ dài đường đi từ một đỉnh đến chính nó bằng 0)

  Sau mỗi vòng lặp, giá trị các phần tử của ma trận A sẽ dần được thay thế bằng các giá trị nhỏ hơn giá trị trước đó (nếu có), chính là độ dài một đường đi từ i đến j ngắn hơn (có thể từ i đi qua đỉnh khác rồi đến j)

  Sau bước lặp thứ k, A[i,j] chứa độ dài đường đi ngắn nhất từ đỉnh i đến đỉnh j (có

thể từ i đi qua đỉnh khác rồi đến j), các đỉnh nó đi qua có chỉ số không vượt quá k

Từ ý tưởng trên, việc xử lý bài toán được triển khai thành các bước cụ thể:

  ➢ Bước 1: Viết ma trận trọng số A của đồ thị

  ➢ Bước 2: Chọn lần lượt từng đỉnh của đồ thị làm đỉnh trung gian Giả sử chọn   đỉnh k làm đỉnh trung gian, ta giữ nguyên hàng k, cột k của ma trận A, giữ    nguyên các phần tử trên đường chéo của A

  ➢ Bước 3: Kí hiệu  A  k  là ma trận A sau lần lặp thứ k, khi đó  A  k  [i,j] được tính   theo công thức sau:

  ➢ Bước 4: Sau đó, ta thực hiện n lần lặp Sau lần lặp thứ n, ma trận A sẽ chứa

  độ dài các đường đi ngắn nhất chỉ đi qua các đỉnh thuộc {1,2, ,k}

  ➢ Bước 5: Do đó, sau n lần lặp ta nhận được ma trận A chứa độ dài các đường

  đi ngắn nhất

 Ak [i,j] = min( Ak −1[i,j], A k −1[i,k] + Ak −1[k,j] )

Trang 11

4.2 Thực hiện thuật toán bằng Matlab

4.2.1 Câu lệnh sử dụng:

clc clc Xóa tất cả văn bản khỏi Cửa sổ Lệnh,

dẫn đến màn hình trống

input A = input (prompt) Hiển thị văn bản trong prompt và đợi

người dùng nhập giá trị Gía trị đó được lưu vào biến A

length B = length(X) Trả về độ dài của kích thước mảng

lớn nhất trong X Đối với vectơ, độ dài chỉ đơn giản là số phần tử Đối với các mảng có nhiều kích thước hơn, độ

dài là max(size(X))

for for index = values

statements;

end

Thực hiện một nhóm các câu lệnh trong một vòng lặp trong một số lần

xác định

(fileID, formatSpec, A  1,…

 An)

Áp dụng formatSpec cho tất cả các phần tử của mảng A1, An theo thứ tự  cột và ghi dữ liệu vào tệp văn bản disp disp(X) Hiển thị giá trị của biến X mà không

in tên biến

Trang 12

4.2.2 Bài code:

clc;

% Nhập ma trận A từ người dùng

A = input('Nhap vao ma tran A (ma tran vuong): ');

% Kiểm tra nếu ma trận không vuông

[n, m] = size(A);

if n ~= m

error('Ma tran phai la ma tran vuong!');

end

fprintf('Ma tran ban dau la:\n');

disp(A);

% Áp dụng thuật toán Floyd-Warshall

for k = 1:n

  for i = 1:n

  for j = 1:n

  % Kiểm tra điều kiện có thể cập nhật đường đi ngắn nhất

  if A(i,k) < Inf && A(k,j) < Inf && A(i,j) > A(i,k) + A(k,j)

  A(i,j) = A(i,k) + A(k,j);

  end

  end

end

fprintf('Ma tran duong di ngan nhat la:\n');

disp(A);

Trang 13

4.3 Ví dụ:

Bạn Trung vừa chuyển nhà đến một khu phố mới và bạn không biết nên di chuyển như thế nào giữa các địa điểm trong khu phố để tiết kiệm thời gian và công sức Dưới đây là bản vẽ thể hiện khu phố mới nơi bạn Nam sống, hãy giúp bạn Nam bằng cách ứng dụng thuật toán Floyd-Warshall lập ma trận đường đi ngắn nhất

  Từ đề bài ta thiết lập được ma trận trọng số:

  Quy ước các phần tử của ma trận trên:

  • Phần tử xij là số 0: khoảng cách từ một đỉnh đến chính nó

  • Phần tử xijlà số thực: trọng số (độ dài) đường đi nối trực tiếp từ  xi đến x j

  • Phần tử xij là ∞: trọng số (độ dài) đường đi chưa xác định

Trang 14

Minh họa các bước biến đổi ma trận đề bài thành ma trận đường đi ngắn nhất theo thuật toán Floyd – Warshall:

 

Trang 15

 Dưới đây là kết quả bài toán sử dụng thuật toán từ chương trình Matlab thiết lập phía trên:

  Kết luận: Từ kết quả trên, ta dễ dàng giúp bạn Trung tìm được đường đi ngắn nhất giữa những địa điểm trong khu phố

Trang 16

CHƯƠNG V: MỘT SỐ THUẬT TOÁN KHÁC ĐỂ

TÌM ĐƯỜNG ĐI NGẮN NHẤT

5.1 Thuật toán Dijkstra:  

Thuật toán Dijkstra là một trong những thuật toán nổi tiếng để tìm đường đi ngắn nhất từ một đỉnh đến các đỉnh còn lại trong đồ thị có trọng số không âm

- Cách thức: Thuật toán sử dụng phương pháp tham lam (greedy) để mở rộng dần dần tập các đỉnh có đường đi ngắn nhất Mỗi lần, thuật toán chọn đỉnh chưa được xử lý với khoảng cách nhỏ nhất và cập nhật các đỉnh kề với nó

- Ứng dụng: Tìm đường đi ngắn nhất trong các mạng giao thông, đường truyền trong mạng máy tính

5.2 Thuật toán Bellman-Ford:

Thuật toán Bellman-Ford có thể tìm đường đi ngắn nhất từ một đỉnh đến các đỉnh còn lại trong đồ thị, ngay cả khi đồ thị có trọng số âm, miễn là không có chu trình âm

- Cách thức: Thuật toán lặp lại quá trình "giải quyết" mỗi cạnh trong đồ thị nhiều lần (V-1 lần, với V là số đỉnh) để cập nhật khoảng cách ngắn nhất từ đỉnh nguồn đến các đỉnh khác

- Ứng dụng: Tìm đường đi ngắn nhất trong các đồ thị có trọng số âm (ví dụ: các bài toán tài chính hoặc mạng máy tính với các chi phí âm)

5.3 Thuật toán A*:

Thuật toán A* (A-star) là một thuật toán tìm kiếm tốt nhất, kết hợp giữa Dijkstra và phương pháp tìm kiếm theo chiều sâu, sử dụng một hàm ước lượng (heuristic) để tối ưu hóa tìm kiếm

- Cách thức: A* sử dụng một hàm chi phí tổng hợp f(n)=g(n)+h(n)f(n) = g(n) + h(n) trong đó g(n) là chi phí từ đỉnh bắt đầu đến đỉnh hiện tại và h(n) là ước lượng chi phí từ đỉnh hiện tại đến đích Thuật toán sẽ chọn đỉnh có giá trị f(n) nhỏ nhất để tiếp tục mở rộng

- Ứng dụng: A* thường được sử dụng trong các bài toán tìm đường đi ngắn nhất trong các trò chơi, bản đồ, hoặc các hệ thống điều hướng

Trang 17

CHƯƠNG VI: KẾT LUẬN

Chúng em vừa thực hiện xong việc nghiên cứu đề tài “Áp dụng thuật toán Floyd Warshall tìm đường đi ngắn nhất” Thông qua đề tài, chúng em đã vững vàng hơn các kiến thức quan trọng trong chương trình học môn Đại số tuyến tính, cũng như  rèn luyện thêm được khả năng tư duy logic, giải quyết vấn đề một cách khoa học Cảm ơn cô đã tạo điều kiện cho chúng em được tiếp xúc với một đề tài thú vị và có

cơ hội trau dồi thêm kiến thức của mình!

Trang 18

TÀI LIỆU THAM KHẢO

[1] Đại số tuyến tính - Đặng Văn Vinh

[2]https://www.mathworks.com/matlabcentral/fileexchange/11549-floyd-shortest-path-routing

Ngày đăng: 09/12/2024, 05:06

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w