Slide bài giảng Toán rời rạc 2 – Ngô Xuân Bách tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn về t...
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 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 http://www.ptit.edu.vn Bài tố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 toán dạng tổng quát 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 𝑑(𝑠, 𝑡) = ∞ http://www.ptit.edu.vn 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, toán giải cách thực lặp lại 𝑛 lần thuật toán Dijkstra Đối với đồ thị khơng có chu trình âm, tốn giải thuật toán Floyd http://www.ptit.edu.vn 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 http://www.ptit.edu.vn 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 đó) http://www.ptit.edu.vn 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 } 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 http://www.ptit.edu.vn 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, * - http://www.ptit.edu.vn 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 http://www.ptit.edu.vn 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 𝑑 𝑣 = 𝑑,𝑢- + 𝑎(𝑢, 𝑣) http://www.ptit.edu.vn 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 http://www.ptit.edu.vn 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 -5 3 4 http://www.ptit.edu.vn 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, http://www.ptit.edu.vn 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 http://www.ptit.edu.vn 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 http://www.ptit.edu.vn 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 Thuật tốn Floyd (3/3) Khơi phục đường Reconstruct-Path( 𝑢, 𝑣){ if ( 𝑛𝑒𝑥𝑡,𝑢-,𝑣- == 𝑛𝑢𝑙𝑙) ; else{ 𝑝𝑎𝑡ℎ = ,𝑢-; // path 𝑢 while(𝑢 ≠ 𝑣){ 𝑢 = 𝑛𝑒𝑥𝑡,𝑢-,𝑣-; 𝑝𝑎𝑡ℎ 𝑎𝑝𝑝𝑒𝑛𝑑(𝑢); //đỉnh đường } return 𝑝𝑎𝑡ℎ; } } 18 http://www.ptit.edu.vn Kiểm nghiệm thuật tốn Áp dụng thuật tốn Floyd tìm đường ngắn tất cặp đỉnh đồ thị -2 -1 19 http://www.ptit.edu.vn 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 http://www.ptit.edu.vn Bài tập Làm số tập giáo trình 21 http://www.ptit.edu.vn ... thuật toán Áp dụng thuật toán Floyd tìm đường ngắn tất cặp đỉnh đồ thị -2 -1 19 http://www.ptit.edu.vn 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. .. 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 http://www.ptit.edu.vn Thuật toán Dijkstra (1 /2) Mục đích o o Sử dụng để tìm đường ngắn... 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 http://www.ptit.edu.vn Bài tốn tìm đường ngắn (1 /2) Khái niệm độ dài đường đồ thị o o o