ĐẠI HỌC QUỐC GIA TP.HCM 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: Huỳnh Thái Duy Phương
Trang 1ĐẠI HỌC QUỐC GIA TP.HCM 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: Huỳnh Thái Duy Phương
Lớp: L13
Nhóm thực hiện: Nhóm 3
Trang 2MỤC LỤC
CHƯƠNG I GIỚI THIỆU CHUNG 3
1 Lịch sử lý thuyết đồ thị 3
2 Sơ lược về thuật toán Floyd Warshal 3
2.1 Giới thiệu 3
2.2 Tác dụng 3
2.3 Ưu điểm 3
2.4 Nhược điểm 3
CHƯƠNG II CƠ SỞ LÝ THUYẾT 4
1 Đồ thị 4
2 Đồ thị vô hướng và đồ thị có hướng 4
2.1 Đồ thị vô hướng 4
2.2 Đồ thị có hướng 4
3 Đơn đồ thị và đa đồ thị 5
3.1 Đơn đồ thị 5
3.2 Đa đồ thị 5
4 Ma trận kề của đồ thị 5
5 Ma trận trọng số 5
CHƯƠNG III THUẬT TOÁN FLOYD-WARSHAL 8
1 Nội dung thuật toán Floyd Warshal 8
2 Thực hiện thuật toán Floyd bằng Matlab 8
2.1 Các câu lệnh 8
2.2 Bài code 9
2.3 Ví dụ 10
CHƯƠNG IV KẾT LUẬN 13
TÀI LIỆU THAM KHẢO 14
3
Trang 3CHƯƠNG I GIỚI THIỆU CHUNG
1 Lịch sử lý thuyết đồ thị:
- Bài toán bảy cây cầu Euler, còn gọi là Bảy cầu ở Konigsberg là bài toán nảy sinh từ thành phố Konigsberg, Phổ Bài toán đặt ra là tìm một tuyến đường mà đ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) Năm 1736, Leonhard Euler đã chứng minh rằng bài toán này là không có lời giải Kết quả này là cơ sở phát triển của lý thuyết đồ thị
- 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à chỉ được giải sau một thế kỉ vào năm 1976 bởi Kenneth Appel (1932 - 2013) và Wolfgang Haken (1928 - 2022)
2 Sơ lược về thuật toán Floyd Warshal:
2.1 Giới thiệu:
- Thuật toán Floyd–Warshall còn được gọi là thuật toán Floyd được Robert Floyd tìm ra năm 1962
- Thuật toán Floyd là một thuật toán giải quyết bài toán tìm đường đi ngắn nhất trong một đồ thị có hướng dựa trên các đỉnh trung gian Khi cần chỉ ra đường đi ngắn nhất của mọi cặp đỉnh trong đồ thị thì thuật toán Floyd chính là công cụ giúp ta thực hiện chỉ trong một lần chạy Hơn thế nữa, cách tiếp cận và cài đặt của nó cũng khá đơn giản và quen thuộc
2.2 Tác dụng:
Thuật toán Floyd-Warshall được thiết kế để tính toán đường đi ngắn nhất giữa mọi cặp điểm trong đồ thị
có hướng
2.3 Ưu điểm:
- Tìm được đường đi ngắn nhất giữa tất cả các điểm trong đồ thị với trọng số âm hoặc dương, trong đồ thị có hướng hoặc vô hướng
- Chỉ với một lần chạy thuật toán sẽ cho ta kết quả
- Phát hiện được chu trình âm trong đồ thị
2.4 Nhược điểm:
Trong đồ thị không được có vòng nào có tổng các cạnh là âm, nếu có vòng như vậy ta không thể tìm được đường đi ngắn nhất (mỗi lần đi qua vòng này độ dài quãng đường lại giảm, nên ta có thể đi vô hạn lần.)
Trang 4CHƯƠNG II CƠ SỞ LÝ THUYẾT
1 Đồ thị:
- Định nghĩa 1.1: Đồ thị là một tập các điểm gọi là đỉnh nối với nhau bởi các cạnh Thông thường, đồ thị được vẽ dưới dạng một tập các điểm (đỉnh, nút) nối với nhau bởi các đoạn thẳng (cạnh)
- Định nghĩa 1.2: Hai đỉnh u và v của đồ thị vô hướng G được gọi là kề nhau nếu (u,v) là cạnh của đồ thị G Nếu e= (u,v) là cạnh của đồ thị ta nói cạnh này là liên thuộc với hai đỉnh u và v, hoặc cũng nói
là nối đỉnh u và đỉnh v, đồng thời các đỉnh u và v sẽđược gọi là các đỉnh đầu của cạnh (u,v)
Ta gọi bậc của đỉnh v trong đồ thị vô hướng là số cạnh liên thuộc với nó và sẽ ký hiệu là deg(v)
Đỉnh bậc 0 gọi là đỉnh cô lập, đỉnh bậc 1 gọi là đỉnh treo
- Định lý 1: Giả sử G = (V,E) là đồ thị vô hướng với m cạnh Khi đó tổng bậc của tất cả các đỉnh bằng hai lần số cung
2 Đồ thị vô hướng và đồ thị có hướng:
2.1 Đồ thị vô hướng: 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 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 2.2.1: đồ thị vô hướng 2.2 Đồ thị có hướng: là một cặp không 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
Một cạnh e = (u, v) được coi là có hướng từ u tới v; 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 2.2.2: đồ thị có hướng
3 Đơn đồ thị và đa đồ thị:
3.1 Đơn đồ thị: là đồ thị được tạo thành từ tập hợp các đỉnh nối bởi các cạnh, trong đó các cạnh có
hướng liên kết với chúng thỏa điều kiện: nếu x và y là hai đỉnh thì đồthị chỉ được phép có tối
đa một trong hai cung (x, y) hoặc (y, x)
3.2 Đa đồ thị: là đồ thị mà không thỏa mãn đơn đồ thị Đa đồ thị có hướng là một đồ thị có hướng,
5
Trang 5trong đó, nếu x và y là hai đỉnh thì đồ thị được phép có cả hai cung (x, y) và (y, x)
4 Ma trận kề của đồ thị:
Với đồ thị vô hướng, ma trận kề của đồ thị có n đỉnh là ma trận vuông cỡ n×n có các phần tử là 0 hoặc
1 A={aij|aij= 1 nếu cạnh (i,j) là một cạnh của đồ thị, a = 0 nếu cạnh (i,j) không là một cạnh của đồ thịij } Vd:
5 Ma trận trọng số :
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 xếp thứ tự X={x , 1
x2, , xn}
Ma trận trọng số 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 tới x và xi j
B=(Bij)= 0 nếu không có cạnh nối tới x và xi j
Ví dụ 1:
Trang 61 2 3 4
Hình 1: Đồ thị vô hướng G và ma trận trọng số B của G1 1 1
Nhận xét:
- Không có cạnh nào nối từ đỉnh 1,2,3,4 tới chính nó => các phần tử trên đường chéo chính sẽ có giá trị bằng 0
- Cạnh nối đỉnh 1 tới đỉnh 2 có trọng số là 7, cạnh nối đỉnh 2 tới đỉnh 1 có trọng số là 7 => Trong trường hợp đồ thị vô hướng , ma trận trọng số sẽ đối xứng qua đường chéo chính vì với mỗi cạnh (i,j) thì cũng
sẽ có một cạnh (j,i) tương ứng
7
Trang 7Ví dụ 2:
Hình 2: Đồ thị có hướng G và ma trận trọng số B của G2 2 2
Nhận xét:
- Không có cạnh nào nối từ đỉnh 1,2,3,4,5 tới chính nó => các phần tử trên đường chéo chính sẽ có giá trị bằng 0
- Cạnh nối từ đỉnh 1 tới đỉnh 2 có trọng số là 18, tuy nhiên không có cạnh nối từ đỉnh 2 tới đỉnh 1 =>
Ma trận trọng số của đồ thị có hướng không đối xứng qua đường chéo chính
Trang 8CHƯƠNG III THUẬT TOÁN FLOYD – WARSHALL
1 Nội dung thuật toán Floyd Warshall
Yêu cầu: Hiện thực thuật toán tìm Đường đi ngắn nhất bằng thuật toán Floyd, Floyd Warshall.
- Đầu vào: Một đồ thị (có trọng), dùng thuật toán để tìm đường đi ngắn nhất giữa hai đỉnh
- Đầu ra: Một phần mềm lập trình mô phỏng hệ thống đường đi bằng đồ thị có trọng và tìm đường
đi ngắn nhất giữa 2 địa điểm
Cơ chế thực hiện thuật toán Floyd
- Khởi Tạo: Bắt đầu với ma trận khoảng cách sao cho D D[i][j] là trọng số của cạnh từ
- Cập Nhật: Lặp qua mỗi cặp điểm (i, j) và cập nhật D[i][j] nếu có một điểm sao cho đường đik
- Kết Quả: Sau khi lặp qua tất cả các điểm , ma trận sẽ chứa độ dài đường đi ngắn nhất giữa tấtk D
Mã của thuật toán
Phương pháp:
- Bước 1: Nhập vào một ma trận vuông S có trọng từ bàn phím Bảo đảm có thể rằng ở những vị trị
hang bằng cột phải có trọng số bằng 0
- Bước 2: Tạo một ma trận P có cùng kích thước với ma trận S và tất cả trọng số đều bằng -1
- Bước 3: Thực hiện thuật toán Floyd để chuyển ma trận S thành ma trận đường đi ngắn nhất giữa các đỉnh Nếu có vị trí nào thỏa điều kiện “S(i,j) >S(i,k) + S(k,j)” thì sẽ cập nhật giá trị của k vào
vị trí (i,j) trong ma trận P
- Bước 4: Nhập vào vị trí bắt đầu(start) và kết thúc(stop) sau đó in ra đường đi ngắn nhất nếu như giá trị tại S(start, stop) khác vô cùng
2 Thực hiện thuật toán Floyd bằng Matlab
2.1 Các câu lệnh sử dụng:
Lệnh Ý nghĩa
9
Trang 9Hàm “clc” Xóa toàn bộ nội dung trong command window.
Hàm “input” Xuất ra nội dung về giá trị cần nhận vào và nhập giá trị
cho biến được gọi Hàm “min” Tìm giá trị nhỏ nhất giữa 2 đối số được đưa vào hàm. Hàm
“fprintf” Xuất nội dung ra màn hình, “%d” lần lượt được thay thế
bằng những giá trị sau dấu “,”.
Hàm “disp” Xuất ra màn hình giá trị của biến hoặc ma trận.
2.2 Bài code
Trang 10Ví dụ 1: Cho đồ thị vô hướng G sau: tìm quãng đường đi ngắn nhất từ đỉnh 1 đến đỉnh 2
Tìm đường đi ngắn nhất từ đỉnh 2 đến đỉnh 4
Quy ước
xij là 0: là khoảng cách từ đỉnh tới chính nó
xij là số thực : khoảng cách từ đỉnh x đến đỉnh xi j
xij là ∞ : là khoảng cách chưa xác định
Từ đề bài, ta khởi tạo được ma trận khoảng cách như sau:
(0 5 ∞ 9 1
1 ∞ ∞ 2 0) => (0 5 ∞ 9 1
1 6 ∞ 2 0)
1 6 8 2 0) => (0 5 7 9 1
1 6 8 2 0) => (0 5 7 9 1
1 6 8 2 0)
=> (0 5 7 3 1
1 6 8 2 0)
Kết luận : Từ kết quả trên , quãng đường đi ngắn nhất từ đỉnh 2 đến đỉnh 4 là 8
Ví dụ 2: Ở khu nhà của A, các địa điểm 1,2,3,4,5 (lần lượt là khu mua sắm, ngân hàng, công viên,
trường học, siêu thị) cách nhau những quãng đường như hình vẽ mô tả Hãy tìm đường đi ngắn nhất từ công viên đến khu mua sắm
11
Trang 11Từ đề bài, ta khởi tạo được ma trận khoảng cách như sau:
(0 5 ∞ 9 1
1 ∞ ∞ 2 0) => (0 5 ∞ 9 1
¿>¿(0 5 7 9 1
1 6 8 2 0)=¿(0 5 7 9 1
1 6 8 2 0)
¿>¿(0 5 7 9 1
1 6 8 2 0) =>(0 5 7 3 1
1 6 8 2 0)
Kết luận : Từ kết quả trên , quãng đường đi ngắn nhất từ công viên đến khu mua sắm là 7km.
Ví dụ 3: Giả sử bạn có 5 người bạn là Tân(1), Quyền(2), Quý(3), Thắng(4), Quốc(5) Bạn biết một vài
con đường và chiều dài quãng đường dẫn đến nhà các bạn đó (bản đồ bên dưới) Nhưng bạn không biết
đi đường nào ngắn nhất, tuy nhiên nhờ tìm hiểu về thuật toán Floyd Warshall bạn đã có thể tìm được hướng đi ngắn nhất Hãy tạo ma trận đường đi ngắn nhất từ Quyền tới Thắng
Trang 12Quy ước
xij là 0: là khoảng cách từ đỉnh tới chính nó
xij là số thực : khoảng cách từ đỉnh x đến đỉnh xi j
xij là ∞ : là khoảng cách chưa xác định
Từ đề bài, ta khởi tạo được ma trận khoảng cách như sau:
(0 13 2 ∞ ∞
5 6 ∞ ∞ 0) => (0 13 2 ∞ ∞
=>(0 13 2 ∞ ∞
5 6 7 ∞ 0)=> (0 13 2 5 ∞
5 6 7 10 0)
5 6 7 10 0)=¿(0 12 2 5 6
Kết luận : Từ kết quả trên , quãng đường đi ngắn nhất từ từ Quyền tới Thắng là 9km.
13
Trang 13CHƯƠNG IV KẾT LUẬN
Qua đề tài đã thực hiện trong thời gian qua, chúng em đã nắm bắt được cơ bản kiến thức về lý thuyết
đồ thị, ma trận, biết sử dụng thuật toán Floyd – Warshall kết hợp áp dụng Matlab để giải các bài toán tìm đường đi ngắn nhất Nghiên cứu về nguyên lý và cách mà thuật toán thực hiện, em hiểu thêm về tầm quan trọng của lý thuyết đồ thị đến việc áp dụng giải quyết các vấn đề thực tiễn
Do hạn chế về thời gian nên kiến thức mà chúng em tìm hiểu được còn thiết sót, cần được bổ sung, thêm vào đó chúng em mới tìm học cách sử dụng phần mềm Matlab nên còn gặp khó khăn trong việp
áp dụng Matlab để thực hiện thuật toán Chúng em rất mong nhận được sự góp ý của cô để chúng em
có kiến thức hoàn thiện hơn
Một lần nữa chúng em xin chân thành cảm ơn cô đã tạo điều kiện cho chúng em tiếp xúc với một đề tài thú vị và có cơ hội để trau dồi kiến thức của mình
Trang 14TÀI LIỆU THAM KHẢO
(1) Meyer C.D, Matrix analysis and Applied linear algebra, SIAM, 2000
(2) Kenneth H Rosen, Discrete Mathematics and Its Applications 7th Edition (3) Matlab Help: https://www.mathworks.com/help/matlab/index.html?s_tid=hc_panel (4) VIBLO: https://viblo.asia/p/thuat-toan-floyd-warshall-GrLZDBng5k0
15