Tải bản đầy đủ (.pptx) (14 trang)

Báo cáo thuật toán floyd đh CNTTTT

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (536.92 KB, 14 trang )

TRƯỜNG ĐẠI HOC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG

LOGO

BÁO CÁO THỰC TẬP CƠ SỞ

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

Sinh viên thực hiện:
Nguyễn Khương Duy


CÁC MỤC CHÍNH

CHƯƠNG 1 : LÝ THUYẾT VỀ THUẬT TOÁN TÌM
ĐƯỜNG ĐI NGẮN NHẤT

1

2

3

CHƯƠNG 2 : CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI
NGẮN NHẤT

CHƯƠNG 3 : CHƯƠNG TRÌNH MÔ TẢ THUẬT TOÁN



Chương 1: LÝ THUYẾT VỀ THUẬT TOÁN TÌM
ĐƯỜNG ĐI NGẮN NHẤT
Các khái niệm cơ bản
Định nghĩa đồ thị
Phân loại đồ thị
Đường đi, chu trình, đồ
thị liên thông
Các thuật ngữ
Bậc của đỉnh


Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI
NGẮN NHẤT
Các thuật toán:

Thuật toán
Ford-Bellman

Thuật
toán Floyd

Thuật toán
Critical Path

Thuật toán
Dijkstra


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).
Đầ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
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)


Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI
NGẮN NHẤT
2.2 Thuật toán Dijkstra
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.
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.


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.
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.
Độ phức tạp của thuật toán Dijkstra là O(n2).


Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI
NGẮN NHẤT
2.3 Thuật toán Critical Path
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.
Đầ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Đồ 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
Đoạn chương trình:
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]] do
d [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.


Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI
NGẮN NHẤT
2.4 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).
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)
(đặc biệt nếu không có khuyên tại i thì d0 (i,i) = +∞).
Gán k:=0


Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI
NGẮN NHẤT
2.4 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.
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.
Đoạn chương trình:
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).


Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI
NGẮN NHẤT
2.4 Thuật toán Floyd
• Đị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.
Ứ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
....


Chương 3: CHƯƠNG TRÌNH MÔ TẢ THUẬT
TOÁN
3.1 Giao diện và chức năng chính:

1

2

3

Công cụ vẽ:
- Vẽ đỉnh
- Vẽ cạnh
- Di chuyển
- Xóa
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
Truy xuất kết quả:
- Từ: Đỉnh ban đầu.
- Đến: Đỉnh kết thúc.
- Bắt đầu: Thực hiện

Giao diện chính của chương trình


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

Bước 2

Bước 3

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).


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.

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.


LOGO

Cảm ơn thầy cô đã lắng nghe!




×