You are on page 1of 27

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

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


KHOA KHOA HỌC ỨNG DỤNG

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

LỚP L01 – NHÓM 5 – HK231

Giảng viên hướng dẫn: Thầy Đặng Văn Vinh


PAGE \* MERGEFORMAT 23

DANH SÁCH THÀNH VIÊN NHÓM


Môn: ĐẠI SỐ TUYẾN TÍNH
Lớp L01 – Nhóm 5
Đề tài: Thuật toán Floyd - Warshall tìm đường đi ngắn nhất

STT Sinh viên thực hiện MSSV Họ



tên
1 Hồ Tú Anh 2310081

2 Hồ Quốc Cường 2310383

3 Hồ Hạo Khang 2311413

4 Hoàng Lê Trung Kiên 2311728

5 Hồ Hữu Minh Nhật 2312468

6 Huỳnh Công Danh 2310411

7 Hồ Đức Toàn 2313477


nhóm trưởng: Hồ Quốc Cường
Email: cuong.hoquoc@hcmut.edu.vn
Nhận xét của giảng viên: .........................................................................................
....................................................................................................................................

GIẢNG VIÊN NHÓM TRƯỞNG


(Ký và ghi rõ họ tên) (Ký và ghi rõ họ tên)
PAGE \* MERGEFORMAT 23

MỤC LỤC

I. GIỚI THIỆU VỀ LÝ THUYẾT ĐỒ THỊ......................................................................................4


1. Tóm tắt về lịch sử của lý thuyết đồ thị:........................................................................................4
2. Sơ lược về đồ thị:.........................................................................................................................4
2.1. Các khái niệm cơ bản về đồ thị:...............................................................................................4
2.2. Các khái niệm trong lý thuyết đồ thị:.......................................................................................6
3. Biểu diễn đồ thị trên máy tính:.....................................................................................................7
II. MÔ TẢ LÝ THUYẾT MA TRẬN KỀ CỦA ĐỒ THỊ CÓ HƯỜNG VÀ VÔ HƯỚNG:..........7
III. SƠ LƯỢC VỀ FLOYD – WARSHALL:....................................................................................9
1. Giới thiệu:.....................................................................................................................................9
2. Đặt vấn đề:..................................................................................................................................10
IV. MÔ TẢ VÀ CÁCH TRIỂN KHAI THUẬT TOÁN FLOYD – WARSHLL:........................10
1. Ý tưởng của thuật toán:..............................................................................................................10
2. Mô tả thuật toán:.........................................................................................................................10
3. Các bước giải bài toán:...............................................................................................................12
4. Triển khai thuật toán bằng C++:................................................................................................13
V. VÍ DỤ VÀ CÁC BÀI TOÁN ỨNG DỤNG:................................................................................15
1. Ví dụ 1:.......................................................................................................................................15
2. Ví dụ 2:.......................................................................................................................................17
3. Ví dụ 3:.......................................................................................................................................18
4. Ví dụ 4:.......................................................................................................................................19
5. Ví dụ 5:.......................................................................................................................................20
6. Ví dụ 6:.......................................................................................................................................21
VI. KẾT LUẬN:.................................................................................................................................23
VII. TỔNG KẾT:...............................................................................................................................23
VIII. TÀI LIỆU THAM KHẢO:......................................................................................................24
PAGE \* MERGEFORMAT 23

LỜI MỞ ĐẦU
Với sự phát triển và cải tiến của khoa học kĩ thuật, hiện nay, tất cả các trường học đều đã và đang
áp dụng các hiểu biết, kiến thức và kĩ năng về công nghệ thông tin trong các môn học, nhằm mục
đích nâng cao hiệu quả hoạt động học tập và giảng dạy.
Trong lĩnh vực Toán-Tin, thuật toán tìm đường đi ngắn nhất dựa vào đồ thị là một thuật toán được
vận dụng khá nhiều trong các ứng dụng tin học. Với các ứng dụng thực tiễn, bài toán tìm đường đi
ngắn nhất giữa hai đỉnh của một đồ thị mang ý nghĩa vô cùng quan trọng. Ví dụ, đó chính là bài toán
tìm hành trình tiết kiệm nhất (về tiêu chuẩn khoảng cách và thời gian) của “Google map” trên một
mạng lưới giao thông. Hiện nay, có rất nhiều phương pháp khác nhau để giải quyết bài toán này.
Nhưng các thuật toán được xây dựng dựa trên cơ sở lý thuyết đồ thị thì mang đến hiệu quả cao nhất.
Và sau đây, chúng ta cùng đề cập tới thuật toán FloydWarsall thuật toán tìm đường đi ngắn nhất dựa
trên lý thuyết đồ thị.
Mong thầy cùng các bạn theo dõi và góp ý để chủ đề của chúng em được hoàn thiện hơn.
PAGE \* MERGEFORMAT 23

I. GIỚI THIỆU VỀ LÝ THUYẾT ĐỒ THỊ


1. Tóm tắt về lịch sử của lý thuyết đồ thị:
Một trong những kết quả đầu tiên của lý thuyết đồ thị xuất hiện trong bài báo của Leonhard Euler
về Bảy cây cầu ở Königsberg, xuất bản năm 1736. Bài toán đặt ra là tìm tuyến đường đi qua mỗi cây
câu một lần và chỉ đúng một lần (bất kể điểm xuất phát hay điểm tới), Leonhard Euler đã chứng
minh bài toán này không có lời giải và nó cũng chính là cơ sở phát triển của lý thuyết đồ thị. Năm
1845, Gustav Kirchhoff đưa ra Định luật Kirchhoff cho mạch điện để tính điện thế và cường độ dòng
điện trong mạch điện. Năm 1852 Francis Guthrie đưa ra bài toán bốn màu về vấn đề liệu chỉ với bốn
màu có thể tô màu một bản đồ bất kì sao cho không có hai nước nào cùng biên giới được tô cùng
màu. Bài toán này được xem như đã khai sinh ra lý thuyết đồ thị, và được giải vào năm 1976 bởi
Kenneth Appel và Wolfgang Haken. Trong khi cố gắng giải quyết bài toán này, các nhà toán học đã
phát minh ra nhiều thuật ngữ và khái niệm nền tảng cho lý thuyết đồ thị.
Mặc dù lý thuyết đồ thị đã phát triển từ rất lâu nhưng lại có nhiều ứng dụng hiện đại. Đặc biệt là
trong khoảng vài mươi năm trở lại đây, cùng với sự ra đời của máy tính và sự phát triển nhanh chóng
của Tin học. Lý thuyết đồ thị được quan tâm nhiều hơn. Vậy nên các thuật toán trên đồ thị đượ ứng
dụng vào nhiều lính vực khác nhau như: Mạng máy tính, mật mã, kinh tế v.v…. Và một trong số đó
là Thuật toán Đường đi ngắn nhất Floyd – Warshall, một trong những ứng dụng của lý thuyết đồ thị.
2. Sơ lược về đồ thị:
2.1. Các khái niệm cơ bản về đồ thị:
a. Định nghĩa về đồ thị (Graph):
Là một cấu trúc rời rạc gồm các đỉnh và các cạnh nối các đỉnh đó với nhau. Được mô tả dưới hình
thức:
G = (V, E)
V được gọi là các đỉnh của đồ thị (Vertices) và E gọi là các cạnh của đồ thị (Edges). Có thể coi E
là tập các cặp (u, v) với u, v là hai đỉnh của V.

Hình 1. Sơ đồ mạng máy tính


PAGE \* MERGEFORMAT 23

Hình 2. Cấu trúc phân tử hóa học


b. Phân loại đồ thị:
Có thể phân loại đồ thị theo đặc tính và số lượng của tập các cạnh E:
Cho đồ thị G = (V, E). Định nghĩa một cách hình thức
G được gọi là đơn đồ thị nếu giữa hai đỉnh u, v của V có nhiều nhất 1 cạnh trong E nối từ u tới v.

Hình 3. Đơn đồ thị vô hướng


PAGE \* MERGEFORMAT 23

G được gọi là đa đồ thị nếu hai đỉnh u, v của V có thể có nhiều hơn 1 cạnh trong E nối từ u tới v
(Hiển nhiên đơn đồ thị cũng là một đa đồ thị).

Hình 4. Đa đồ thị vô hướng

G được gọi là đồ thị vô hướng (undirected graph) nếu các cạnh trong E là không định hướng, tức
là cạnh nối hai đỉnh u, v bất kỳ cũng là cạnh nối hai đỉnh v, u. Hay nói tập E gồm các cặp (u, v)
không tính thức tự ( (u, v) = (v, u) ). Hình 2 và Hình 3 là các đồ thị vô hướng.
G được gọi là đồ thị có hướng (directed graph) nếu các cạnh trong E là có định hướng, có thể có
cạnh nối từ đỉnh u tới đỉnh v nhưng chưa chắc có cạnh nối từ đỉnh v tới đỉnh u. Hay nói cách khác
tập E gồm các cặp (u, v) có thứ tự: (u, v) ≠ (v, u). Cạnh trong đồ thị có hướng được gọi là cung.

Hình 5. Đơn đồ thị có hướng

2.2. Các khái niệm trong lý thuyết đồ thị:


Cạnh liên thuộc, đỉnh kề, bậc
Đối với đồ thị vô hướng G = (V, E). Xét một cạnh e ∈ E, nếu e = (u, v) thì ta nói hai đỉnh u và v là
kề nhau (adjacent) và cạnh e liên thuộc (incident) với đỉnh u và đỉnh v.
PAGE \* MERGEFORMAT 23

Với một đỉnh v trong đồ thị, ta định nghĩa bậc (degree) của v kí hiệu là deg(v) là số cạnh liên
thuộc với v.
Với mỗi đỉnh v trong đồ thị có hướng, ta định nghĩa bán bậc ra của v ký hiệu là deg +(v) là số
cung đi ra khỏi nó; bán bậc vào ký hiệu deg-(v) là số cung đi vào đỉnh đó.
3. Biểu diễn đồ thị trên máy tính:
Có 3 cách để biểu diễn đồ thị trên máy tính đó là ma trận kề, danh sách kề và danh sách cạnh.
II. MÔ TẢ LÝ THUYẾT MA TRẬN KỀ CỦA ĐỒ THỊ CÓ HƯỜNG VÀ VÔ HƯỚNG:
Giả sử G = (V, E) là một đơn đồ thị có số đỉnh (ký hiệu | V |) là n, không mất tính tổng quát có
thể coi các đỉnh đánh số 1, 2, …, n. Khi đó ta có thể biểu diễn đồ thị bằng một ma trận vuông A =
[aij] cấp n. Trong đó:
aij = 1 nếu (i,j) ∈ E
aij = 0 nếu (i, j) ∉ E
Quy ước aij = 0 ∀ i;
Đối với đa đồ thị thì việc biểu diễn cũng tương tự trên, chỉ có điều nếu (i, j) là cạnh thì không phải
ta ghi số 1 vào aij mà ghị số cạnh nối giữa đỉnh i và j.
Ví dụ: Cho đồ thì G gồm 3 đỉnh như hình vẽ:

2
1 0 0 1
A= 0 0 1
1 1 0

Ma trận A là ma trận kề biểu diễn đồ thị G. Ở ma trận này với mỗi cạnh nối giữa 2 đỉnh sẽ được
ghi là 1 còn không có cạnh nối nào thì là 0, đỉnh 1 nối với đỉnh 3 nên ta có a 13 và a31 sẽ bằng 1; đỉnh
2 và đỉnh 1 không có cạnh nối nên a21 = a12 = 0. Với các phần tử của ma trận A trên đường chéo chính
sẽ bằng 0 vì tại các phần tử này trên đồ thị các đỉnh không có cạnh nối nào với chính nó.
Dưới đây là mô tả của một đồ thị có hướng gồm 5 đỉnh và ma trận kề biểu diễn đồ thị đó:
PAGE \* MERGEFORMAT 23

Hình 6. Đồ thị và ma trận kề biểu diễn

Đối với ma trận có trọng số

2
1 0 0 3
1 A1 = 0 0 1
3 1 0
3

Với các đỉnh được nối với nhau bằng cạnh có trọng số khác 1 thì ta sẽ biểu diễn ma trận kề với
các phần tử trong ma trận là các trọng số đó. Ví dụ ở ma trận A 1 ta có đỉnh 1 nối với đỉnh 3 bằng
cạnh có trọng số bằng 3 thì ở đồ thi vô hướng ta có a 13 = a31 = 3; tương tự thì ma trận có hướng cũng
vậy.
Các tính chất của ma trận kề:
Đối với đồ thị vô hướng G, thì ma trận kề tương ứng là ma trận đối xứng (a ji = aij), điều này không
đúng với đồ thị có hướng.
Nếu G là đồ thị vô hướng và A là ma trận kề tương ứng thì trên ma trận A:
Tổng các số trên hàng i = Tổng các số trên cột i = Bậc của đỉnh i = deg(i).
Nếu G là đồ thị có hường và A là ma trận kề tương ứng thì trên ma trận A:
Tổng các số trên hàng i = Bán bậc ra của đỉnh i = deg+(i).
Tổng các số trên cột i = Bán bậc vào của đỉnh i = deg-(i).
PAGE \* MERGEFORMAT 23

Trong trường hợp G là đơn đồ thị, ta có thể biểu diễn ma trận kề A tương ứng là các phần tử logic.
aij = TRUE nếu (i, j) ∈ R và aij = FALSE nếu (i, j) ∉ E.
Ưu điểm của ma trận kề:
Đơn giản, trực quan, dễ cài đặt trên máy tính.
Để kiểm tra xem hai đỉnh (u, v) của đồ thị có kề nhau hay không, ta chỉ việc kiểm tra bằng một
phép so sánh: auv ≠ 0.
Nhược điểm của ma trận kề:
Bất kể số cạnh của đồ thị ít hay nhiều, ma trận kề luôn đòi hỏi n 2 ô nhớ để lưu các phần tử.
Điều này gây lãng phí bộ nhớ, dẫn đến không biểu diễn được các số đỉnh lớn.
Với một đỉnh u bất kỳ của đồ thị, nhiều khi ta phải xét tất cả cac đỉnh v kề với nó, hoặc xét tất
cả các cạnh liên thuộc với nó. Điều này gây lãng phí thời gian.
III. SƠ LƯỢC VỀ FLOYD – WARSHALL:
1. Giới thiệu:
Khi nhắc đến thuật toán để tìm đường đi ngắn nhất trong đồ thị, chúng ta có thể liên hệ tới những
thuật toán với thời gian chạy cho phép như Duyệt rộng (Breadth First Search), Dijkstra hay Bellman-
Ford. Tuy nhiên ba thuật toán nêu trên chỉ có thể tìm đường đi ngắn nhất từ một đỉnh nguồn nhất
định đến các đỉnh khác. Vậy nên trong một số trường hợp chỉ ra đường đi ngắn nhất giữa mọi cặp
đỉnh u và v bất kì trong đồ thị, các thuật toán nêu trên chưa thật sự hiệu quả vì có quá nhiều thao tác
lặp, gây ảnh hưởng đến thời gian.
Chính vì vậy, thuật toán tìm đường đi ngắn nhất Floyd – Warshall ra đời giúp chúng ta giải quyết
được vấn đề tìm đường đi ngắn nhất giữa mọi cặp đỉnh bất kì trong đồ thị. Hơn nữa cách triển khai
của nó trên máy tính cũng rất đơn giản.
Thuật toán tìm đường đi ngắn nhất giữa tất cả cặp đỉnh bất kì Floyd – Warshall còn được gọi là
thuật toán Floyd được Robert Floyd tìm ra vào năm 1962 là một thuật toán dùng để tìm đường đi
ngắn nhất giữa mọi cặp đỉnh trong đồ thị. Floyd hoạt động được trên đồ thị có hướng, có trọng số âm
nhưng không có chu trình âm. Tuy nhiên, Floyd được dùng như một thuật toán để phát hiện chu trình
âm.
PAGE \* MERGEFORMAT 23

2. Đặt vấn đề:


Cho đồ thị vô hướng G như sau:

Hình 7. Đồ thị cho bài toán đặt ra


Tìm đường đi ngắn nhất giữa các cặp đỉnh trên đồ thị.
Bài toán đặt ra là tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh trên đồ thị. Ta có thể sử dụng
thuật toán Dijkstra cho toàn bộ đỉnh, thế nhưng với 5 đỉnh thì ta phải gọi hàm Dijsktra 5 lần. Tuy
nhiên với số lượng đỉnh lớn |V| ≤ 400, thì sẽ vượt quá thời gian xử lí .Vậy nên sử dụng thuật toán
Floyd – Warshall sẽ dễ dàng để triển khai và tối ưu hơn. Bây giờ chúng ta sẽ đi vào phần mô tả và
khai triển.
IV. MÔ TẢ VÀ CÁCH TRIỂN KHAI THUẬT TOÁN FLOYD – WARSHALL:
1. Ý tưởng của thuật toán:
Từ bài toán đã cho, chuyển các số liệu về dạng ma trận trọng số A. Mỗi ô A[i, j] được lấp đầy bởi
khoảng cách từ đỉnh i đến đỉnh j, nếu không có đường đi nào từ đỉnh i đến đỉnh j thì ô đó sẽ có giá trị
là ∞ . 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ể đi qua
các đỉnh khác rồi đến j), các đỉnh nó đi qua có chỉ số không vượt quá k.
2. Mô tả thuật toán:
Với ví dụ đã cho ở mục Đặt vấn đề, ta mô phỏng thuật toán Floyd – Warshall như sau:
Khởi tạo ma trận từ đồ thị G đã cho ban đầu:

0 1 2 3 4

0 0 5 inf 9 1

1 5 0 2 inf inf

2 inf 2 0 7 inf

3 9 inf 7 0 2

4 1 inf inf 2 0
PAGE \* MERGEFORMAT 23

Quá trình thuật toán diễn ra như sau:


Chọn lần lượt từng đỉnh của đồ thị làm đỉnh trung gia (ta quy ước là k). Chọn một cặp 2 đỉnh phân
biệt và không trùng với đỉnh trung gian (ta quy ước lần lượt là i và j).
Thực hiện so sánh như ở trên: Đường đi ngắn nhất giữa i và j sẽ có giá trị nhỏ nhất bằng giá trị
nhỏ nhất giữa một trong hai giá trị sau:
+ Giá trị đường đi ngắn nhất hiện thời giữa i và j.
+ Tổng của giá trị đường đi ngắn nhất hiện thời giữa i và k, và đường đi ngắn nhất hiện thời
giữa k và j.
Đầu tiên, k = 0. Nhờ đỉnh 0 làm trung gia ta thấy xuất hiện đường đi từ đỉnh 1 tới đỉnh 3 có độ dài
là 14, từ đỉnh 1 tới đỉnh 4 độ dài của nó là 6. Đường đi trung gian qua đỉnh 0 để đi từ đỉnh 3 tới đỉnh
4 không tối ưu về chiều dài (9+1 > 2) nên ta không cập nhật đường đi ngắn nhất giữa đỉnh 3 và đỉnh
4.
Lúc này mảng trở thành:

0 1 2 3 4

0 0 5 inf 9 1

1 5 0 2 14 6

2 inf 2 0 7 inf

3 9 14 7 0 2

4 1 6 inf 2 0

Tiếp theo ta duyệt tới k = 1. Đường đi từ đỉnh 2 tới 0 có độ dài là 7, từ đỉnh 2 tới 4 có độ dài là 8.
Đường đi từ đỉnh 2 tới 3 không được cập nhật trên ma trận kề của đồ thị vì 7 < 2 + 5 + 9.

0 1 2 3 4

0 0 5 7 9 1

1 5 0 2 14 6

2 7 2 0 7 8

3 9 14 7 0 2

4 1 6 8 2 0

Cứ duyệt tiếp tục với k như vậy ta sẽ tới hết và thu được ma trận hoàn chỉnh:
PAGE \* MERGEFORMAT 23

0 1 2 3 4

0 0 5 7 3 1

1 5 0 2 8 6

2 7 2 0 7 8

3 3 8 7 0 2

4 1 6 8 2 0

Giả sử từ mảng này ra thấy đường đi ngắn nhất từ 2 đến 4 là 8. Dựa theo đồ thị thì đoạn đường nó
đi có vết Trace = {2, 1, 0, 4}.
3. Các bước giải bài toán:
Từ mô tả ví dụ ở trên ta rút ra cách giải của thuật toán Floyd – Warshall trong tìm đường đi ngắn
nhất giữa mọi cặp đỉnh trên đồ thị như sau:
Bước 1: Viết ma trận kề D từ đồ thị đã cho với các trọng số.
Bước 2: Chọn lần lượt từng đỉnh trên đồ 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 D, giữ nguyên các phần tử trên đường chéo
chính của D.
Bước 3: Ký hiệu Dk là ma trận của D sau mỗi lần duyệt với k, khi đó:
Dk[i, j] = min( Dk-1[i, j], Dk-1[i, k] + Dk-1[k, j] )
Bước 4: Sau khi thực hiện n lần lặp, sau lần lặp thứ k ma trận D sẽ chứa độ dài đường đi ngắn
nhất giữa các cặp đỉnh bất kì trong đồ thị.
Tuy nhiên với việc lặp ba vòng lặp n lần thì thuật toán Floyd – Warshall sẽ có độ phức tạp O(n3)
thì thời gian chạy trên máy tính cũng tương đối lớn nếu số đỉnh lớn.
PAGE \* MERGEFORMAT 23

