oán rời rạc 2,ngô xuân bách,hvcnbcvt Bài toán tìm đường đi ngắn nhất Ngô Xuân Bách Học viện Công nghệ Bưu chính Viễn thông Khoa Công nghệ thông tin 1 Toán rời rạc 2 CuuDuongThanCong com https fb co.oán rời rạc 2,ngô xuân bách,hvcnbcvt Bài toán tìm đường đi ngắn nhất Ngô Xuân Bách Học viện Công nghệ Bưu chính Viễn thông Khoa Công nghệ thông tin 1 Toán rời rạc 2 CuuDuongThanCong com https fb co.
Học viện Cơng nghệ Bưu Viễn thơng Khoa Cơng nghệ thơng tin Tốn rời rạc Bài tốn tìm đường ngắn Ngơ Xn Bách CuuDuongThanCong.com https://fb.com/tailieudientucntt Nội dung Phát biểu tốn tìm đường ngắn Thuật toán Dijkstra Thuật toán Bellman-Ford Thuật toán Floyd CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Bài toán tìm đường ngắn (1/2) Khái niệm độ dài đường đồ thị o o o Xét đồ thị 𝐺 =< 𝑉, 𝐸 > với tập đỉnh 𝑉 tập cạnh 𝐸 Với cạnh (𝑢, 𝑣) ∈ 𝐸, ta đặt tương ứng số thực 𝑎(𝑢, 𝑣) gọi trọng số cạnh, 𝑎(𝑢, 𝑣) = ∞ (𝑢, 𝑣) ∉ 𝐸 Nếu dãy 𝑣0 , 𝑣1 , , 𝑣𝑘 đường 𝐺 gọi độ dài đường 𝑘 𝑖=1 𝑎(𝑣𝑖−1 , 𝑣𝑖 ) Bài tốn dạng tổng qt o o o Tìm đường (có độ dài) ngắn từ đỉnh xuất phát 𝑠 ∈ 𝑉 (đỉnh nguồn) đến đỉnh cuối 𝑡 ∈ 𝑉 (đỉnh đích)? Đường gọi đường ngắn từ 𝑠 đến 𝑡, độ dài đường 𝑑(𝑠, 𝑡) gọi khoảng cách ngắn từ 𝑠 đến 𝑡 Nếu không tồn đường từ 𝑠 đến 𝑡 độ dài đường 𝑑(𝑠, 𝑡) = ∞ CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Bài tốn tìm đường ngắn (2/2) Trường hợp 1: 𝑠 cố định, 𝑡 thay đổi o o o o Tìm đường ngắn từ 𝑠 đến tất đỉnh lại đồ thị ? Đối với đồ thị có trọng số khơng âm, tốn ln có lời giải thuật tốn Dijkstra Đối với đồ thị có trọng số âm khơng tồn chu trình âm, tốn có lời giải thuật tốn Bellman-Ford Trong trường hợp đồ thị có chu trình âm, tốn khơng có lời giải Trường hợp 2: 𝑠 thay đổi 𝑡 thay đổi o o o Tìm đường ngắn tất cặp đỉnh đồ thị Đối với đồ thị có trọng số khơng âm, tốn giải cách thực lặp lại 𝑛 lần thuật tốn Dijkstra Đối với đồ thị khơng có chu trình âm, tốn giải thuật toán Floyd CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Nội dung Phát biểu tốn tìm đường ngắn Thuật tốn Dijkstra Thuật toán Bellman-Ford Thuật toán Floyd CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Thuật tốn Dijkstra (1/2) Mục đích o o Sử dụng để tìm đường ngắn từ đỉnh 𝑠 tới đỉnh lại đồ thị Áp dụng cho đồ thị có hướng với trọng số không âm Tư tưởng o Gán nhãn tạm thời cho đỉnh o Các nhãn biến đổi (tính lại) nhờ thủ tục lặp Nhãn đỉnh cho biết cận độ dài đường ngắn tới đỉnh Ở bước lặp có nhãn tạm thời trở thành nhãn cố định (nhãn độ dài đường ngắn từ 𝑠 đến đỉnh đó) CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Thuật tốn Dijkstra (2/2) Dijkstra (𝑠){ Bước (Khởi tạo): 𝑑,𝑠- = 0; //Gán nhãn đỉnh 𝑠 𝑇 = 𝑉\*𝑠+; // 𝑇 tập đỉnh có nhãn tạm thời for (𝑣 ∈ 𝑉){ //Sử dụng 𝑠 gán nhãn cho đỉnh lại 𝑑,𝑣- = 𝑎(𝑠, 𝑣); 𝑡𝑟𝑢𝑜𝑐,𝑣- = 𝑠; } Bước (Lặp): while (𝑇 ≠ ∅ ){ Tìm đỉnh 𝑢 ∈ 𝑇 cho 𝑑,𝑢- = min* 𝑑,𝑧- | 𝑧 ∈ 𝑇+; 𝑇 = 𝑇\*𝑢+; //cố định nhãn đỉnh 𝑢 for (𝑣 ∈ 𝑇){ //Sử dụng 𝑢, gán nhãn laị cho đỉnh if (𝑑,𝑣- > 𝑑,𝑢- + 𝑎(𝑢, 𝑣)){ 𝑑,𝑣- = 𝑑,𝑢- + 𝑎(𝑢, 𝑣); //Gán lại nhãn cho đỉnh 𝑣; 𝑡𝑟𝑢𝑜𝑐,𝑣- = 𝑢; } } } http://www.ptit.edu.vn } CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ - Dijkstra (1/2) Áp dụng thuật tốn Dijkstra tìm đường ngắn từ đỉnh số tới đỉnh lại đồ thị 1 1 2 CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Ví dụ - Dijkstra (2/2) Áp dụng thuật tốn Dijkstra tìm đường ngắn từ đỉnh số tới đỉnh lại đồ thị 1 1 2 4 𝑑,𝑢- 𝑡𝑟𝑢𝑜𝑐,𝑢- Bước lặp Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh Khởi tạo 0, 1, * ∞, ∞, ∞, ∞, 1 - - 6, 3, * ∞, 8, 2 - - 4, * - 7, 8, - - - - 7, 5, * - - - - 6, * - CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Nội dung Phát biểu tốn tìm đường ngắn Thuật tốn Dijkstra Thuật toán Bellman-Ford Thuật toán Floyd 10 CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Thuật tốn Bellman-Ford (1/2) Mục đích o o Sử dụng để tìm đường ngắn từ đỉnh 𝑠 tới đỉnh lại đồ thị Áp dụng cho đồ thị có hướng khơng có chu trình âm (có thể có cạnh âm) Tư tưởng o Gán nhãn tạm thời cho đỉnh o Các nhãn làm tốt dần (tính lại) nhờ thủ tục lặp 11 Nhãn đỉnh cho biết cận độ dài đường ngắn tới đỉnh Mỗi phát 𝑑,𝑣- > 𝑑,𝑢- + 𝑎(𝑢, 𝑣), cập nhật 𝑑 𝑣 = 𝑑,𝑢- + 𝑎(𝑢, 𝑣) CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Thuật toán Bellman-Ford (2/2) Bellman-Ford(𝑠){ Bước (Khởi tạo): for (𝑣 ∈ 𝑉){ //Sử dụng 𝑠 gán nhãn cho đỉnh lại 𝑑,𝑣- = 𝑎(𝑠, 𝑣); 𝑡𝑟𝑢𝑜𝑐,𝑣- = 𝑠; } Bước (Lặp): 𝑑 𝑠 = 0; for (𝑘 = 1; 𝑘 ≤ 𝑛 − 2; 𝑘 + + ){ for (𝑣 ∈ 𝑉\*𝑠+){ for (𝑢 ∈ 𝑉){ if (𝑑,𝑣- > 𝑑,𝑢- + 𝑎(𝑢, 𝑣)){ 𝑑,𝑣- = 𝑑,𝑢- + 𝑎(𝑢, 𝑣); 𝑡𝑟𝑢𝑜𝑐,𝑣- = 𝑢; } } } } } 12 CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Ví dụ: Bellman-Ford (1/2) Áp dụng thuật tốn BellmanFord tìm đường ngắn từ đỉnh số tới đỉnh lại đồ thị 13 CuuDuongThanCong.com -5 3 4 http://www.ptit.edu.vn https://fb.com/tailieudientucntt Ví dụ: Bellman-Ford (2/2) Áp dụng thuật tốn BellmanFord tìm đường ngắn từ đỉnh số tới đỉnh lại đồ thị -5 3 4 𝑑,𝑢- 𝑡𝑟𝑢𝑜𝑐,𝑢- Bước lặp Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh 14 Khởi tạo 0, 1, ∞, ∞, 3, k=1 0, 1, 4, 4, -1, 0, 1, 4, 3, -1, 3 0, 1, 4, 3, -1, CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Nội dung Phát biểu tốn tìm đường ngắn Thuật toán Dijkstra Thuật toán Bellman-Ford Thuật toán Floyd 15 CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Thuật toán Floyd (1/3) Mục đích o o Sử dụng để tìm đường ngắn tất cặp đỉnh đồ thị Áp dụng cho đồ thị có hướng khơng có chu trình âm (có thể có cạnh âm) Tư tưởng o Thực trình lặp 16 Xét đỉnh, với tất đường (giữa đỉnh bất kỳ), đường lớn đường qua đỉnh xét, ta thay lại thành đường qua đỉnh CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Thuật toán Floyd (2/3) Floyd( ){ Bước (Khởi tạo): for (𝑖 = 1, 𝑖 ≤ 𝑛; 𝑖 + +){ for( 𝑗 = 1, 𝑗 ≤ 𝑛; 𝑗 + +){ //Xét cặp đỉnh 𝑑,𝑖, 𝑗- = 𝑎(𝑖, 𝑗); 𝑛𝑒𝑥𝑡,𝑖, 𝑗- = 𝑗; } } Bước (Lặp): for (𝑘 = 1, 𝑘 ≤ 𝑛; 𝑘 + +){ for (𝑖 = 1, 𝑖 ≤ 𝑛; 𝑖 + +){ for (𝑖 = 𝑗, 𝑗 ≤ 𝑛; 𝑗 + +){ if (𝑑,𝑖, 𝑗- > 𝑑,𝑖, 𝑘- + 𝑑,𝑘, 𝑗-){ 𝑑,𝑖, 𝑗- = 𝑑,𝑖, 𝑘- + 𝑑,𝑘, 𝑗-; 𝑛𝑒𝑥𝑡,𝑖, 𝑗- = 𝑛𝑒𝑥𝑡,𝑖, 𝑘-; } } } } http://www.ptit.edu.vn } 17 CuuDuongThanCong.com https://fb.com/tailieudientucntt Thuật toán Floyd (3/3) Khôi phục đường Reconstruct-Path( 𝑢, 𝑣){ if ( 𝑛𝑒𝑥𝑡,𝑢-,𝑣- == 𝑛𝑢𝑙𝑙) ; else{ 𝑝𝑎𝑡ℎ = ,𝑢-; // path 𝑢 while(𝑢 ≠ 𝑣){ 𝑢 = 𝑛𝑒𝑥𝑡,𝑢-,𝑣-; 𝑝𝑎𝑡ℎ 𝑎𝑝𝑝𝑒𝑛𝑑(𝑢); //đỉnh đường } return 𝑝𝑎𝑡ℎ; } } 18 CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Kiểm nghiệm thuật toán Áp dụng thuật tốn Floyd tìm đường ngắn tất cặp đỉnh đồ thị -2 -1 19 CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Tóm tắt Bài tốn tìm đường ngắn đồ thị, dạng toán Thuật toán Dijkstra, áp dụng Thuật toán Bellman-Ford, áp dụng Thuật toán Floyd, áp dụng 20 CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt Bài tập Làm số tập giáo trình 21 CuuDuongThanCong.com http://www.ptit.edu.vn https://fb.com/tailieudientucntt ... Floyd, áp dụng 20 CuuDuongThanCong. com http://www.ptit.edu.vn https://fb .com/ tailieudientucntt Bài tập Làm số tập giáo trình 21 CuuDuongThanCong. com http://www.ptit.edu.vn https://fb .com/ tailieudientucntt... http://www.ptit.edu.vn } CuuDuongThanCong. com https://fb .com/ tailieudientucntt Ví dụ - Dijkstra (1 /2) Áp dụng thuật tốn Dijkstra tìm đường ngắn từ đỉnh số tới đỉnh lại đồ thị 1 1 2 CuuDuongThanCong. com http://www.ptit.edu.vn... (1 /2) Áp dụng thuật tốn BellmanFord tìm đường ngắn từ đỉnh số tới đỉnh lại đồ thị 13 CuuDuongThanCong. com -5 3 4 http://www.ptit.edu.vn https://fb .com/ tailieudientucntt Ví dụ: Bellman-Ford (2/ 2)