1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo môn phân tích đánh giá thuật toán

18 191 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

HỌC VIỆN KỸ THUẬT QUÂN SỰ KHOA CÔNG NGHỆ THÔNG TIN O0O BÀI TẬP MƠN PHÂN TÍCH VÀ ĐÁNH GIÁ THUẬT TỐN Giáo viên hướng dẫn: PGS TS Đào Thanh Tĩnh Người thực hiện: Phạm Phương Duy Lớp: Cao học CNTT – khóa K25 HÀ NỘI 2014 MỤC LỤC LỜI NĨI ĐẦU 1 LỜI NÓI ĐẦU Trên thực tế có nhiều tốn liên quan tới tập đối tượng mối liên hệ chúng, địi hỏi tốn học phải đặt mơ hình biểu diễn cách chặt chẽ tổng qt ngơn ngữ ký hiệu, đồ thị Những ý tưởng đưa từ kỷ thứ XVIII nhà toán học Thụy Sĩ Leonhard Euler, ơng dùng mơ hình đồ thị để giải toán cầu Konigsberg tiếng Mặc dù Lý thuyết đồ thị khoa học phát triển từ lâu lại có nhiều ứng dụng đại Đặc biệt khoảng vài mươi năm trở lại đây, với đời máy tính điện tử phát triển nhanh chóng Tin học, Lý thuyết đồ thị quan tâm đến nhiều Đặc biệt thuật tốn đồ thị có nhiều ứng dụng nhiều lĩnh vực khác như: Mạng máy tính, Lý thuyết mã, Tối ưu hóa, Kinh tế học,… Chẳng hạn trả lời câu hỏi: Hai máy tính mạng liên hệ với hay khơng?; hay vấn đề phân biệt hai hợp chất hóa học có công thức phân tử lại khác công thức cấu tạo giải nhờ mô hình đồ thị Bài tốn tìm hai đường cho khơng có cạnh chung có tổng độ dài ngắn Lý thuyết đồ thị tốn có ứng dụng cao thực tế Vì vậy, em chọn đề để nghiên cứu Cấu trúc báo cáo chia thành hai phần: Phần I: Giới thiệu tốn Trình bày tốn đặt mơ tả liệu vào tốn Phần II: Giải tốn Trình bày khái niệm liên quan đến đồ thị thuật tốn tìm đường ngắn Dijkstra thuật tốn tìm đường theo chiều sâu Từ kết hợp hai thuật toán để giải toán đặt báo cáo 2 Để hoàn thành báo cáo trước hết chúng em xin chân trọng tỏ lòng biết ơn tới PGS TS Đào Thanh Tĩnh - người trực tiếp giảng dạy mơn học Phân tích Đánh giá thuật toán với cách thức truyền đạt khoa học nghiêm túc Chúng xin chân thành cảm ơn bạn bè đồng nghiệp nhiệt tình giúp đỡ bảo, cịn hạn chế nhiều mặt nên báo cáo không tránh khỏi thiếu sót, mong Thầy bạn nhận xét góp ý để chúng tơi hồn thiện báo cáo 3 Phần I GIỚI THIỆU BÀI TỐN Bài tốn đặt Cho đồ thị vơ hướng G ={V, E} cho danh sách cạnh DS Cho u, v ∈ V Xây dựng thuật toán tìm hai đường α (u,v) β (u,v) cho khơng có cạnh chung có tổng độ dài ngắn  Phát biểu lại toán: - Có đồ thị vơ hướng G gồm n đỉnh m cạnh cho danh sách cạnh sau: Canh = Record d,c: Tên đỉnh; Length: Độ dài đường đi; End; Ds[1 m] Of Canh; - Yêu cầu: Tìm hai đường α (u,v) β (u,v) cho khơng có cạnh chung có tổng độ dài ngắn Mô tả liệu vào/ra toán 2.1 Dữ liệu vào Từ file văn “dulieuvao.inp” có cấu trúc sau: + Dịng thứ ghi số nguyên dương cách dấu cách là: - n số đỉnh đồ thị G; - m số cạnh đồ thị G; - u đỉnh xuất phát; - v đỉnh đích + Dòng thứ i số m dòng ghi ba số cách dấu là: - d đỉnh đầu cạnh; - c đỉnh cuối cạnh; - Length độ dài cạnh (đường đi) 2.2 Dữ liệu Được ghi vào file văn “dulieura.out” có cấu trúc sau: + Dòng thứ ghi đường α (u,v); + Dòng thứ hai ghi đường β (u,v); + Dòng thứ ba tổng độ dài ngắn hai đường đi; Phần II GIẢI QUYẾT BÀI TOÁN Khái niệm đồ thị 1.1 Định nghĩa đồ thị (Graph) Là cấu trúc rời rạc gồm đỉnh cạnh nối đỉnh Được mơ tả hình thức: G=(V,E) V gọi tập đỉnh (Vertices) E gọi tập cạnh (Edges) Có thể coi E tập cặp (u, v) với u v hai đỉnh V Một số hình ảnh đồ thị: Có thể phân loại đồ thị theo đặc tính số lượng tập cạnh E: Cho đồ thị G=(V, E) Định nghĩa cách hình thức G gọi đơn đồ thị hai đỉnh u, v V có nhiều cạnh E nối từ u tới v G gọi đa đồ thị hai đỉnh u, v V có nhiều cạnh E nối từ u tới v (Hiển nhiên đơn đồ thị đa đồ thị) G gọi đồ thị vô hướng cạnh E không định hướng, tức cạnh nối hai đỉnh u, v cạnh nối hai đỉnh u, v Hay nói cách khác, tập E gồm cặp (u, v) khơng tính thứ tự (u, v) ≡ (v, u ) G gọi đồ thị có hướng cạnh E có định hướng, có cạnh nối từ đỉnh u tới đỉnh v chưa 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ặp (u, v) có tính thứ tự: (u, v) ≠ (v, u ) Trong đồ thị có hướng, cạnh gọi cung Đồ thị vơ hướng coi đồ thị có hướng ta coi cạnh nối hai đỉnh u, v tương đương với hai cung (u, v) (v, u) Ví dụ: 1.2 Biểu diễn đồ thị máy tính 1.2.1 Ma trận kiền kề (Ma trận kề) Giả sử G=(V, E) đơn đồ thị có số đỉnh (ký hiệu V ) n Khơng tính tổng qt coi đỉnh đánh số 1, 2,…, n Khi ta biểu [ ] diễn đồ thị ma trận vuông A = aij cấp n Trong đó: • aij = ( i, j ) ∈ E • aij = ( i, j ) ∉ E • Quy ước aii = với ∀i ; Đối với đa đồ thị việc biểu diễn tương tự trên, có điều (i, j) cạnh khơng phải ta ghi số vào vị trí aij mà ghi số cạnh nối đỉnh i đỉnh j 1.2.2 Danh sách cạnh Trong trường hợp đồ thị có n đỉnh, m cạnh, ta có theerbieeur diễn đồ thị dạng danh sách cạnh, cách biểu diễn này, người ta liệt kê tất cạnh đồ thị danh sách, phần tử danh sách cặp (u, v) tương ứng với cạnh đồ thị (Trong trường hợp đồ thị có hướng cặp (u, v) tương ứng với cung, u đỉnh đầu v đỉnh cuối cung) Danh sách lưu nhớ dạng mảng danh sách móc nối Ví dụ với đồ thị đây: Ưu điểm danh sách cạnh:  Trong trường hợp đồ thị thưa (có số cạnh tương đối nhỏ: chẳng hạn m < 6n), cách biểu diễn danh sách cạnh tiết kiệm khơng gian lưu trữ, cần 2m nhớ để lưu danh sách cạnh  Trong số trường hợp, ta phải xét tất cạnh đồ thị cài đặt danh sách cạnh làm cho việc duyệt cạnh dễ dàng (Thuật toán Kruskal chẳng hạn) Nhược điểm danh sách cạnh:  Nhược điểm danh sách cạnh ta cần duyệt tất đỉnh kề với đỉnh v đồ thị, chẳng có cách khác phải duyệt tất cạnh, lọc cạnh chứa đỉnh v xét đỉnh cịn lại Điều tốn thời gian trường hợp đồ thị dày (nhiều cạnh) 1.3 Dây chuyền, chu trình, đường Mạch Cho đồ thị G=(V,E) Dây chuyển: Một day chuyền G dãy luân phiên đỉnh cạnh: v1e1v2 e2  vm−1em−1vm ( vi đỉnh ei cạnh) Trong đồ thị thỏa mãn điều kiện ei liên kết với cặp đỉnh vi , vi +1 không phân biệt thứ tự, nghĩa là: ei = ( vi , vi +1 ) hay ei = ( vi +1 , vi ) đồ thị có hướng, ei = { vi , vi +1} đồ thị vơ hướng Khi ta gọi v1 đỉnh đầu vm đỉnh cuối dây chuyền Dây chuyền sơ cấp: Dây chuyền khơng có đỉnh lặp lại Chu trình: Là dây chuyền v1e1v2 e2  vm−1em−1vm em v1 cho đỉnh v1 , v2 , , vm đôi khác Đường đi: Một đường G dãy luân phiên đỉnh cạnh: v1e1v2 e2  vm−1em−1vm ( vi đỉnh ei cạnh) đồ thị thỏa mãn điều kiện ei liên kết với cặp đỉnh ( vi , vi +1 ) , nghĩa là: ei liên kết với ( vi , vi +1 ) đồ thị có hướng, ei liên kết với { vi , vi +1} đồ thị vơ hướng Khi ta gọi v1 đỉnh đầu vm đỉnh cuối đường Đường sơ cấp: Đường khơng có đỉnh lặp lại Mạch: Là đường v1e1v2 e2  vm−1em−1vm em v1 cho đỉnh v1 , v2 , , vm đôi khác Thuật tốn tìm đường ngắn Dijkstra Xét đồ thị G=(V,E) có trọng với V = {1,2, , n} giả sử cạnh không âm - Dữ liệu nhập cho thuật toán ma trận trọng lượng L (với qui ước Lhk = +∞ khơng có cạnh nối từ đỉnh h đến đỉnh k) hai đỉnh i, j cho trước - Dữ liệu xuất đường ngắn từ i đến j Bước 1: Gán T:= V gắn nhãn: Dodai[i]=0; Dodai[k]= + ∞ , ∀k ∈V \ { i} ; Nhan[k]= -1, ∀k ∈V Bước 2: Nếu j ∉ T dừng giá trị Dodai[j] độ dài đường ngắn từ i đến j Nha[j] đỉnh nằm trước j đường Bước 3: Chọn đỉnh v ∈ T cho Dodai[v] nhỏ gán T := T \ { v} Bước 4: Với đỉnh k ∈ T có cạnh nối từ v đến k, Dodai[k] > Dodai[v] + Lvk Dodai[k] = Dodai[v] + Lvk Nha[k] = v Trở bước Ghi chú: Khi thuật tốn dừng, Dodai[j]= + ∞ khơng tồn đường từ i đến j, ngược lại Dodai[j] độ dài đường ngắn ta lần ngược đường ngắn (đi ngược từ j trờ lại i) sau: write(j); 10 k:= Nhan[j]; while ki Do Begin write(‘< ‘, k); K:= Nhan[k]; End; write(‘< ‘, i); Ví dụ: Áp dụng thuật tốn Dijkstra, tìm đường ngắn đỉnh k đến đỉnh e, với liệu đồ thị G có hướng, liên thông cho danh sách cạnh sau: 1) 2) 3) 4) 5) 6) 7) 8) a b f e g h m k k j h i i e e d 9) 10) 11) 12) 13) 14) 15) 16) b a f g e g h k c f g m b k e h 17) 18) 19) 20) 21) 22) 23) 24) d c i d j i a e m h f b e c d b 25) 26) 27) 28) 28) h f h d e g j h k i Giải - Từ liệu đồ thị ta có danh sách kề sau: V- V a a, e, f, d b b, d, e c e, i, h d f, i, h, a e a, h f f, e g g, k, m, h j h, j, k i m, g k g m k j V+ b, f, e c c, b d, b, c, g e, g, b h, m, k i, e, f, d e, d j, h, i k, h i, h - Ta dùng bảng để tìm đường ngắn từ đỉnh k đến đỉnh e: 10 11 Bước Đỉnh xét k j h i e Nh a b c d e f g h i k m j S ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ 0 5 φ k k, j k, j, h ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ 8 ∞ ∞ ∞ ∞ ∞ ∞ k, j, h, i k, j, h, i, e Từ bảng ta có độ dài đường từ k tới e Xác định đường đi: 1) u0 = e; 2) V-(e) = {f, i, h, a} ; L(e) = 6; L(f)= 5; F(f,e) = 2; L(f) + F(f,e) = + = > = L(e) L(i)= 4; F(i,e) = 2; L(i) + F(i,e) = + = = = L(e) L(h)= 3; F(h,e) = 4; L(h) + F(h,e) = + = > = L(e) L(a)= ∞ ; F(a,e) = 1; L(a) + F(a,e) = ∞ + = ∞ > = L(e) Vậy u1 = i; 2) V-(i) = {h, j, k} L(h)= 3; F(h,i) = 1; L(h) + F(h,i) = + = = = L(i) L(j)= 1; F(j,i) = 6; L(j) + F(j,i) = + = > = L(i) L(k)= 0; F(k,i) = 5; L(k) + F(k,i) = + = > = L(i) Vậy u2 = h; 3) V-(h) = {g, k, m, j} L(g)= 9; F(g,h) = 2; L(g) + F(g,h) = + = 11 > = L(h) L(k)= 0; F(k,h) = 4; L(k) + F(k,h) = +4 = > = L(h) L(m)= ∞ ; F(m,h) = 6; L(m) + F(m,h) = ∞ + = ∞ > = L(h) L(j)= 1; F(j,h) = 2; L(j) + F(j,h) = + = = = L(h) Vậy u3 = j; 4) V-(j) = {k} L(k)= 0; F(k,j) = 1; L(k) + F(k,j) = + = = = L(j) 11 12 Vậy u4 = k; Suy đường từ k tới e là: Thuật toán duyệt đỉnh đồ thị theo theo chiều sâu + Input: - Đồ thị G liên thơng, có n đỉnh, cho ma trận kề A=(aij)n + Output: - Các đỉnh đồ thị + Giả mã: For i:= To n Do Đx[i]:= False; Procedure DS(v: Đỉnh xuất phát); Đx[v]:= True; Output v; For i:=1 To n Do If (!Đx[i]) and (A[v,i]=1) Then DS(i); Kết hợp thuật tốn Dijsktra tìm kiếm theo chiều sâu để giải toán đặt Ý tưởng: Đầu tiên, ta sử dụng tìm kiếm theo chiều sâu để tìm đường từ đỉnh u đến đỉnh v Tiếp đến, ta đánh dấu cạnh đường lại (hoặc coi đồ thị không tồn cạnh thuộc đường này) Sau đó, ta sử dụng thuật tốn Dijsktra để tìm đường ngắn từ đỉnh u đến đỉnh v Tiếp đến, ta lưu lại kết hai đường (tổng độ dài hai đường đi, ) tiếp tục làm lại từ đầu so sánh tổng độ dài chúng với để ta tìm hai đường thỏa mãn u cầu tốn khơng có cạnh chung tổng độ dài ngắn Để làm rõ ý tưởng trên, sử dụng ví dụ để mơ tả chi tiết ý tưởng chúng tơi Ví dụ: Cho đồ thị có hình Giả sử đỉnh u = đỉnh v = Với ý tưởng trên, thực sau: 12 13 1 1 - Đầu tiên, sử dụng tìm kiếm theo chiều sâu để tìm đường từ đỉnh đến đỉnh 4, ví dụ kết tìm kiếm là: 1->2->3->4, có tổng độ dài là: - Tiếp đến, ta đánh dấu cạnh đường đồ thị (hoặc tạo đồ thị khơng có cạnh thuộc đường trên) Đồ thị có dạng sau: 3 1 - Lúc ta sử dụng thuật tốn Dijsktra để tìm đường ngắn từ đỉnh đến đỉnh đồ thị Kết tìm là: 1->6->5->4, có tổng độ dài là: - Như vậy, ta tìm hai đường thỏa mãn điều kiện khơng có cạnh chung, là: + Đường 1: 1->2->3->4, có tổng độ dài là: + Đường 2: 1->6->5->4, có tổng độ dài là: 13 14 Tổng độ dài hai đường là: - Bây ta quay lại bước sử dụng tìm kiếm theo chiêu sâu để tìm đường từ đỉnh đến đỉnh khác làm vậy, ta lại hai đường so sánh với kết hai đường trước kết có tổng độ dài hai đường nhỏ lưu lại Độ phức tạp thuật tốn Thuật tốn Dijstra có độ phức tạp O(n^2 + m) Trong thuật toán DFS, đường từ u đến v tìm thấy với độ phức tạp O(n+m) cần duyệt qua tất đường từ u đến v nên độ phức tạp hàm DFS O((n + m)*p) với p tổng số đường từ u đến v Thực nghiệm chương trình Sau hồn thành thuật tốn chúng tơi thử nghiệm với số đồ thị có kết sau: Trên máy tính có cấu hình: - CPU: Core duo, 64bit Intel E6750 2.66GHz - RAM: 2GB DDRII Số đỉnh 12 15 20 30 Sổ cạnh 29 41 62 89 Thời gian chạy 1s 3s 250 NA s 14 15 TÀI LIỆU THAM KHẢO - Đào Thanh Tĩnh, Các giảng môn học Thiết kế đánh giá thuật toán - Một số tài liệu Lý thuyết đồ thị - Một số trang web mạng Internet 15 ... hai thuật tốn để giải toán đặt báo cáo 2 Để hoàn thành báo cáo trước hết chúng em xin chân trọng tỏ lòng biết ơn tới PGS TS Đào Thanh Tĩnh - người trực tiếp giảng dạy môn học Phân tích Đánh giá. .. đường trước kết có tổng độ dài hai đường nhỏ lưu lại Độ phức tạp thuật toán Thuật toán Dijstra có độ phức tạp O(n^2 + m) Trong thuật toán DFS, đường từ u đến v tìm thấy với độ phức tạp O(n+m) cần... trúc báo cáo chia thành hai phần: Phần I: Giới thiệu tốn Trình bày tốn đặt mơ tả liệu vào toán Phần II: Giải tốn Trình bày khái niệm liên quan đến đồ thị thuật tốn tìm đường ngắn Dijkstra thuật

Ngày đăng: 23/05/2018, 14:44

Xem thêm:

TỪ KHÓA LIÊN QUAN

w