SLIDE BAO CAO THUẬT TOÁN FLOYD

14
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

Transcript of SLIDE BAO CAO THUẬT TOÁN FLOYD

Page 1: SLIDE BAO CAO THUẬT TOÁN FLOYD

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

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

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

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

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

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

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

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

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

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

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

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

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

LOGO