1. Trang chủ
  2. » Tất cả

Bài giảng Toán rời rạc Bài 9 - TS. Nguyễn Văn Hiệu

21 6 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

BÀI BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT TRÊN ĐỒ THỊ Giáo viên: TS Nguyễn Văn Hiệu Email: nvhieuqt@dut.udn.vn Nội dung • • • • • Giới thiệu Bài toán Thuật toán Ford-Bellman Thuật toán Dijkstra Thuật toán Floyd A 8 B C 2 E Nguyễn Văn Hiệu, 2012, Discrete Mathematics D F Giới thiệu  Có nhiều cách hai điểm  Chọn ngắn theo nghĩa cự ly,  Chọn đường nhanh theo nghĩa thời gian  Chọn đường rẽ theo chi phí,  Chọn gửi liệu nhanh d(u,v)=? G = (V , E) Nguyễn Văn Hiệu, 2012, Discrete Mathematics mi j =1 mi j >0 Bài toán  Cho G = (V, E) đồ thị có trọng lượng  s ∈ V t ∈ V  Hãy tìm đường có tổng trọng lượng nhỏ từ s đến t • Đường ngắn từ Etna đến Oldtown là: Etna – Bangor – Orono – OldTown • Đường ngắn từ Hermae đến Etna là: Hermae – Hampdea – Bangor - Etna Nguyễn Văn Hiệu, 2012, Discrete Mathematics Bài toán Điều kiện toán  Phải tồn đường từ s đến t:  Đồ thị vô hướng liên thơng  Đồ thị có hướng liên thơng mạnh  Đồ thị vô hướng, s t nằm thành phần liên thơng  Đồ thị có hướng, có tồn đường từ s đến t  Trong đồ thị khơng tồn chu trình âm  Đồ thị có hướng: khơng tồn chu trình âm  Đồ thị vô hướng: không tồn cạnh âm Bài toán Nhận xét  Nếu v đỉnh trung gian đường ngắn từ s đến t đường từ s đến v phải ngắn đường từ v đến t phải ngắn  Do đó, để tối ưu, người ta mở rộng tốn tìm đường ngắn từ đỉnh đến tất đỉnh lại đồ thị Thuật tốn Ford-Bellman Ý tưởng • Dị tìm cách thử qua đỉnh trung gian Nếu phát đường qua đỉnh trung gian ngắn đường cập nhật đường mới, đồng thời chỉnh sửa thông tin liên quan • Sử dụng hai mảng – Mảng d[v]: Lưu trữ độ dài đường ngắn từ s đến v – Mảng T[v]: Lưu trữ đỉnh nằm trước v đường ngắn if d[v] > d[u] + c[u,v] then { d[v] = d[u] + c[u,v]; Truoc[v] = u; } Thuật toán Ford-Bellman • * Khởi tạo * for v  V d[v]:= c[s,v]; T[v]:=s; • * Bắt đầu * d[s]:=0; for k:=1; k ≤ n-2 for v  V\{ s} for u  V if d[v] > d[u] + c[u,v] d[v]:=d[u]+c[u,v]; T[v]:=u; k 0,1 1,1  ,1  ,1 3,1 0,1 1,1 4,2 4,2 -1,3 0,1 1,1 4,2 3,5 -1,3 0,1 1,1 4,2 3,5 -1,3 Thuật toán Ford-Bellman k 0,1 1,1  ,1  ,1 ,1 ,1 S=1 0,1 1,1 ,2 ,2 7,4 7,3 0,1 1,1 ,4 ,2 7,4 5,3 0,1 1,1 ,4 ,2 6,6 5,3 0,1 1,1 ,4 ,2 6,6 5,3 Thuật toán Ford-Bellman Nhận xét: • Áp dụng cho trường hợp • Chi phí tính tốn lớn dùng vịng lặp lồng • Thường lãng phí số bước sau Cải tiến: • Khơng thể cải tiến tốt cho trường hợp tổng qt • Chỉ làm tốt cho số trường hợp riêng Thuật toán Dijkstra Nhận xét thuật toán Ford-Bellman k 0,1 1,1  ,1  ,1 ,1 ,1 S=1 • • Kết bảng ổn định từ sớm Trên dòng, giá trị d nhỏ không thay đổi sau trọng số cạnh không âm 0,1 1,1 ,2 ,2 7,4 7,3 0,1 1,1 ,4 ,2 7,4 5,3 0,1 1,1 ,4 ,2 6,6 5,3 0,1 1,1 ,4 ,2 6,6 5,3 Thuật tốn Dijkstra Chú ý • Thuật tốn dùng cho đồ thị khơng có cạnh âm Ý tưởng • Do khơng có cạnh âm nên bước, có đỉnh mà thơng tin khơng thay đổi sau • Tại bước, ta không cần phải kiểm tra qua tất đỉnh trung gian, mà chỉ: – Chọn đỉnh u có giá trị d[u] nhỏ – Chọn u làm đỉnh trung gian để xác định bước Thuật toán Dijkstra (* Khởi tạo *) for v  V d[v]:=c[s,v]; T[v]:=s; d[s]:=0; T: =V\{s}; (*T tập đỉnh chưa cố định *) (* Bước lặp *) while T  Tìm đỉnh u  T: d[u]=min{d[z]:zT}; T:=T\{u} ; (* Cố định nhãn u*) For v T If d[v]>d[u]+c[u,v] d[v]:=d[u]+c[u,v]; T[v]:=u; k 0,1 1,1*  ,1  ,1 ,1 ,1 ,2 ,2* ,1 8,2 ,4* 7,4 8,2 7,4 5,3* 6,6* Thuật tốn Dijkstra Ví dụ Demo Result Source Code Thuật tốn Floyd Mục tiêu • G đồ thị có hướng hướng, liên thơng , có trọng số • Tìm đường ngắn với cặp đỉnh Giải pháp • Sử dụng Dijkstra nhiều lần • Sử dụng thuật toán Floyd Nguyễn Văn Hiệu, 2012, Discrete Mathematics 15 Thuật toán Floyd Input  Ma trận trọng số C Output  Ma trận đường ngăn cặp đỉnh  {d[i,j] } i,j =1 n,  d[i,j] – độ dài đường từ i đến j  Ma trận ghi nhận đường  {p[i,j] }i,j =1 n,  p[i,j] – ghi nhận đỉnh trước đỉnh j đường ngắn từ i đến j Nguyễn Văn Hiệu, 2012, Discrete Mathematics 16 Thuật toán Floyd // Khởi tạo For i:=1 to n For j:=1 to n do{ d[i,j] := a[i,j]; p[i,j] := i; } // Bước lặp For k:=1 to n For i:=1 to n For j:=1 to n If(d[i,j]>d[i,k]+d[k,j]){ d[i,j] := d[i,k] + d[k,j]; p[i,j] := p[k,j]; } 10   10  10       1      Ma trận d Nguyễn Văn Hiệu, 2012, Discrete Mathematics 1 2  3  4 4 1  3  4 Ma trận p 17 Khởi tạo Thuật toán Floyd   10  10       1      Ma trận d   10  10    k=1    1        10  10     k=2         1 1 2 2  3 3  4 4 Ma trận p 1  3  4 1 2  3  4 1  3  4 1 2  3  4 4 10 1  3  4 2   10  10       1      1 2  3  4 4 1  k=3 3  4   5  3   3  1      1 4  4  4 4 4 4 1  k=4 3  4 Nguyễn Văn Hiệu, 2012, Discrete Mathematics 18 Thuật toán Floyd 10   5  3   3  1     1 4  4  4 4 4 4 1  3  4 Đọc đường đi:  Từ đến 3:  Trước p[1,3] = Vậy đỉnh nằm trước đường  Trước p[1,4] = Vậy đỉnh nằm trước đường  Dừng Đường là: – – với độ dài d[1,3] =  Tương tự, đường ngắn từ đến là: – – với độ dài d[3,2] = Nguyễn Văn Hiệu, 2012, Discrete Mathematics 19 Bài tập  Lập trình thực thuật tốn mơ tả:  Thuật tốn Dijkstra  Thuật toán Floyd  Xác định độ phức tạp thuật toán Nguyễn Văn Hiệu, 2012, Discrete Mathematics 20 THAT’S ALL; THANK YOU What NEXT? ...Nội dung • • • • • Giới thiệu Bài toán Thuật toán Ford-Bellman Thuật toán Dijkstra Thuật toán Floyd A 8 B C 2 E Nguyễn Văn Hiệu, 2012, Discrete Mathematics D F Giới thiệu  Có nhiều cách hai... d[3,2] = Nguyễn Văn Hiệu, 2012, Discrete Mathematics 19 Bài tập  Lập trình thực thuật tốn mơ tả:  Thuật tốn Dijkstra  Thuật toán Floyd  Xác định độ phức tạp thuật toán Nguyễn Văn Hiệu, 2012,... Đường ngắn từ Hermae đến Etna là: Hermae – Hampdea – Bangor - Etna Nguyễn Văn Hiệu, 2012, Discrete Mathematics Bài toán Điều kiện toán  Phải tồn đường từ s đến t:  Đồ thị vô hướng liên thơng

Ngày đăng: 13/09/2016, 23:32

Xem thêm: