TìM HIỂU các THUẬT TOÁN TRÊN đồ THỊ

12 286 0
TìM HIỂU các THUẬT TOÁN TRÊN đồ THỊ

Đ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

CHUYÊN ĐỀ CÔNG NGHỆ PHẦN MỀM Họ tên Sinh viên - Nguyễn Văn Tiến - Mai Văn Tú - Nguyễn Văn Ninh Tên đề tài: TÌM HIỂU CÁC THUẬT TOÁN TRÊN ĐỒ THỊ Giới thiệu đề tài Đồ thị lĩnh vực có từ lâu có nhiều ứng dụng đại Đồ thị sử dụng để giải toán nhiều lĩnh vực khác Đồ thị có trọng số cạnh sử dụng để giải toán như: Tìm đường ngắn hai thành phố mạng giao thông Chúng ta sử dụng đồ thị để giải toán lập lịch, thời khóa biểu, phân bố tần số cho trạm phát truyền hình… Đồ thị cấu trúc rời rạc bao gồm đỉnh cạnh nối đỉnh Chúng ta phân biệt loại đồ thị khác kiểu số lượng cạnh nối hai đỉnh đồ thị Các nội dung - Tổng quan - Thuật toán tìm kiếm - Thuật toán tìm đường ngắn - Cây bao trùm nhỏ Chương Tổng Quan 1.1 Các khái niệm 1.1.1 Đồ thị vô hướng Đồ thị có hướng G= bao gồm: - V tập hợp hữu hạn đỉnh - E tập hợp hữu hạn, có thứ tự cặp đỉnh V, gọi cạnh Ví dụ: Đồ thị có hướng G1= V1={a, b, c, d}; E1={(a, b); (a, c); (b,d); (c, b); (d,d)} Biểu diễn hình học đồ thị sau: Trong đồ thị có hướng, cạnh cặp có thứ tự đỉnh, vi cạnh (a, c) (c, a) khác Ngoài đỉnh nối đến để tạo thành cạnh Mỗi thành phần thuộc V gọi đỉnh nút đồ thị V gọi tập đỉnh đồ thị Mỗi thành phần thuộc E gọi cạnh cung , E gọi tập cạnh đồ thị Một cạnh (u, v) đồ thị có hướng biểu thị dạnh u v Đỉnh u gọi đỉnh kề v Cạnh (u, v) gọi cạnh xuất phát từ u Ta kí hiệu A(u) tập cạnh xuất phát từ u Cạnh (u, v) gọi cạnh tới v, kí hiệu I(v) tập cạnh tới v Bậc đỉnh số cạnh xuất phát từ đỉnh Do bậc u=|A(u)|.Bậc đỉnh số cạnh đinh tới đỉnh đó, bậc v=| I(v)| 1.1.2 Đồ thị vô hướng Đồ thị vô hướng đồ thị có cạnh hướng Hai nút hai đầu cạnh có vai trò Đồ thị vô hướng G=(V,E) bao gồm: - V tập hợp hữu hạn đỉnh - E tập hợp hữu hạn cặp đỉnh phân biệt V, gọi cạnh Ví dụ: Đồ thị vô hướng G2= V2={a, b, c, d}; E1={(a, b); (a, c); (b,d); (c, b); } Khi biểu diễn hình học đồ thị sau: Các cạnh đồ thị hướng, cạnh (u,v)~ cạnh (v,u) Trong đồ thị vô hướng cạnh (u,v) coi cạnh xuất phát đồng thời cạnh tới u v Bậc đỉnh tổng số cạnh xuất phát tới đỉnh 1.1.3 Đồ thị có trọng số Với đồ thị trình bày trên, cạnh đồ thị biểu thị có liên kết từ đỉnh tới đỉnh khác đồ thị Tuy nhiên, thực tế có nhiều ứng dụng đồ thị cần thêm số thông tin cho liên kết Chẳng hạn khoảng cách nút đồ thị thành phố đồ, đồ thị biểu thị việc chuyển trạng thái loại máy tác động số thao tác, v.v 40Km Hà Nội Bắc Ninh 96Km Ninh Bình 155Km Thai Bình 45Km Đồ thị có trọng số 1.2 Biểu diễn đồ thị 1.2.1 Biểu diễn đồ thị ma trận kề Giả sử ta có đồ thị có hướng G = bao gồm n đỉnh {v 1, v2, … vn} Phương pháp biểu diễn đồ thị ma trận kề sử dụng ma trận A (n x n) xác định sau: Aij = (vi, vj)∈ E (vi, vj)∉E Có nghĩa phần tử hàng i, cột j ma trận A có giá trị có cạnh nối từ v i đến vj Ngược lại, phần tử có giá trị Ma trận gọi ma trận kề đồ thị có hướng (V, E) Để biểu diễn đồ thị có trọng số ma trận kề, ta thay phần tử có giá trị ma trận trọng số cạnh tương ứng, với phần tử có giá trị 0, ta thay giá trị ∞ cho biết cạnh nối đỉnh tương ứng Ưu điểm phương pháp biểu diễn đồ thị ma trận kề ta dễ dàng biết có cạnh nối đỉnh vi, vj hay không có trọng số Tuy nhiên, phương pháp có nhược điểm kích thước ma trận kề luôn n x n đồ thị có cạnh 1.2.2 Biểu diễn đồ thị danh sách cạnh Phương pháp sử dụng danh sách liên kết cho đỉnh đồ thị Danh sách liên kết đỉnh chứa đỉnh khác kề với nó, danh sách gọi danh sách kề Ví dụ, với đồ thị có hướng Với đồ thị vô hướng Chương 2: Thuật toán tìm kiếm đồ thị Trong giải toán mô tả đồ thị, ta cần qua đỉnh cung đồ thị Việc qua đỉnh đồ thị gọi thuật toán tìm kiếm hay gọi duyệt đồ thị 2.1 Thuật toán tìm kiếm theo chiều sâu DFS Quá trình duyệt theo chiều sâu đỉnh đồ thị Sau thăm đỉnh này, trình duyệt theo chiều sâu lặp lại với tất đỉnh kề Tuy nhiên đồ thị tồn chu trình, ta cần phải đánh dấu đỉnh duyệt để tránh duyệt lại đỉnh lần Với trình tự duyệt trình duyệt duyệt hết nhánh nhánh đồ thị sang nhánh khác Ví dụ: Quá trình duyệt theo chiều sâu đỉnh a, thứ tự duyệt sau: - Sau thăm đỉnh a, tiến hành thăm đỉnh kề với a b thăm đỉnh kề với b d Đỉnh d không kề với đỉnh nào, quay lại bước trước - Đỉnh b có đỉnh kề d, thăm, quay lại bước trước - Đỉnh a đỉnh kề c chưa thăm, tiến hành thăm đỉnh Như vậy, thứ tự đỉnh trình duyệt là: a, b, d, c Quá trình duyệt duyệt theo cạnh dẫn tới đỉnh chưa thăm Các cạnh dẫn tới đỉnh thăm bỏ qua Chẳng hạn trình duyệt đồ thị duyệt đến đỉnh c cạnh nối tới b bỏ qua đỉnh b thăm 2.2 Thuật toán tìm kiếm theo chiều rộng BFS Quá trình duyệt theo chiều rộng đỉnh đồ thị, tiếp đến đỉnh kề thăm, tiếp tục đến đỉnh kề đỉnh vừa thăm v.v Như vậy, trình duyệt theo chiều rộng không duyệt theo nhánh đồ thị mà duyệt theo độ sâu đỉnh so với đỉnh ban đầu Từ đỉnh bắt đầu, đỉnh có khoảng cánh với đỉnh ban đầu duyệt, tiếp đến đỉnh có khoảng cách v.v Ví dụ: Quá trình duyệt theo chiều rộng: - Bắt đầu từ đỉnh a - Sau thăm đỉnh a, tiến hành thăm đỉnh kề với a b c - Tiếp theo thăm đỉnh kề với b d - Đỉnh kề với c b thăm nên bỏ qua Như vậy, thứ tự đỉnh thăm a, b, c,d Chương 3: Thuật toán tìm đường ngắn Trong thực tế, mạng lưới giao thông đường bộ, đường thủy đường hàng không Người ta không quan tâm đến việc tìm đường hai địa điểm mà phải lựa chọn hành trình tiết kiệm không gian, thời gian chi phí Khi phát sinh yêu cầu tìm đường ngắn hai đỉnh đồ thị Bài toán phá biểu dạng tổng quát sau: Cho đồ thị có trọng số G=(V,E), tìm đường ngắn từ điểm xuất phát S đến đích F Độ dài đường ta ký hiệu d[S,F] Nếu không tồn đường từ S tới F ta đặt khoảng cách =+∞ • Nếu đồ thị có chu trình âm (chu trình với độ dài âm) khoảng cách số cặp đỉnh không xác định, cách vòng theo chu trình số lần đủ lớn, ta đường hai đỉnh chu trình nhỏ số cho trước Trong trường hợp vậy, đặt vấn đề tìm đường (đường đỉnh lặp lại) ngắn Vấn đề vấn đề phức tạp mà ta không bàn tới • Nếu đồ thị chu trình âm ta chứng minh đường ngắn đường Và biết khoảng cách từ S tới tất đỉnh khác đường ngắn từ S tới F tìm cách dễ dàng qua thuật toán sau: Gọi c[u, v] trọng số cạnh [u, v] Qui ước c[v, v] = với v ∈ V c[u, v] = +∞ (u, v) ∉ E Đặt d[S, v] khoảng cách từ S tới v Để tìm đường từ S tới F, ta nhận thấy tồn đỉnh F1 ≠ F cho: d[S, F] = d[S, F1] + c[F1, F] (Độ dài đường ngắn S->F = Độ dài đường ngắn S->F1 + Chi phí từ F1 tới F) Đỉnh F1 đỉnh liền trước F đường ngắn từ S tới F Nếu F1≡S đường ngắn đường trực cung (S, F) Nếu không vấn đề trở thành tìm đường ngắn từ S tới F1 Và ta lại tìm đỉnh F2 khác F F1 để: d[S, F1] = d[S, F2] + c[F2, F1] 3.1 Thuật toán FORD BELLMAN Thuật toán Ford-Bellman phát biểu đơn giản: Với đỉnh xuất phát S Gọi d[v] khoảng cách từ S tới v Ban đầu d[v] khởi gán c[S, v] Sau ta tối ưu hoá dần d[v] sau: Xét cặp đỉnh u, v đồ thị, có cặp đỉnh u, v mà d[v] > d[u]+ c[u, v] ta đặt lại d[v] := d[u] + c[u, v] Tức độ dài đường từ S tới v lại lớn tổng độ dài đường từ S tới u cộng với chi phí từ u tới v ta huỷ bỏ đường từ S tới v có coi đường từ S tới v đường từ S tới u sau tiếp từ u tới v Chú ý ta đặt c[u, v] = +∞ (u, v) không cung Thuật toán kết thúc tối ưu thêm nhãn d[v] Tính dúng thuật toán: • Tại bước lặp 1: Bước khởi tạo d[v] = c[S, v]: dãy d[v] độ dài ngắn đường từ S tới v qua không cạnh • Giả sử bước lặp thứ i (i ≥ 1), d[v] độ dài đường ngắn từ S tới v qua không I cạnh, tính chất: đường từ S tới v qua không i + cạnh phải thành lập cách: lấy đường từ S tới đỉnh u qua không i cạnh, tiếp tới v cung (u, v) Nên độ dài đường ngắn từ S tới v qua không i + cạnh tính giá trị nhỏ giá trị: (Nguyên lý tối ưu Bellman) ♦ Độ dài đường ngắn từ S tới v qua không i cạnh ♦ Độ dài đường ngắn từ S tới u qua không i cạnh cộng với trọng số cạnh (u, v) (∀u) Vì vậy, sau bước lặp tối ưu d[v] công thức d[v]bước i+1 = min(d[v]bước i, d[u]bước i+ c[u, v]) (∀u) d[v] độ dài đường ngắn từ S tới v qua không i + cạnh Sau bước lặp tối ưu thứ n - 2, ta có d[v] = độ dài đường ngắn từ S tới v qua không n – cạnh Vì đồ thị chu trình âm nên có đường ngắn từ S tới v đường (qua không n - cạnh) Tức d[v] độ dài đường ngắn từ S tới v Vậy số bước lặp tối ưu hoá không n - bước Trong cài đặt chương trình, bước ta mô tả dạng: for u := to n for v := to n d[v] := min(d[v], d[u] + c[u, v]); Thì tối ưu bắc cầu (dùng d[u] tối ưu d[v] lại dùng d[v] tối ưu d[w] ) nên làm tốc độ tối ưu nhãn d[v] tăng nhanh lên giảm 3.2 Thuật toán DIJKSTRA Trong trường hợp trọng số cung không âm, thuật toán Dijkstra đề xuất hoạt động hiệu nhiều so với thuật toán Ford-Bellman Ta xem trường hợp này, thuật toán Ford-Bellman thiếu hiệu chỗ nào: Với đỉnh v ∈ V, Gọi d[v] độ dài đường ngắn từ S tới v Thuật toán FordBellman khởi tạo d[v] = c[S, v] Sau tối ưu hoá dần nhãn d[v] cách sửa nhãn theo công thức: d[v] := min(d[v], d[u] + c[u, v]) với ∀u, v ∈ V Như ta dùng đỉnh u sửa nhãn đỉnh v, sau ta lại tối ưu d[u] thêm ta phải sửa lại nhãn d[v] dẫn tới việc d[v] phải chỉnh chỉnh lại nhiều lần Vậy nên chăng, bước ta xét cặp đỉnh (u, v) để dùng đỉnh u sửa nhãn đỉnh v mà chọn đỉnh u đỉnh mà tối ưu nhãn d[u] thêm Thuật toán Dijkstra (E.Dijkstra - 1959) mô tả sau: Bước 1: Khởi tạo Với đỉnh v ∈ V, gọi nhãn d[v] độ dài đường ngắn từ S tới v Ta tính d[v] Ban đầu d[v] khởi gán c[S, v] Nhãn đỉnh có hai trạng thái tự hay cố định, nhãn tự có nghĩa tối ưu nhãn cố định tức d[v] độ dài đường ngắn từ S tới v nên tối ưu thêm Để làm điều ta sử dụng kỹ thuật đánh dấu: Free[v] = TRUE hay FALSE tuỳ theo d[v] tự hay cố định Ban đầu nhãn tự Bước 2: Lặp Bước lặp gồm có hai thao tác: Cố định nhãn: Chọn đỉnh có nhãn tự do, lấy đỉnh u đỉnh có d[u] nhỏ nhất, cố định nhãn đỉnh u Sửa nhãn: Dùng đỉnh u, xét tất đỉnh v sửa lại d[v] theo công thức: d[v] := min(d[v], d[u] + c[u, v]) Bước lặp kết thúc mà đỉnh đích F cố định nhãn (tìm đường ngắn từ S tới F); thao tác cố định nhãn, tất đỉnh tự có nhãn +∞ (không tồn đường đi) Có thể đặt câu hỏi, thao tác 1, đỉnh u cố định nhãn, giả sử d[u] tối ưu thêm tất phải có đỉnh t mang nhãn tự cho d[u] > d[t] + c[t, u] Do trọng số c[t, u] không âm nên d[u] > d[t], trái với cách chọn d[u] nhỏ Tất nhiên lần lặp S đỉnh cố định nhãn d[S] = Bước 3: Kết hợp với việc lưu vết đường bước sửa nhãn, thông báo đường ngắn tìm cho biết không tồn đường (d[F] = +∞) Chương 4: Cây bao trùm ngắn 4.1 Thuật toán Prim 4.1.1 Phương pháp Bắt đầu đỉnh A đồ thị G gồm n đỉnh, ta tìm đỉnh gần đỉnh A số đỉnh có đường từ đỉnh A, giả sử đỉnh đỉnh B Từ đỉnh có đường từ đỉnh A từ đỉnh B, ta lại chọn đỉnh gần đỉnh A gần đỉnh B cho không tạo nên chu trình, giả sử đỉnh tìm đỉnh C Quá trình tiếp tục không tim đỉnh thỏa mãn Kết thu khung nhỏ có n đỉnh n-1 cạnh 4.1.2 Ví dụ minh họa Bắt đầu từ đỉnh Khoảng cách d(1/2)=2 * d(1/3)=9 d(1/5)=15 Chọn 2, tập S={1, 2} Tìm đỉnh gần đỉnh đỉnh d(1/3)=9 d(1/5)=15 d(2/4)=9 d(2/5)=15 Chọn đỉnh 3, tập S={1, 2, 3} Tìm đỉnh gần đỉnh đỉnh đỉnh d(1/5)=15 d(2/4)=9 d(2/5)=15 d(3/6)=15 Chọn đỉnh 4, tập S={1,2,3,4} Quá trình tiếp tục Kết quả: Tập S={1,2,3,4,5,7,9,10,6,8} 4.2 Thuật toán Kruskal 10 4.2.1 Phương pháp Cho đồ thị G=(X, E) Là đò thị liên thông có trọng số gồm n đỉnh Bước 1: Sắp xếp cạnh theo thứ tự trọng số tang dần khởi tạo T:= Ø Bước 2: Lấy cạnh e đầu danh sách xếp (có trọng số nhỏ nhất) Nếu T + {e} không chứa chu trình gán T:= T + {e} Loại cạnh e khỏi danh sách Bước 3: Nếu T đủ n-1 phần tử dừng lại, ngược lại làm tiếp tục bước 4.2.2 Ví dụ minh họa Cho đồ thị sau: Tìm khung nhỏ đồ thị Bước 1: Sắp xếp cạnh theo thứ tự trọng số tăng dần khởi tạo T := Ø Gọi lstEdge tập cạnh thứ tự trọng tăng: lstEdge = {(2,4); (1,2); (1,4); (3,4); (2,3)} T := Ø Bước 2: Lấy cạnh e đầu danh sách xếp (có trọng nhỏ nhất) Nếu T + {e} không chứa chu trình gán T:= T + {e} Loại cạnh e khỏi danh sách Vì cạnh (2,4) bổ sung vào T (T = Ø ) không tạo thành chu trình nên: T = {(2,4)} Danh sách cạnh: {(1,2); (1,4); (3,4); (2,3)} Bước 3: Nếu T đủ n-1 phần tử dừng, ngược lại làm tiếp tục bước Ở đâyT có phần tử < n – = – = nên thuật toán chưa dừng 11 Bước (lần 2):Cạnh (1,2) không tạo chu trình thêm vào T, vậy: T = {(2,4); (1,2)} lstEdge = {(1,4); (3,4); (2,3)} Bước (lần 3): Cạnh (1,4) thêm vào T tạo thành chu trình nên không xét cạnh Cạnh (3,4) thỏa mãn: T = {(2,4); (1,2); (3,4)} lstEdge = {(2,3)} T đủ nên dừng thuật toán Kết Luận Tài liệu tham khảo [1] Đinh Mạnh Tường “ Cấu trúc giữ liệu giải thuật” Khoa CNTT Trường ĐH Công Nghệ ĐHQG Hà Nội [2] Giáo trình “Cấu trúc giữ liệu giải thuật” – Dùng cho sinh viên hệ đại học đào tạo từ xa Học viện Công Nghệ Bưu Chính Viễn Thông 2007 12

Ngày đăng: 01/07/2016, 12:53

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan