SLIDE BAO CAO THUẬT TOÁN FLOYD
Transcript of SLIDE BAO CAO THUẬT TOÁN FLOYD
![Page 1: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/1.jpg)
LOGO
Tìm hiểu về các thuật toán tìm đường đi ngắn nhất trên đồ thị, ứng với ngôn ngữ
lập trình C cài đặt thuật toán Floyd
BÁO CÁO THỰC TẬP CƠ SỞ
TRƯỜNG ĐẠI HOC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
Sinh viên thực hiện:Nguyễn Khương Duy
![Page 2: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/2.jpg)
CÁC MỤC CHÍNH
1
2
3 CHƯƠNG 3 : CHƯƠNG TRÌNH MÔ TẢ THUẬT TOÁN
CHƯƠNG 2 : CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT
CHƯƠNG 1 : LÝ THUYẾT VỀ THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT
![Page 3: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/3.jpg)
Các thuật ngữ
Bậc của đỉnh
Các khái niệm cơ bản
Định nghĩa đồ thị
Chương 1: LÝ THUYẾT VỀ THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT
Đường đi, chu trình, đồ thị liên thông
Phân loại đồ thị
![Page 4: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/4.jpg)
Các thuật toán: Thuật toán Ford-Bellman
Thuật toán Dijkstra
Thuật toán Floyd
Thuật toán Critical Path
Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT
![Page 5: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/5.jpg)
Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT
2.1 Thuật toán Ford-Bellman
Thuật toán tính các đường đi ngắn nhất tới tất cả các đỉnh còn lại trong một đồ thị có hướng có trọng số (trong đó một số cung có thể có trọng số âm).
Các bước thực hiện:
Bước 1: Với đỉnh xuất phát s. Gọi d[v] là khoảng cách từ s tới v với các giá trị khởi tạo là: � d[s] = 0 � d[v] = +∞ nếu v ≠ s
Bước 2: Tối ưu hóa các d[v] như sau : Xét mọi đỉnh u,v của đồ thị, nếu có một cặp đỉnh u,v mà d[v]>d[u]+c[u,v] thì ta đặt lại d[v]=d[u]+c[u,v].
Thuật toán Ford-Bellman có độ phức tạp là O(n3)
Đầu vào: đồ thị có hướng G=(V,E) với n đỉnh s V là đỉnh xuất phát.d[u,v],u,v V ma trận trọng số
Đầu ra : khoảng cách từ đỉnh s đến tất cả các đỉnh còn lại d[v], v Truoc[v],v V , ghi nhận đỉnh trước v trong đường đi ngắn nhất từ s đến v
![Page 6: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/6.jpg)
Tìm đường đi ngắn nhất từ đỉnh a đến đỉnh z trong đồ thị có trọng số. Trọng số của cạnh (i,j) là w(i,j) > 0 và đỉnh x sẽ mang nhãn L(x). Khi kết thúc thuật giải L(z) chính là chiều dài đường đi ngắn nhất từ a đến z.
Đầu vào: Đồ thị liên thông G = (V, E) có trọng số w(i, j) > 0 với mọi cạnh (i,j), đỉnh a và đỉnh z.
Đầu ra: Chiều dài đường đi ngắn nhất và đường đi ngắn nhất.
2.2 Thuật toán Dijkstra
Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT
Phương pháp:
Bước 1: Gán L(a) 0. Với mọi đỉnh x a gán L(x) = . Kí hiệu T V
Bước 2: Chọn v T sao cho L(v) có giá trị nhỏ nhất. Đặt:
T T – {v}
Bước 3: Nếu z T Kết thúc.
![Page 7: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/7.jpg)
Bước 4: Với mỗi x T kề với v gán:
L(x) min{L(x), L(v) + w(v, x)}
Nếu L(x) này thay đổi thì ghi nhớ đỉnh v cạnh x để sau này xây dựng đường đi ngắn nhất.
Quay về bước 2.
Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT
2.2 Thuật toán Dijkstra
L(z) là đường đi ngắn nhất từ a đến z. Từ z lần ngược theo các đỉnh được ghi nhớ ta có đường đi ngắn nhất. Ngược lại sang bước 4.
Độ phức tạp của thuật toán Dijkstra là O(n2).
![Page 8: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/8.jpg)
2.3 Thuật toán Critical Path
Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT
Thuật toán Critical Path tìm đường đi ngắn nhất từ đỉnh nguồn đến tất cả các đỉnh còn lại trên đồ thị không có chu trình.
Đoạn chương trình:
Đầu vào: Đồ thị G=(V,E) trong đó V= { v[1], v[2], ..., v[n] }Đối với mỗi cung (v[i],v[j]) E ta có i<j.Đồ thị được cho bởi danh sách kề Ke(v),v V.
Đầu ra: Khoảng cách từ v[1] đến tất cả các đỉnh còn lại được ghi trong mảng d[v[i] ], i=1,2,...,n
d[v[1]]:=0;for j:=2 to n do d[v[j]]:=a[v[1]],v[j]];for j:=2 to n do
for v Ke[v[j]] dod [v]:=min (d[v], d[v[j]] + a[v[j]], v );
Độ phức tạp của thuật toán là O(m)., do mỗi cung của đồ thị phải xét qua đúng một lần.
![Page 9: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/9.jpg)
Thuật giải tìm độ dài đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị có hướng liên thông có trọng số.
Đầu vào: Đồ thị liên thông G = (V,E), V= {1, 2, ... , n}, có trọng số w(i,j) >0 với mọi cung (i,j).
Đầu ra: Ma trận D=[d(i,j)], trong đó d(i,j) là chiều dài đường đi ngắn nhất từ i đến j với mọi cặp (i,j).
2.4 Thuật toán Floyd
Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT
Phương pháp:
Bước 1: Khởi tạo: Ký hiệu D0 là ma trận xuất phát
D0 = [d0(i,j)] Trong đó:
d0(i,j) = w(i,j) nếu tồn tại cung (i,j) d0 (i,j) = + nếu không tồn tại cung (i,j)
Gán k:=0 (đặc biệt nếu không có khuyên tại i thì d0 (i,i) = +).
![Page 10: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/10.jpg)
Bước 2: Kiểm tra kết thúc: Nếu k = n, kết thúc. D = Dn là ma trận độ dài đường đi ngắn nhất. Ngược lại: k:=k+1 Sang bước 3.
2.4 Thuật toán Floyd
Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT
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.
for (k=1; k>=n;k++) for (u=1; u<=n;u++) for (v=1;v<=n ;v++) c[u,v] = min ( c[u,v] , c[u,k] + c[k,v] );
Độ phức tạp của thuật toán Floyd là O(n3).
Đoạn chương trình:
![Page 11: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/11.jpg)
2.4 Thuật toán Floyd
Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT
Ứng dụng thuật toán Floyd-Warshall:•Tìm đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị có hướng.•Bài toán tìm bao đóng chuyển tiếp.•Tìm một biểu thức chính quy biểu thị các ngôn ngữ thông thường được chấp
nhận bởi một automaton hữu hạn.•Nghịch đảo của các ma trận thực.•Tối ưu định tuyến (Tìm kiếm các con đường với lưu lượng tối đa giữa hai đỉnh).•Kiểm tra đồ thị hai phía.•Tối đa băng thông....
Đị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 trình. (ii) Nếu ma trận kết quả chứa phần tử + ngoài đường chéo chính thì đồ thị
không liên thông mạnh.
![Page 12: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/12.jpg)
Chương 3: CHƯƠNG TRÌNH MÔ TẢ THUẬT TOÁN
Giao diện chính của chương trình
1Công cụ vẽ:- Vẽ đỉnh- Vẽ cạnh- Di chuyển- Xóa
2
Công cụ chỉnh sửa và hỗ trợ vẽ đồ thị:- Xóa cạnh mới nhất- Xóa cạnh- Xóa tất cả- Tùy chọn đồ thị vô hướng- Xóa đỉnh- Đổi màu
3Truy xuất kết quả:- Từ: Đỉnh ban đầu.- Đến: Đỉnh kết thúc.- Bắt đầu: Thực hiện
3.1 Giao diện và chức năng chính:
![Page 13: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/13.jpg)
Chương 3: CHƯƠNG TRÌNH MÔ TẢ THUẬT TOÁN
3.2 Các bước thực hiện chương trình:
Bước 1
Ban đầu ta cần nhập thông tin vào cho chương trình bằng cách sử dụng công cụ vẽ nằm phía dưới của chương trình để vẽ đồ thị, các thông tin về trọng số của 2 đỉnh sẽ không được nhập trực tiếp mà ta sẽ thực hiện bằng cách di chuyển các đỉnh ra xa nhau, chương trình sẽ tự động tăng trọng số nếu ta kéo 2 đỉnh ra xa (và ngược lại).
Bước 2
Sử dụng một số chức năng của chương trình để sửa, xóa, đổi mầu đỉnh đồ thị muốn xét. Ngay khi đưa dữ liệu vào thì chương trình tự động tính toán và đưa ra kết quả là ma trận có trọng số là đường đi ngắn nhất giữa các đỉnh và hiện trên chương trình cho nhìn ta thấy.
Bước 3
Chọn đỉnh ban đầu và đỉnh kết thúc để chương trình đưa ra kết quả là đường đi ngắn nhất giữa 2 đỉnh đó. Đường đi sẽ được hiện màu xanh đoạn gạch đứt và có 1 chấm màu xanh đậm di chuyển từ điểm đầu đến điểm cuối.
![Page 14: SLIDE BAO CAO THUẬT TOÁN FLOYD](https://reader034.fdocuments.net/reader034/viewer/2022050708/55cf9b86550346d033a66584/html5/thumbnails/14.jpg)
LOGO