Báo cáo thực tập cơ sở thuật toán Floyd

32 1.5K 13
Báo cáo thực tập cơ sở thuật toán Floyd

Đ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

Báo cáo thực tập cơ sở thuật toán Floyd

LỜI NÓI ĐẦU Lý thuyết đồ thị là một lĩnh vực nghiên cứu đã có từ lâu đời và 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 từ 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. Chính ông là người đã sử dụng đồ thị để giải bài toán nổi tiếng về các cái cầu ở thàng phố Konigsberg. Đồ thị được sử dụng để giải quyết các bài toán trong nhiều lĩnh vực khác nhau. Chẳng hạn, đồ thị có thể sử dụng để xác định các mạch vòng trong vấn đề giải tích mạch điện. Chúng ta có thể phân biệt các hợp chất hoá học hữu cơ khác nhau với cùng công thức phân tử nhưng khác nhau về cấu trúc phân tử nhờ đồ thị. Chúng ta có thể xác định xem hai máy tính trong mạng có thể trao đổi thông tin được với nhau hay không nhờ mô hình đồ thị của mạng máy tính. Đồ 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 cùng một mạng giao thông. Chúng ta còn sử dụng đồ thị để giải các bài toán về lập lịch, thời khoá biểu, và phân bố tần số cho các trạm phát thanh và truyền hình Mục đích của đề tài là tìm hiểu là nhằm giới thiệu các khái niệm cơ bản, các bài toán ứng dụng quan trọng của lý thuyết đồ thị như bài toán tìm đường đi ngắn nhất và những thuật toán để giải quyết chúng đã được trình bày chi tiết cùng với việc phân tích và hướng dẫn cài đặt chương trình trên máy tính. Trong thời gian làm đề tài em được giúp đỡ và trực tiếp chỉ bảo tận tình của cô giáo DƯƠNG THỊ MAI THƯƠNG. Em xin chân thành cảm ơn cô đã giúp đỡ em hoàn thành báo cáo này. Mặc dù đã cố gắng hoàn thiện đề tài với tất cả sự nỗ lực của bản thân, nhưng không thể tránh khỏi những thiếu sót. Kính mong quý Thầy Cô tận tình chỉ bảo. Em xin chân thành cảm ơn! Thái Nguyên, tháng 04 năm 2015 Sinh viên - Trang 1 - MỤC LỤC CHƯƠNG 1 : LÝ THUYẾT VỀ THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 1.1 Các khái niệm cơ bản của lý thuyết đồ thị 5 1.1.1 Giới thiệu 5 1.1.2 Định nghĩa đồ thị 6 1.1.3 Phân loại đồ thị 7 1.1.4 Các thuật ngữ 8 1.1.5 Định lý về bậc của đỉnh 9 1.1.6 Đường đi, chu trình, đồ thị liên thông 10 1.2 Các thuật toán tìm đường đi ngắn nhất 11 1.2.1 Thuật toán Ford-Bellman 11 1.2.2 Thuật toán Dijkstra 12 1.2.3 Đường đi trong đồ thị không có chu trình 13 1.2.4 Đường đi ngắn nhất giữa tất cả các cặp đỉnh 16 CHƯƠNG 2 : THUẬT TOÁN FLOYD 2.1 Nội dung thuật toán Floyd 18 2.2 Ứng dụng của thuật toán Floyd-Warshall 23 CHƯƠNG 3 : CHƯƠNG TRÌNH MÔ TẢ THUẬT TOÁN 3.1 Giao diện chính của chương trình 24 3.2 Các bước thực hiện chương trình 24 3.3 Các chức năng chính của chương trình 25 3.4 Cài đặt – thử nghiệm 26 KẾT LUẬN 30 TÀI LIỆU THAM KHẢO 31 - Trang 2 - DANH MỤC HÌNH VẼ Hình 1.1 Cầu ở Konigsberg 5 Hình 1.2 Nhà toán học Thụy Sĩ Leonhard Euler 5 Hình 1.3 Đồ thị vô hướng 6 Hình 1.4 Đồ thị con 6 Hình 1.5 Các loại đồ thị 7 Hình 1.6 Đơn đồ thị 7 Hình 1.7 Đa đồ thị 7 Hình 1.8 Giả đồ thị 8 Hình 1.9 Ví dụ bậc của đỉnh 9 Hình 1.10 Bậc vào và bậc ra 9 Hình 1.11 Đồ thị G và các thành phần liên thông G1, G2, G3 10 Hình 1.12 Liên thông mạnh và liên thông yếu 11 Hình 1.13 Khớp và cầu 11 Hình 1.14 Thí dụ 1 12 Hình 1.15 Đồ thị không có chu trình 14 Hình 2.1 Đồ thị ví dụ 20 Hình 3.1 Giao diện chương trình 24 Hình 3.2 Công cụ vẽ 25 Hình 3.3 Công cụ chỉnh sửa và hỗ trợ vẽ đồ thị 25 Hình 3.4 Truy xuất kết quả 25 Hình 3.5 Hiển thị kết quả của chương trình 26 Hình 3.6 Bài toán thử nghiệm 27 Hình 3.7 Kết quả chạy chương trình 28 Hình 3.8 Dòng thông báo 29 - Trang 3 - DANH MỤC BẢNG BIỂU Bảng 1.1 So sánh các loại đồ thị…………………………….……………………………8 Bảng 1.2 Kết quả tính toán theo thuật toán Dijkstra…………………………………….13 Bảng 2.1 Kết quả lần lặp đầu tiên……………………………………… ………………20 Bảng 2.2 Kết quả lần lặp thứ 1…………………………………………… ……………21 Bảng 2.3 Kết quả lần lặp thứ 2………………………………………………………… 21 Bảng 2.4 Kết quả lần lặp thứ 3……………………………………….………………….21 Bảng 2.5 Kết quả lần lặp thứ 4……………………………………… …………………22 Bảng 2.6 Kết quả lần lặp thứ 5…………………………………… ……………………22 Bảng 2.7 Kết quả lần lặp thứ 6………………………………………….……………….22 Bảng 3.1 Ma trận trọng số…………………………………………….…………………28 - Trang 4 - Chương I : LÝ THUYẾT VỀ THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT I.1 Các khái niệm cơ bản của lý thuyết đồ thị 1.1.1 Giới thiệu - Bài toán về các cây cầu ở Konigsberg: Có cách nào để đi dạo qua tất cả bảy cây cầu, mà mỗi cây cầu chỉ đi qua một lần ? Hình 1.1 Cầu ở Konigsberg - Năm 1736, là năm khai sinh lý thuyết đồ thị, qua việc công bố lời giải bài toán về các cây cầu ở Konigsberg của nhà toán học Euler. - Năm 1736, là năm khai sinh lý thuyết đồ thị, qua việc công bố lời giải bài toán về các cây cầu ở Konigsberg của nhà toán học Euler. Hình 1.2 Nhà toán học Thụy Sĩ Leonhard Euler (April 1707 – September 1783) - Trang 5 - G H 1.1.2 Định nghĩa đồ thị Khái niệm đồ thị là một mô hình toán học dùng để giải quyết rất nhiều bài toán và các vấn đề toán học. Một đồ thị có thể hiểu một cách đơn giản là một hệ thống các đỉnh và các cạnh nối các đỉnh này với nhau. Ví dụ: Một bản đồ giao thông là một đồ thị với hệ thống đỉnh là các ngã ba, ngã tư. Các đường đi là các cạnh của đồ thị. Định nghĩa 1: Đồ thị G được xác định bởi (V, E) gồm: - V là tập hợp hữu hạn khác rỗng các phần tử gọi là đỉnh (hay nút) của đồ thị; - E là tập hợp các cặp đỉnh. Mỗi phần tử của E được gọi là một cạnh. Hình 1.3 Đồ thị vô hướng Định nghĩa 2: Cho hai đồ thị G = (V,E) và G’ = (V’,E’) - G’ được gọi là đồ thị con của G, ký hiệu G’≤ G nếu V’ ⊆ V và E’ ⊆ E - Nếu V’ = V và E’ ⊆ E thì G’ được gọi là đồ thị con khung của G. Hình 1.4 Đồ thị con - Trang 6 - San Francisco Denver Los Angeles New York Chicago Washington Detroit San Francisco Denver Los Angeles New York Chicago Washington Detroit 1.1.3 Phân loại đồ thị Đồ thị G được phân loại theo đặc tính và số lượng của tập các cạnh E: Hình 1.5 Các loại đồ thị Đồ thị G được phân loại theo đặc tính và số lượng của tập các cạnh E: - G được gọi là đơn đồ thị nếu giữa hai đỉnh u, v thuộc V chỉ có nhiều nhất là 1 cạnh. Hình 1.6 đơn đồ thị - G được gọi là đa đồ thị nếu giữa hai đỉnh u, v thuộc V có nhiều hơn 1 cạnh. Hình 1.7 Đa đồ thị - Đa đồ thị G được gọi là giả đồ thị nếu có khuyên. Khuyên là cạnh có hai đầu mút trùng nhau, dạng (u,u). - Trang 7 - San Francisco Denver Los Angeles New York Chicago Washington Detroit Hình 1.8 Giả đồ thị - G là đồ thị vô hướng nếu các cạnh trong E là không định hướng. Tập E gồm các cặp (u,v) không sắp thứ tự (u,v)≡ (v,u) - G là đồ thị có hướng nếu các cạnh trong E là có định hướng. Trong đồ thị có hướng, hai điểm u và v, có thể được nối bởi hai cung (u,v) và (v,u). Loại đồ thị Cạnh Có cạnh bội Có khuyên Đơn đồ thị vô hướng Vô hướng Không Không Đa đồ thị vô hướng Vô hướng Có Không Giả đồ thị vô hướng Vô hướng Có Có Đồ thị có hướng Có hướng Không Có Đa đồ thị có hướng Có hướng Có Có Bảng 1.1 So sánh các loại đồ thị 1.1.4 Các thuật ngữ Cạnh uv nối u với v, cạnh uv được gọi là cạnh liên thuộc với u,v; đỉnh u được gọi là kề với đỉnh v. Hai cạnh nối cùng một cặp đỉnh gọi là cạnh song song. Cạnh uv nối u với v, cạnh uv được gọi là cạnh liên thuộc với u,v; đỉnh u được gọi là kề với đỉnh v. Cho đồ thị vô hướng G = (V,E). Bậc của đỉnh v, ký hiệu deg(v), là số cạnh liên thuộc với v. Trong đó một khuyên tại một đỉnh được đếm hai lần cho bậc của đỉnh ấy. - Đỉnh có bậc bằng 0 gọi là đỉnh cô lập - Đỉnh có bậc bằng 1 gọi là đỉnh treo - Trang 8 - a b d c e f a b c d e f Ví dụ 1: Hình 1.9 Ví dụ bậc của đỉnh deg(a)=2; deg(b)=4; deg(f)= 3 deg(d)=0; deg(c)=1 Đỉnh d là đỉnh cô lập Đỉnh c là đỉnh treo Cho đồ thị có hướng G* = (V,E). - bậc ra của đỉnh v, ký hiệu deg + (v), là số cung đi ra khỏi đỉnh, - bậc vào của đỉnh v, ký hiệu deg - (v), là số cung đi vào đỉnh. Hình 1.10 Bậc vào và bậc ra 1.1.5 Định lý về bậc của đỉnh Định lý: Với G là đồ thị vô hướng, với m cạnh, khi đó tổng số bậc của đỉnh là 2m. Hệ quả: Trong đồ thị vô hướng, tổng số đỉnh bậc lẻ là một số chẵn. Định lý: Với G là đồ thị vô hướng, với m cạnh, khi đó tổng số bậc của đỉnh là 2m. - Trang 9 - Hệ quả: Trong đồ thị vô hướng, tổng số đỉnh bậc lẻ là một số chẵn. Định lý: Với G* là đồ thị có hướng, với m cung, khi đó chúng ta có công thức: 1.1.6 Đường đi, chu trình, đồ thị liên thông Định nghĩa: Cho G = (V,E) là đồ thị vô hướng u,v∈V a) Đường đi (dây chuyền) độ dài k nối hai đỉnh u,v là dãy đỉnh và cạnh liên tiếp nhau v 0 e 1 v 1 e 2 …v k-1 e k v k sao cho: v 0 =u ,v k = v, e i =v i-1 v i , i=1,2,…,k b) Đường đi không có cạnh nào xuất hiện quá một lần gọi là đường đi đơn c) Đường đi không có đỉnh nào xuất hiện quá một lần gọi là đường đi sơ cấp Định nghĩa: Đường đi được gọi là chu trình nếu bắt đầu và kết thúc tại cùng một đỉnh Đường đi đơn có đỉnh bắt đầu và đỉnh kết thúc trùng nhau tạo ra chu trình đơn. Định nghĩa: Đồ thị vô hướng G = (V,E) được gọi là liên thông nếu luôn tìm được đường đi giữa hai đỉnh bất kỳ của đồ thị. Với đồ thị G không liên thông, G được phân rã thành một số đồ thị con liên thông. Mỗi đồ thị con này được gọi là thành phần liên thông. Hình 1.11 Đồ thị G và các thành phần liên thông G1, G2, G3 Định nghĩa: Đồ thị có hướng G* = (V,E) tính liên thông được xác định theo hướng của cung. Đồ thị G* là liên thông mạnh nếu luôn tìm được đường đi giữa hai đỉnh bất kỳ của đồ thị. Đồ thị G* là liên thông yếu nếu chỉ tồn tại đồ thị vô hướng nền của nó là liên thông. - Trang 10 - [...]... thì thuật toán Floyd sẽ gặp khó khăn, hay thuật toán Ford-Bellman làm việc khá chậm) Vì vậy yêu cầu trước tiên là phải hiểu bản chất và thành thạo trong việc cài đặt tất cả các thuật toán trên để có thể sử dụng chúng một cách uyển chuyển trong từng trường hợp cụ thể Những bài tập sau đây cho ta thấy rõ điều đó - Trang 17 - Chương II : THUẬT TOÁN FLOYD 2.1 Nội dung thuật toán Floyd: Floyd là giải thuật. .. cơ bản để cho dù đường đi thật có tồi tệ đến đâu vẫn tốt hơn đường đi trực tiếp theo cạnh tưởng tượng ra đó Xét về độ phức tạp tính toán, nếu cài đặt như trên, thuật toán Ford-Bellman có độ phức tạp là O(n3), thuật toán Dijkstra là O(n2), thuật toán Floyd là O(n3) Khác với một bài toán đại số hay hình học có nhiều cách giải thì chỉ cần nắm vững một cách cũng có thể coi là đạt yêu cầu, những thuật toán. .. k++) - Trang 26 - { if (FloydData[i, k].Value > 0) { if (FloydData[j, k].Value < 0 || FloydData[j, i].Value + FloydData[i, k].Value < FloydData[j, k].Value) { FloydData[j, k].Value = FloydData[j, i].Value + FloydData[i, k].Value; FloydData[j, k].Previous = i; } } } } } } } FloydCell là một cấu trúc được định nghĩa để lưu trữ giá trị trọng số của cạnh và đỉnh trung gian: struct FloydCell { public int... then Begin d[i,j]:= d[i,k] + d[k,j]; p [i,j]:= p [k,j]; end; end; Rõ ràng độ phức tạp của thuật toán là O(n3) Khác biệt rõ ràng của thuật toán Floyd là khi cần tìm đường đi ngắn nhất giữa một cặp đỉnh khác, chương trình chỉ việc in kết quả chứ không phải thực hiện lại thuật toán Floyd nữa - Trang 16 - NHẬN XÉT: Bài toán đường đi dài nhất trên đồ thị trong một số trường hợp có thể giải quyết bằng cách... Bước 3: Tính ma trận Dk theo Dk-1 Với mọi cặp (i,j), i=1 n, j=1 n thực hiện: Nếu dk-1(i,j) > dk-1(i,k) + dk-1(k,j) thì đặt dk (i,j) := dk-1(i,k) + dk-1(k,j) ngược lại đặt dk(i,j) := dk-1 (i,j) Quay lại bước 2 Độ phức tạp của thuật toán Floyd là: O(n3) Định lý : Thuật toán Floyd là đúng Hệ quả : (i) Nếu ma trận kết quả của thuật toán Floyd có phần tử hữu hạn trên đường chéo chính thì đồ thị chứa chu... Sau đó tạo thêm một mảng 2 chiều FloydData để lưu kết quả sau quá trình thực hiện thuật toán Floyd public void Floyd( ) { if (Data == null) return; int n = Data.GetLength(0); FloydData = new MatrixCell[n, n]; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) FloydData[i, j] = new FloydCell(Data[i, j]); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (FloydData[j, i].Value > 0) { for... lặp vẫn sẽ không quá n - 1 bước 1.2.2 Thuật toán Dijkstra Trong trường hợp trọng số trên các cung không âm, thuật toán do Dijkstra đề xuất dưới đây hoạt động hiệu quả hơn nhiều so với thuật toán Ford-Bellman Ta hãy xem trong trường hợp này, thuật toán Ford-Bellman thiếu hiệu quả ở chỗ nào: Với đỉnh v ∈ V, Gọi d[v] là độ dài đường đi ngắn nhất từ s tới v Thuật toán FordBellman khởi gán d[s] = 0 và d[v]... dụng n lần thuật toán mô tả ở mục trước, trong đó ta sẽ chọn s lần lượt là các đỉnh của đồ thị Rõ ràng, khi đó ta thu được thuật toán với độ phức tạp là O(n 4) (nếu dùng tt Ford-Bellman) hoặc O(n 3) đối với trường hợp trọng số không âm hoặc đồ thị không có chu trình Trong trường hợp tổng quát, sử dụng thuật toán Ford-Bellman n lần không phải là cách làm tốt nhất Ở đây ta sẽ mô tả thuật toán với độ... Hình 2.1 Áp dụng thuật toán Floyd: Ma trận khoảng cách xuất phát D0 là (các ô trống là ∞): Bảng 2.1 - Trang 20 - Bảng 2.2 Bảng 2.3 Bảng 2.4 - Trang 21 - Bảng 2.5 Bảng 2.6 Cuối cùng, D là ma trận khoảng cách ngắn nhất giữa các đỉnh Theo hệ quả ta thấy đồ thị liên thông mạnh và chứa chu trình: Bảng 2.7 - Trang 22 - 2.2 Ứng dụng của thuật toán Floyd- Warshall Trong các ứng dụng thực tế, bài toán tìm đường... trên - Nếu ta thực hiện tìm đường đi ngắn nhất từ một đỉnh đến một đỉnh khác mà không có đường đi nào đến đỉnh đó thì chương trình sẽ hiển thị lên thông báo VD: Đỉnh ban đầu là F, đỉnh đến là C thì chương trình sẽ đưa ra dòng thông báo: - Trang 29 - Hình 3.8 Dòng thông báoKẾT LUẬN Qua đề tài đã thực hiện trong thời gian qua, em đã nắm bắt được cơ bản kiến thức về lý thuyết đồ thị, các thuật toán để giải . THUẬT TOÁN FLOYD 2.1 Nội dung thuật toán Floyd 18 2.2 Ứng dụng của thuật toán Floyd- Warshall 23 CHƯƠNG 3 : CHƯƠNG TRÌNH MÔ TẢ THUẬT TOÁN 3.1 Giao diện chính của chương trình 24 3.2 Các bước thực. từng trường hợp cụ thể. Những bài tập sau đây cho ta thấy rõ điều đó. - Trang 17 - Chương II : THUẬT TOÁN FLOYD 2.1 Nội dung thuật toán Floyd: Floyd là giải thuật tìm độ dài đường đi ngắn nhất. của thuật toán là O(n 3 ). Khác biệt rõ ràng của thuật toán Floyd là khi cần tìm đường đi ngắn nhất giữa một cặp đỉnh khác, chương trình chỉ việc in kết quả chứ không phải thực hiện lại thuật toán

Ngày đăng: 25/07/2015, 18:39

Từ khóa liên quan

Mục lục

  • LỜI NÓI ĐẦU

  • 1.1.3 Phân loại đồ thị................................................................................................7

  • Hình 1.3 Đồ thị vô hướng

  • Định nghĩa 2: Cho hai đồ thị G = (V,E) và G’ = (V’,E’)

  • G’ được gọi là đồ thị con của G, ký hiệu G’£ G nếu V’ Í V và E’ Í E

  • Nếu V’ = V và E’ Í E thì G’ được gọi là đồ thị con khung của G.

  • Hình 1.4 Đồ thị con

  • 1.1.3 Phân loại đồ thị

  • Đồ thị G được phân loại theo đặc tính và số lượng của tập các cạnh E:

  • Đồ thị G được phân loại theo đặc tính và số lượng của tập các cạnh E:

  • - G được gọi là đơn đồ thị nếu giữa hai đỉnh u, v thuộc V chỉ có nhiều nhất là 1 cạnh.

  • Hình 1.6 đơn đồ thị

  • - G được gọi là đa đồ thị nếu giữa hai đỉnh u, v thuộc V có nhiều hơn 1 cạnh.

  • Hình 1.7 Đa đồ thị

  • - Đa đồ thị G được gọi là giả đồ thị nếu có khuyên. Khuyên là cạnh có hai đầu mút trùng nhau, dạng (u,u).

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

Tài liệu liên quan