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

MÔN HỌC ĐẠI SỐ TUYẾN TÍNH(MT1015) ĐỀ TÀI THUẬT TOÁN FLOYD-WARSHALL TÌM ĐƯỜNG ĐI NGẮN NHẤT

27 22 0

Đ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 27
Dung lượng 0,96 MB

Nội dung

VĂN PHÒNG KS CLC VIỆT-PHÁP BÁO CÁO BÀI TẬP LỚN MÔN HỌC: ĐẠI SỐ TUYẾN TÍNH(MT1015) ĐỀ TÀI: THUẬT TOÁN FLOYD-WARSHALL TÌM ĐƯỜNG ĐI NGẮN NHẤT Giảng viên hướng dẫn: TS.Đặng Văn Vinh Lớp: P02 Nhóm: 7 Tp.HCM, tháng 11 năm 2023 1 DANH SÁCH CÁC THÀNH VIÊN TRONG NHÓM STT TÊN THÀNH VIÊN MSSV 1 Nguyễn Thừa Ân 2310186 2 Nguyễn Tiến Hóa 2311093 3 Nguyễn Triều Hiển Long 2352695 4 Nguyễn Thanh Phong 2312624 5 Nguyễn Trần Minh Quân 2312846 2 MỤC LỤC DANH SÁCH THÀNH VIÊN…………………………………………2 LỜI NÓI ĐẦU………………………………………… …………… 4 I.LÝ THUYẾT VỀ ĐỒ THỊ………………………………………… 5 1.Lịch sử ra đời của lý thuyết đồ thị………………………………… 5 2.Cơ sở lý thuyết……………………………………………………… 6 A)Đồ thị………………………………………………………….6 B)Ma trận kề…………………………………………………….9 II.THUẬT TOÁN FLOYD-WARSHALL………………………… 12 1.Giới thiệu về thuật toán………………….…………………………12 2.Ý tưởng của thuật toán…………………………………………… 12 3.Phương pháp giải ……………………………… …………………14 4.Ưu/nhược điểm của thuật toán…………………………………….15 5.Input 1 đồ thị, tìm đường đi ngắn nhất bằng thuật toán…………15 6.Giải bài toán tìm đường đi ngắn nhất trong MATLAB………… 19 III.CÁC VÍ DỤ……………………………………………………… 21 IV.TÀI LIỆU THAM KHẢO…………………………………………26 V.TỔNG KẾT………………………………………………………….27 VI.NHẬN XÉT CỦA GIẢNG VIÊN………………………………….27 3 LỜI NÓI ĐẦU Lý thuyết đồ thị là một ngành khoa học được phát triển từ lâu nhưng lại có nhiều ứng dụng hiện đại Những tư tưởng cơ bản của lý thuyết đồ thị được đề xuất vào những năm đầu của thế kỷ 18 bởi nhà toán học lỗi lạc người Thụy Sỹ Leonhard Euler Lý thuyết đồ thị được ứng dụng rất rộng rãi trong các lĩnh vực như toán học, khoa học máy tính, các mô hình tính toán thực tế về đường đi,sự cạnh tranh của các loài khác nhau trong một ổ sinh thái, đại diện kết quả cho một giải đấu xoay vòng, xác định mạch vòng trong vấn đề giải tích mạch điện Đồ thị có trọng số trên các cạnh có thể sử dụng để giải các bài toán như: Tìm đường đi ngắn nhất giữa hai thành phố trong mạnh giao thông Chúng ta cũng có thể sử dụng đồ thị để giải các bài toán về lập lịch , thời khoa biểu… Đặc biệt 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 điện tử và sự phát triển nhanh chóng của tin học, lí thuyết đồ thị càng được quan tâm đến nhiều hơn Các thuật toán trên đồ thị đã có nhiều ứng dụng trong nhiều lĩnh vực khác nhau như: Mạng máy tính, Lí thuyết mã, Tối ưu hoá,… Trong khoa học máy tính và toán học, thuật toán tìm đường đi ngắn nhất trong đồ thị thường được vận dụng trong các ứng dụng tin học Trong thực tế, bài toán tìm đường đi ngắn nhất giữa hai đỉnh của một đồ thị có ý nghĩa cực kỳ to lớn Ví dụ, bài toán chọn một hành trình tiết kiệm nhất(về tiêu chuẩn khoảng cách, thời gian, chi phí, ) trên một mạng lưới giao thông đường bộ, đường thủy, đường hàng không,… Hiện nay có rất nhiều phương pháp được đưa ra để giải quyết các bài toán như vậy Thế nhưng các thuật toán được xây dựng dựa trên cơ sở lý thuyết đồ thị là mang lại hiệu quả cao nhất Một trong số đó phải kể đến đó chính là thuật toán Floyd-Warshall, một trong những thuật toán tìm đường đi ngắn nhất dựa trên lí thuyết đồ thị được sử dụng rộng rãi 4 I.LÝ THUYẾT VỀ ĐỒ THỊ 1.Lịch sử ra đời của 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ổ(nay là Kaliningrad, một phần lãnh thổ của Liên Bang Nga 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 -) và W.Haken (1928 - ) Mô tả bài toán 7 cây cầu ở Konigsberg của Euler 5 2.Cơ sở lý thuyết A)Đồ thị *Định nghĩa -Đồ thị là một cấu trúc rời rạc bao gồm một tập các điểm được gọi là đỉnh và chúng được nối với nhau bởi các cạnh -Đồ thị G=(V,E) bao gồm V(vertices) một tập các đỉnh(hoặc nút) khác rỗng và E(edges) một tập các cạnh Mỗi cạnh có một hoặc hai đỉnh liên kết với nó, được gọi là điểm cuối của nó Một cạnh được cho là kết nối các điểm cuối của nó -Có thể hiểu E là tập hợp các cặp (u,v) với u và v là 2 đỉnh thuộc V *Phân loại các loại đồ thị  G được gọi là đơn đồ thị nếu như giữa hai đỉnh (u,v) của V có nhiều nhất một cạnh trong E nối từ u tới v  G được gọi là đa đồ thị nếu như giữa hai đỉnh (u,v) của V có thể có nhiều hơn 11 cạnh nối trong E nối từ u tới v Hiển nhiên đơn đồ thị cũng là đa đồ thị  G được gọi là đồ thị vô hướng (undirected graph) nếu như các cạnh trong E là không định hướng, tức là cạnh (u,v) là cạnh hai chiều  G được gọi là đồ thị có hướng (directed graph) nếu như các cạnh trong E là có định hướng, tức là có thể tồn tại cạnh nối từ u tới v nhưng chưa chắc đã tồn tại cạnh nối từ v tới u Trên đồ thị có hướng, các cạnh sẽ được gọi là các cung Đồ thị vô hướng cũng có thể coi là đồ thị có hướng, nếu như ta coi cạnh (u,v) bất kỳ tương ứng với hai cung (u→v) và (v→u) 6 *Các thuật ngữ trên đồ thị(Graph Terminology) 1 Cạnh liên thuộc, đỉnh kề, bậc và khuyên -Đối với đồ thị vô hướng G=(V,E), hai đỉnh u và v trong đồ thị được gọi là kề nhau(adjacent) trong G nếu u và v là điểm cuối của một cạnh e của G Cạnh e như vậy được gọi là liên thuộc(incident) với các đỉnh u và v và e được gọi là nối nhau(connect) giữa u và v -Với một đỉnh u thuộc đồ thị, bậc của nó được xác định bởi số cạnh liên thuộc với nó, ngoại trừ một vòng lặp tại lại tại đỉnh đó,được kí hiệu là deg(u) Trên đơn đồ thị, số cạnh liên thuộc với u cũng chính là số đỉnh kề với u Định lý 1: Giả sử G=(V,E) là đồ thị vô hướng với M cạnh khi đó tổng tất cả các bậc đỉnh trong V sẽ bằng 2M Chứng minh: Khi lấy tổng tất cả các bậc đỉnh, tức là mỗi cạnh e=(u,v) bất kỳ sẽ được tính một lần trong deg(u) và một lần trong deg(v) Từ đó suy ra điều phải chứng minh Hệ quả: Trên đồ thị vô hướng, số đỉnh bậc lẻ là một số chẵn -Đối với đồ thị có hướng G=(V,E), khi (u,v) là một cạnh của đồ thị G thì u được gọi là kề cận với v và v được gọi là liền kề với u Đỉnh u được gọi là đỉnh đầu còn đỉnh v được gọi là đỉnh cuối của (u,v) Với mỗi đỉnh u trong đồ thị có hướng, định nghĩa: Bán bậc ra (out-degree) của đỉnh u, kí hiệu deg+(u) là số cung đi ra khỏi nó; Bán bậc vào (in-degree) của đỉnh u, kí hiệu deg− (u) là số cung đi vào nó Định lý 2: Giả sử G=(V,E) là đồ thị có hướng với M cung khi đó tổng tất cả các bán bậc ra bằng tổng tất cả các bán bậc vào và bằng M: 7 Chứng minh: Khi lấy tổng tất cả các bán bậc ra hoặc bán bậc vào, mỗi cung (u→v) bất kỳ sẽ được tính đúng một lần trong deg+(u) và cũng được tính đúng một lần trong deg−(v) Từ đó suy ra điều phải chứng minh *Trên đồ thị có hướng hoặc vô hướng, trong một số trường hợp có thể có những cạnh nối một đỉnh với chính nó Cạnh này được gọi là khuyên của đồ thị, và trong trường hợp này, thì các cạnh nối hai đỉnh phân biệt sẽ được gọi là các liên kết để tránh nhầm lẫn 2 Đường đi và chu trình Một đường đi P độ dài k từ đỉnh u0 tới đỉnh uk là tập đỉnh {u0,u1,u2, ,uk} sao cho (ui−1,ui )∈E,∀i:1≤i≤k Khi đó ta nói đường đi này bao gồm các đỉnh u0,u1,u2, ,uk} và các cạnh u0 ,u1),(u1,u2), ,(uk−1,uk)}; và u0 đến được uk thông qua đường đi P Đường đi được gọi là đường đi đơn giản (simple path) nếu tất cả các đỉnh trên đường đi đó đều phân biệt Đường đi được gọi là đường đi đơn nếu như không có cạnh nào trên đường đi đó đi qua hơn một lần Một đường đi con (subpath) P′ của P là một đoạn liên tục các đỉnh và cạnh dọc theo đường đi P Đường đi P gọi là chu trình (circuit) nếu như u0=uk Chu trình P gọi là chu trình đơn giản (simple circuit) nếu như {u1,u2, ,uk} đôi một khác nhau Chu trình mà trong đó không có cạnh nào đi qua hơn một lần được gọi là chu trình đơn 3 Tính liên thông của đồ thị Đối với đồ thị vô hướng G=(V,E) thì G được gọi là liên thông nếu như với mọi cặp đỉnh phân biệt (u,v), ta đều có u đến được v (đồng nghĩa với v cũng đến được u) Đối với đồ thị có hướng G=(V,E):  G được gọi là liên thông mạnh (strongly connected) nếu với mọi cặp đỉnh phân biệt (u,v), ta có u đến được v và v đến được u 8  G được gọi là liên thông yếu (weakly connected) nếu như đồ thị vô hướng nền của nó là liên thông (tức là hủy bỏ chiều của các cạnh trên đồ thị)  G được gọi là liên thông một phần (unilaterally connected) nếu như với mọi cặp đỉnh phân biệt (u,v), có ít nhất một đỉnh đến được đỉnh còn lại B)Ma trận kề(Adjacency Matrices) -Việc thực hiện các thuật toán đồ thị bằng cách biểu diễn đồ thị theo danh sách các cạnh hoặc theo danh sách liền kề có thể rất phức tạp nếu có quá nhiều cạnh trong đồ thị Để đơn giản hóa việc tính toán, đồ thị được biểu diễn bằng ma trận Đối với đồ thị vô hướng -Xét một đồ thị vô hướng G=(V,E) với tập đỉnh V={1,2,…,n} và tập cạnh E={e1,e2, ….,en} -Ma trận kề của đồ thị G là A(AG) có kích cỡ là nxn với các phần tử là 0 hoặc 1, aij = 1 nếu cạnh (i,j) là một cạnh giữa hai đỉnh ui và uj liền kề, aij = 0 nếu là một cạnh giữa hai đỉnh ui và uj không liền kề *Tính chất: -Là ma trận đối xứng -Tổng các phần tử trên ma trận bằng 2 lần số cạnh -Tổng các phần tử trên hàng hoặc cột thứ u là bậc đỉnh của u Ví dụ: Lập ma trận kề cho đồ thị vô hướng sau: Ta có ma trận kề của đồ thị tương ứng với 4 đỉnh a,b,c,d là [ ]0 1 1 1 1011 1101 1110 Đối với đồ thị có hướng 9 -Xét một đồ thị có hướng G=(V,E) với tập đỉnh V={1,2,…,n} và tập cạnh E={e1,e2,….,en} -Ma trận kề của đồ thị G là A(AG) có kích cỡ là nxn với các phần tử là 0 hoặc 1, aij = 1 nếu cạnh (i,j) là một cạnh giữa hai đỉnh ui và uj liền kề, aij = 0 nếu là một cạnh giữa hai đỉnh ui và uj không liền kề *Tính chất: -Có thể không là ma trận đối xứng -Tổng các phần tử của ma trận bằng số cạnh -Tổng các phần tử trên hàng thứ u là bán bậc ra của đỉnh u -Tổng các phần tử trên cột thứ u là bán bậc vào của đỉnh u Ví dụ: Lập ma trận kề cho đồ thị có hướng sau: Ta có ma trận kề của đồ thị tương ứng với 4 đỉnh a,b,c,d là [ ]0 1 1 1 0001 0100 0000 *Ma trận kề của đồ thị có trọng số: Ví dụ: Cho đồ thị vô hướng và có trọng số sau, hãy lập ma trận kề 10 -Với mọi đồ thị nào(có hướng hoặc vô hướng) G=(V,E) trong đó V là số đỉnh còn E là số cạnh, với hàm trọng số w:E→R tìm tất cả các cặp đỉnh u,v∈ V với trọng số nhỏ nhất có thể của đường đi từ u đến v  Tìm đường đi ngắn nhất giữa các cặp đỉnh của đồ thị  Đối với các trường hợp chung, cạnh âm vẫn được chấp nhận Bài toán có thể được giải quyết bằng cách chạy thuật toán Bellman-Ford “V” lần, với mỗi lần cho một đỉnh Thời gian tính toán phức tạp O(V2E), nếu đồ thị dày đặc thì O(V4)  Thuật toán Floyd-Warshall có thể giải bài toán tương tự chỉ trong O(V3) o Giải cho đồ thị dày đặc o Sử dụng ma trận kề thay vì danh sách kề o Giả sử các đỉnh của G là V=(1,2,….,k) là tập con của các đỉnh đối với một số k -Với mỗi cặp đỉnh i,j∈ V,xem xét tất cả đường đi từ i đến j có các đỉnh trung gian được rút ra từ {1,2,…,k} và đặt P là đường đi có trọng số nhỏ nhất trong số đó Thuật toán Floyd-Warshall khai thác mối quan hệ giữa đường đi P và đường đi ngắn nhất từ i dến j với tất cả các đỉnh trung gian trong tập hợp {1,2,…,k} mối quan hệ phụ thuộc vào việc K có phải là đỉnh trung gian của P hay không Ví dụ 13 -Từ ví dụ trên nếu K không nằm trong P thì đường đi ngắn nhất từ i đến j với tất cả các đỉnh trung gian trong tập hợp {1,2,…k} cũng đồng thời là đường đi ngắn nhất trong tập {1,2,…k} Nếu K nằm trong P thì ta chia P thành P1 và P2 trong đó:  P1 là đường đi ngắn nhất từ i đến K với tất cả các đỉnh trung gian trong tập (1,2, …,k)  P2 là đường đi ngắn nhất từ K đến j với tất cả các đỉnh trung gian trong tập (1,2, …,k) 3.Phương pháp giải -Phương pháp của thuật toán Floyd-Warshall cho bài toán tìm đường đi ngắn nhất : -Cho G=(V,E) là đồ thị có hướng có trọng số với hàm trọng số cạnh w:E→R có giá trị thực cho các cạnh, trong đó V={1,2,…,n} với n là tập các đỉnh và E⊆ VxV là một tập các cạnh Giả sử rằng không có chu trình trọng số âm trong đồ thị G mặc dù cho phép các cạnh có trọng số âm Chúng ta sử dụng biểu diễn ma trận kề cho đồ thị G Input của bài toán đường đi ngắn nhất cho tất cả các cặp là ma trận cỡ nxn W=[w(i,j)] trong đó w(i,j) biểu thị trọng số cạnh từ đỉnh i đến đỉnh j trong đồ thị G, với n đỉnh, ta có: {0 nếu i= j w (i , j)= trọng số nếu i≠ j và(i , j)∈ E (1) ∞ nếu i≠ j và(i , j)∉ E -Cho đường đi p là một dãy đỉnh tùy ý Khoảng cách của một đường đi là tổng độ dài của tất cả các cạnh trung gian trong dãy các đỉnh Nếu chúng ta biểu thị một tập hợp các đường đi từ u đến v bằng P(u,v) thì khoảng cách ngắn nhất giữa bất kì cặp (i,j) nào có thể được định nghĩa là d(i,j) = minp∈P(i,j){w(i,k1)+w(k1,k2)+…… +w(km,j)} (2) Trong đó m là số đỉnh trung gian Khi đó, bài toán đường đi ngắn nhất cho tất cả các cặp đỉnh là tìm ma trận cỡ nxn D=[d(i,j)] cho ma trận cỡ nxn W cho trước Chúng ta có thể định nghĩa một công thức đệ quy để tính đường đi ngắn nhất Gọi di,j(k) là khoảng cách của đường đi ngắn nhất (i,j) trong đó tất cả các đỉnh trung gian đều nằm trong tập hợp {1,2,…k} phép truy hồi được định nghĩa là { di,j(k) = min ⁡( dk−1(i , j ) ,d k−1 (i , k )+ dk−1 w (i , j ) nếu k=0 ( k , j )) nếu k ≥1 (3) -Ma trận D1=[dn(i,j)] đưa ra đáp án cho bài toán tìm đường đi ngắn nhất, tức là Dn=D=[d(i,j)] 14 Từ đó ta có mã giải của thuật toán: Cho G là đồ thị đơn giản có trọng số {G có các đỉnh v1,v2,…vn và các trọng số w(vi,vj) với w(vi,vj) = ∞ nếu {vi,vj} không phải là một cạnh} For i := 1 to n For j := 1 to n d(vi ,vj) := w(vi ,vj) For i := 1 to n For j :=1 to n For k := 1 to n If d(vi ,vj) + d(vi ,vk) ¿ d(vj ,vk) Then d(vj ,vk) := d(vj ,vi) + d(vi ,vk) Return[d(vi ,vj)]{d(vi ,vj) là độ dài đường đi ngắn nhất giữa vi và vj với 1 ≤ i ≤ n,1 ≤ j ≤ n} 4.Ưu/nhược điểm của thuật toán *Ưu điểm -Cách tiếp cận đơn giản, quen thuộc -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ị *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) 5.Input 1 đồ thị, tìm đường đi ngắn nhất bằng thuật toán Ví dụ: Dùng thuật toán Floyd-Warshall tìm đường đi ngắn nhất, viết ma trận đường đi ngắn nhất d(k) cho đồ thị dưới đây 15 Giải: -Áp dụng { di,j(k) = min ⁡( dk−1(i , j ) ,d k−1 (i , k )+ dk−1( k , j )) nếu k ≥1 w (i , j ) nếu k=0 -Ta có: Bước 1, khi k=0 ta có ma trận [ ] 0 3 8 ∞ −4 ∞0∞ 1 7 d(0)= ∞ 4 0 −5 ∞ 2∞∞ 0 ∞ ∞∞∞ 6 0 Bước 2, khi k=1 16 Ta có ma trận [ ] 0 3 8 ∞ −4 Bước 3, khi k=2 ∞0 ∞ 1 7 Ta có ma trận d(1)= ∞ 4 0 −5 ∞ 2 5 10 0 −2 ∞∞ ∞ 6 0 [ ] 0 3 8 ∞ −4 ∞0 ∞ 1 7 d(2)= ∞ 4 0 −5 11 2 5 10 0 −2 ∞∞ ∞ 6 0 Bước 4, khi k=3 [ ] 0 3 8 4 −4 Ta có ma trận ∞0 ∞ 1 7 d(3)= ∞ 4 0 −5 11 2 5 10 0 −2 ∞∞ ∞ 6 0 Bước 5, khi k=4 Ta có ma trận 17 [ ] 0 3 8 4 −4 3 0 11 1 −1 d(4)= −3 0 0 −5 −7 2 5 10 0 −2 8 11 16 6 0 Bước 6, khi k=5 Ta có ma trận [ ] 0 3 8 2 −4 3 0 11 1 −1 d(5)= −3 0 0 −5 −7 2 5 10 0 −2 8 11 16 6 0 Kết luận: vậy ma trận đường đi ngắn nhất của đồ thị là [ ] 0 3 8 2 −4 3 0 11 1 −1 d= −3 0 0 −5 −7 2 5 10 0 −2 8 11 16 6 0 6.Giải bài toán tìm đường đi ngắn nhất trong MATLAB Các hàm cơ bản được sử dụng: Lệnh Cú pháp Ý nghĩa Clear clear all -Xóa hết mọi giá trị, biến, dữ liệu ban đầu 18 Input A=input(‘tên biến’) -Nhập vào 1 giá trị cho biến A Min N= Min (A,B) -Nhập giá trị N bởi giá trị của biến nhỏ hơn trong hai biến A và B Length length( -Tính chiều dài vector Ones ones(N,N) -Tạo ra ma trận các phần tử 1 cấp N For for -Tạo vòng lặp If-(else)-end If-else- -Câu lệnh if xác định điềều kiện hoặc 1 nhóm end Fprint(‘ tên biến’) điềều kiện xảy ra thì cho phép thực hiện các disp(S) câu lệnh Fprintf -Thực hiện ghi định dạng vào màn hình Disp -Xuất giá trị của biến S ra màn hình 19 Đoạn code được sử dụng trong Matlab: 20

Ngày đăng: 24/03/2024, 22:27

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w