4. Triển khai thuật toán bằng C++:

Hình 8. Triển khai thuật toán


PAGE \* MERGEFORMAT 23

cin >> x Nhập giá trị vào biến x


cout << x In ra màn hình console giá trị biến x
if, else Câu lệnh điều kiện
for Khởi tạo vòng lặp có điều kiện
int, long long Biến kiểu số nguyên
vector Kiểu dữ liệu mảng động
vector::resize() Biến đổi độ dài của mảng động
floydWarshall() Chương trình con triển khai thuật toán
init_trace() Khởi tạo mảng lưu truy vết
stoi() Chuyển từ xâu ký tự sang số nguyên
to_string() Chuyển từ số sang xâu ký tự
printf In ra console theo định dạng cho trước

Bảng 1. Giải thích ngôn ngữ lập trình, các hàm


Lưu ý: Số đếm của cặp đỉnh bắt đầu từ 0.
PAGE \* MERGEFORMAT 23

V. VÍ DỤ VÀ CÁC BÀI TOÁN ỨNG DỤNG:


1. Ví dụ 1:
Dưới đây là một số địa điểm tại làng đại học quốc gia TPHCM được mô tả như hình vẽ

2
3

3 7

Hãy tìm đường đi ngắn nhất giữa các địa điểm với nhau . Các địa điểm lần lượt là Đại học
Bách Khoa CS2, KTX Khu B, Chợ Nhân Văn, ĐH Kinh Tế-Luật, và Đường Quốc Lộ 1K ( được
đánh số theo thứ tự 1,2,3,4,5).
Lời giải:

Lập ma trận:
Giữ hàng , cột 1. Chọn Bách Khoa CS2 làm điểm trung gian thứ nhất ta được ma trận

Chọn KTX khu B làm điểm trung gian thứ 2. Giữ ta được ma trận
PAGE \* MERGEFORMAT 23

Chọn chợ Nhân Văn làm điểm trung gian thứ 3, Giữ ta được ma trận

Chọn ĐH Kinh tế-Luật làm điểm trung gian thứ 4. Giữ ta được ma trận :

Chọn Quốc Lộ 1K làm điểm trung gian thứ 5. Giữ ta được ma trận :

Vậy ta có thể tìm được đường đi ngắn nhất giữa các địa điểm thông qua ma trận trên.
PAGE \* MERGEFORMAT 23

2. Ví dụ 2:
Tưởng tượng trong thành phố Hồ Chí Minh với các địa điểm quan trọng như trường học, bệnh
viện, công viên và trung tâm mua sắm.Ta muốn xây dựng một ứng dụng hỗ trợ người dùng tìm
đường đi ngắn nhất giữa các địa điểm này.

7 2

Bảng dưới đây thể hiện ma trận đường đi giữa các địa điểm, trong đó các số thể hiện độ dài của
con đường nối giữa hai địa điểm:
PAGE \* MERGEFORMAT 23
PAGE \* MERGEFORMAT 23

Đây là ma trận biểu diễn đường đi ngắn nhất từ mỗi điểm đến mọi điểm khác:

Khi đó ta có thể hiểu là đường đi ngắn nhất từ trường đến công viên là 5km, và tương tự đến
các điểm còn lại.

3. Ví dụ 3:
Tưởng tượng bạn quản lý một hệ thống vận chuyển cho một công ty ở Hà Nội, và bạn cần tối
ưu hóa việc di chuyển hàng hóa từ các kho đến các cửa hàng khắp thành phố.
Giả sử có một số kho (Warehouse) và một loạt các cửa hàng (Stores) trong thành phố. Mỗi con
đường giữa các kho và cửa hàng có một chi phí vận chuyển khác nhau.
Bảng dưới đây biểu diễn ma trận chi phí (trọng số) để di chuyển hàng hóa từ các kho phân phối
đến các cửa hàng:

Áp dụng thuật toán Floyd-Warshall cho ma trận này sẽ tạo ra ma trận chứa thông tin về chi phí
của đường đi ngắn nhất giữa mọi cặp kho phân phối và cửa hàng.
PAGE \* MERGEFORMAT 23

Kết quả có thể trông như sau:

Trong ma trận này:


 Ví dụ, để vận chuyển hàng từ Warehouse 3 đến Store 3, chi phí thấp nhất là 28.
 Tương tự, từ Warehouse 1 đến Store 2, chi phí thấp nhất là 15.
Khi bạn cần tính toán chi phí vận chuyển hàng từ một kho cụ thể đến một cửa hàng cụ thể,
bạn có thể sử dụng ma trận này để tìm ra đường đi có chi phí thấp nhất nhanh chóng và chính
xác.

4. Ví dụ 4:
Giả sử bạn là quản trị viên mạng cho một công ty lớn với nhiều văn phòng ở các thành phố
khác nhau. Bạn cần xác định đường dẫn kết nối tối ưu giữa các máy tính ở các văn phòng khác nhau,
sao cho dữ liệu có thể được truyền tải nhanh chóng và hiệu quả nhất giữa chúng.
Dưới đây là một ma trận biểu diễn thời gian truyền tải dữ liệu giữa các máy tính:

Dựa trên ma trận thời gian truyền tải dữ liệu giữa các máy tính đã được cung cấp, chúng ta
sẽ áp dụng thuật toán Floyd-Warshall để tính toán đường dẫn truyền tải tối ưu nhất giữa các
máy tính.
Sau khi áp dụng thuật toán, kết quả ma trận đường dẫn truyền tải tối ưu sẽ thể hiện thời
gian tối ưu để truyền dữ liệu giữa các máy tính. Dưới đây là kết quả sau khi áp dụng thuật toán:
PAGE \* MERGEFORMAT 23

Trong ma trận này:


 Giá trị tại hàng i và cột j thể hiện thời gian truyền tải dữ liệu tối ưu từ máy i đến máy j.
 Ví dụ: Thời gian truyền từ Máy 1 đến Máy 3 là 5 đơn vị sau khi áp dụng thuật toán.
Kết quả này cho chúng ta biết thời gian truyền tải dữ liệu tối ưu giữa mọi cặp máy tính trong
mạng lưới, giúp quản trị viên mạng xác định các đường dẫn nhanh chóng và hiệu quả nhất để truyền
dữ liệu trong hệ thống mạng của họ.

5. Ví dụ 5:
Ví dụ một mạng lưới các ngân hàng và các tổ chức tài chính trong một khu vực, và một người
muốn sử dụng thuật toán Floyd-Warshall để tính toán chi phí hoặc lợi ích từ việc chuyển khoản tiền
từ mỗi ngân hàng đến ngân hàng khác.
Dưới đây là ma trận biểu diễn chi phí hoặc lợi ích (đơn vị: đồng) từ mỗi ngân hàng đến ngân
hàng khác:

Trong ma trận này:


 Giá trị tại hàng i và cột j thể hiện chi phí hoặc lợi ích từ ngân hàng i đến ngân hàng j.
PAGE \* MERGEFORMAT 23

 Ví dụ: Chi phí từ Ngân hàng A đến Ngân hàng B là 50 đơn vị (nếu đơn vị là chi phí)
hoặc lợi ích từ Ngân hàng A đến Ngân hàng B là 50 đơn vị (nếu đơn vị là lợi ích).
Áp dụng thuật toán Floyd-Warshall cho ma trận này sẽ tạo ra ma trận chứa thông tin về chi phí
hoặc lợi ích ngắn nhất giữa mọi cặp ngân hàng.

Kết quả sẽ cung cấp thông tin về chi phí hoặc lợi ích khi chuyển khoản tiền từ mọi ngân hàng
đến mọi ngân hàng khác, giúp người quản lý tài chính hiểu rõ về mô hình kinh tế và quyết định về
việc chuyển khoản một cách hiệu quả.
6. Ví dụ 6:
Một công ty có một mạng xã hội với 5 người dùng và muốn tính toán khoảng cách hoặc số
bước cần thiết để kết nối mỗi người dùng với nhau thông qua các mối quan hệ trong mạng xã hội.
Dưới đây là ma trận biểu diễn mối quan hệ giữa các người dùng:

Ở đây:
 Giá trị tại hàng i và cột j thể hiện mức độ quan hệ hoặc số bước cần thiết để kết nối từ
người dùng i đến người dùng j.
PAGE \* MERGEFORMAT 23

 Ví dụ: Để kết nối từ User 3 đến User 4, cần 1 bước.


