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
Trang 1Tì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
Trang 2CÁ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
Trang 3Cá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ị
Trang 4Các thuật toán: Thuật toán
Ford-Bellman
Thuật toán Dijkstra
Thuật
Chương 2: CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI
NGẮN NHẤT
Trang 5Chươ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
Trang 6Tì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
Trang 7Bướ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).
Trang 82.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]] 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
Trang 9Thuậ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) = +∞)
Trang 10Bướ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:
Trang 112.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
Trang 12Chương 3: CHƯƠNG TRÌNH MÔ TẢ THUẬT
TOÁN
Giao diện chính của chương trình
1
Cô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
3
Truy 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:
Trang 13Chươ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.
Trang 14Cảm ơn thầy cô đã lắng nghe!