Áp dụng thuật toán Floyd-Warshall cho ma trận này sẽ tạo ra ma trận chứa thông tin về mối
quan hệ ngắn nhất giữa mọi cặp người dùng trong mạng xã hội.

Kết quả này thể hiện số bước ngắn nhất hoặc mức độ kết nối ngắn nhất giữa các người dùng
trong mạng xã hội. Điều này có thể giúp hiểu về mức độ tương tác, quan hệ hoặc mức độ gần gũi
giữa các người dùng trong mạng xã hội.
PAGE \* MERGEFORMAT 23

VI. KẾT LUẬN:


Từ các ví dụ đã được nêu trên, ta có thể thấy với thuật toán tìm đường đi ngắn nhất giữ mọi cặp
đỉnh trên đồ thị Floyd – Warshall mà các bài toán thực tế gắn liền với việc tìm đường đi ngắn nhất
giữa các đỉnh trở nên dễ dàng hơn. Mà hơn thế nữa ta có thể ứng dụng vào các bài toán tính đường đi
giữa các thành phố, con đường hay các khu dân cư.
Không chỉ vậy, việc triển khai thuật toán Floyd – Warshall trên máy tính bằng các phần mềm
lập trình như Matlab, Python, C++ hay Codeblock..v.v…. không quá phức tạp, vì chỉ khi ta hiểu rõ
về ma trận kề và cách thức hoạt động của thuật toán này thì ta hoàn toàn có thể làm việc với máy
tính để triển khai dễ dàng.
Tóm lại, thuật toán Floyd – Warshall là thuật toán phổ biến trong việc tìm đường đi ngắn nhất
giữa mọi cặp đỉnh trong đồ thị, tuy vậy chúng ta cần cẩn trọng với độ phức tạp của Floyd – Warshall
khi triển khai trên máy tính.

VII. TỔNG KẾT:


Như vậy, sau hơn một tháng phân công làm việc cũng như tìm hiểu, cả nhóm đã nỗ lực hết
mình để hoàn thành đề tài được giao. Chúng tôi đã tìm hiểu kỹ càng về lý thuyết đồ thị cũng như
thực hiện bài code thuật toán trên C++ và được kết quả như mong muốn.
Qua phần đè tài được giao này cả nhóm đã tìm hiểu và biết rõ hơn về:
- Về nội dung:
+ Hiểu rõ hơn về lý thuyết đồ thị và ma trận kề.
+ Hiểu rõ về thuật toán đường đi ngắn nhất Floyd – Warshall.
+ Thao tác giải thuật toán trên C++.
- Về hình thức:
+ Cả nhóm đã biết thêm về cách trình bày báo cáo, bài trình chiếu.
+ Biết thêm về cách thức làm việc nhóm, trau dồi kiến thức và làm việc hiệu quả.
+ Nâng cao hơn tinh thần và trách nhiệm của mỗi thành viên, để có thể hoàn thành được bài
báo cáo một cách tốt nhất.
PAGE \* MERGEFORMAT 23

VIII. TÀI LIỆU THAM KHẢO:


[1] Giáo trình giải thuật và lập trình – Lê Minh Hoàng
[2] Giáo trình đại số tuyến tính- Ts Đặng Văn Vinh
[3] https://www.youtube.com/watch?v=nV_wOZnhbog
[4] https://www.youtube.com/watch?v=4NQ3HnhyNfQ
[5] https://www.youtube.com/watch?v=oNI0rf2P9gE
PAGE \* MERGEFORMAT 23

DANH MỤC HÌNH ẢNH

Hình 1. Sơ đồ mạng máy tính................................................................................................................4


Hình 2. Cấu trúc phân tử hóa học..........................................................................................................5
Hình 3. Đơn đồ thị vô hướng.................................................................................................................5
Hình 4. Đa đồ thị vô hướng...................................................................................................................6
Hình 5. Đơn đồ thị có hướng.................................................................................................................6
Hình 6. Đồ thị và ma trận kề biểu diễn..................................................................................................8
Hình 7. Đồ thị cho bài toán đặt ra........................................................................................................10
Hình 8. Triển khai thuật toán...............................................................................................................13

DANH MỤC BẢNG BIỂU


Bảng 1. Giải thích ngôn ngữ lập trình, các hàm..................................................................................14

You might also like