L礃Ā do chọn đề tài Với mong muốn ứng dụng cũng như cụ thể hóa thuật toán đã được học để chỉ ra phương pháp tối ưu trong việc tìm đường đi ngắn nhất giữa hai điểm bất kì, nhóm chúng em ch
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
======***======
BÁO CÁO BÀI TẬP LỚN HỌC PHẦN
Thực tập cơ sở ngành
Đề tài Ứng dụng thuật toán Dijkstra giải bài toán tìm đường đi ngắn nhất
Giáo viên hướng d̀n: Nguyễn Thị Mỹ Bình Nhóm: 9 Lớp: 2022IT6040001
Mã SV: Họ tên: Bùi Tuấn Phong
Mã SV: Họ tên: Vũ Hữu Phúc
Mã SV: Họ tên: Lê Thu Phương
Mã SV: Họ tên: Nguyễn Thị Hải Phương
Mã SV: Họ tên: Đỗ Quang Quân
Hà Nô ̣i, 2022
Trang 2M唃⌀C L唃⌀C
Trang 3MỞ ĐẦU
1 L礃Ā do chọn đề tài
Với mong muốn ứng dụng cũng như cụ thể hóa thuật toán đã được học để chỉ ra phương pháp tối ưu trong việc tìm đường đi ngắn nhất giữa hai điểm bất kì, nhóm chúng em chọn đề tài : “Ứng dụng thuật toán Dijkstra giải bài toán tìm đường đi ngắn nhất” Thuật toán Dijkstra là một thuật toán tìm đường đi ngắn nhất trong đồ thị có trọng số không âm Thuật toán này sử dụng một phương pháp tìm kiếm dựa trên độ ưu tiên và được áp dụng rộng rãi trong nhiều bài toán thực tế như: Tìm kiếm đường
đi, Tối ưu hóa đường đi, điều khiển giao thông, …
2 Mục đích nghiên cứu
Mục đích của nghiên cứu thuật toán Dijkstra là để tìm ra đường đi ngắn nhất giữa các đỉnh trong một đồ thị vô hướng hoặc có hướng Thuật toán này có ứng dụng rất nhiều trong các lĩnh vực như định tuyến mạng, tìm đường đi trong bản đồ, tối ưu hóa lộ trình đi lại trong giao thông vận tải, và nhiều ứng dụng khác Nghiên cứu về thuật toán Dijkstra giúp chúng
ta hiểu được cách thức hoạt động của nó, từ đó có thể tối ưu hóa và cải thiện các ứng dụng mà thuật toán này được áp dụng vào
- Giải thích được cách hoạt động của thuật toán Dijkstra và chỉ ra được nhiệm vụ của các hoạt động đó
- Hiểu về các ưu nhược điểm của thuật toán
- Biết cách ứng dụng thuật toán Dijkstra trong thực tế: định tuyến mạng, tìm đường đi trong bản đồ, tối ưu hóa lộ trình đi lại trong giao thông vận tải,
- Có khả năng cài đặt và chạy thuật toán được trên máy tính
Trang 43 Phương pháp nghiên cứu
- Tìm hiểu về lý thuyết đằng sau thuật toán Dijkstra, bao gồm cách hoạt động và thuật toán được sử dụng để tìm đường đi ngắn nhất
- Tìm hiểu các ví dụ về thuật toán Dijkstra để hiểu cách nó hoạt động trong các tình huống khác nhau
- Tìm kiếm các tài liệu tham khảo về thuật toán Dijkstra, bao gồm sách, bài viết và video hướng dẫn trực tuyến
- Thực hành viết code để triển khai thuật toán Dijkstra trên máy tính của mình và kiểm tra kết quả để hiểu rõ hơn về thuật toán
- Tham gia các cộng đồng lập trình trực tuyến để thảo luận về thuật toán Dijkstra và học hỏi từ các chuyên gia lập trình khác
4 Phạm vi nghiên cứu
- Áp dụng cho các đồ thị có trọng số không âm
- Tìm đường đi ngắn nhất từ một đỉnh xuất phát đến tất cả các đỉnh còn lại trong đồ thị
- Thuật toán Dijkstra cũng có thể được sử dụng để tìm đường đi ngắn nhất giữa hai đỉnh cụ thể trong đồ thị
- Không đảm bảo tìm được đường đi ngắn nhất nếu đồ thị có trọng số âm
- Độ phức tạp thời gian của thuật toán là O(V^2), trong đó V là số đỉnh trong đồ thị Tuy nhiên, nếu sử dụng các cấu trúc dữ liệu phù hợp, độ phức tạp có thể được cải thiện đáng kể
Trang 55 Tổng quan nội dung nghiên cứu
*Bài toán: Chúng ta dùng các đỉnh của đồ thị để mô hình các thành
phố và các cạnh để mô hình các đường nối giữa chúng Khi đó trọng số các cạnh có thể xem như độ dài của các con đường (không âm) Chúng ta cần vận chuyển từ thành phố s đến thành phố t Thuật toán Dijkstra sẽ chỉ ra đường đi ngắn nhất mà ta có thể đi
*Giới thiệu về thuật toán Dijkstra:
nhất đơn giản trong đồ thị có trọng số không âm Thuật toán này được phát minh bởi nhà toán học Edsger W Dijkstra vào năm 1956
Nó được sử dụng rộng rãi trong các ứng dụng về định tuyến mạng và nhận biết đường đi ngắn nhất giữa hai đỉnh trong mạng lưới
(biểu thị khoảng cách chưa được biết đến giữa điểm xuất phát
và các điểm khác trên đồ thị), và đánh dấu điểm xuất phát là đã được duyệt
kề với nó trên đồ thị Cập nhật giá trị distance cho các điểm này bằng cách cộng khoảng cách từ điểm xuất phát đến điểm
đó với khoảng cách hiện tại giữa điểm xuất phát và điểm đó trong mảng distance
dấu nó là đã được duyệt Lặp lại bước 2 cho các điểm kề với điểm này và cập nhật giá trị distance cho chúng
cả các điểm trên đồ thị đã được duyệt
Trang 6Thuật toán Dijkstra đảm bảo tìm được đường đi ngắn nhất giữa điểm
⇒
xuất phát và điểm đích trên đồ thị
*Ứng dụng thuật toán Dijkstra:
dụng để tìm đường đi ngắn nhất giữa hai điểm trên mạng
giúp tìm đường đi ngắn nhất từ một vị trí đến vị trí khác trên bản
đồ
được sử dụng để tối ưu hóa quá trình sản xuất và lên lịch cho các sản phẩm trong quá trình sản xuất
❖ Tối ưu hóa vận chuyển: Trong lĩnh vực vận chuyển, thuật toán Dijkstra giúp tối ưu hóa lộ trình vận chuyển hoặc tối ưu hóa các tuyến đường để giao hàng
dụng để tối ưu hóa việc điều khiển giao thông trong các hệ thống đô thị
Tóm lại, thuật toán Dijkstra là một trong những thuật toán cơ bản và
⇒
quan trọng nhất trong lĩnh vực khoa học máy tính và ứng dụng của nó rất
đa dạng
Trang 7CHƯƠNG 1 CƠ SỞ LÝ THUYẾT 1.Đồ thị
a Sơ lược đồ thị
Đồ thị là một dạng biểu diễn hình ảnh của một tập các đối tượng gọi là đỉnh nối với nhau bởi các cạnh Thông thường, đồ thị được vẽ dưới dạng một tập các điểm (đỉnh, nút) nối với nhau bởi các đoạn thẳng (cạnh)
Người ta thường ký hiệu đồ thị là G (Graph), tập đỉnh là V (Vertex),và tập cạnh là E (edge)
Nói chung, một đồ thị là một cặp các tập hợp (V, E), trong đó V
là tập các đỉnh và E là tập các cạnh mà kết nối các cặp điểm
Đồ thị có nhiều loại khác nhau tùy thuộc vào số lượng đỉnh, số cạnh, liên kết và cấu trúc tổng thể của chúng Có thể kể đến như đồ thị
có hướng và đồ thị vô hướng
Ví dụ:
Hình 1: Mạng lưới giao thông thể hiện giữa 2 địa điểm khác nhau
có đường đi trực tiếp đến nhau hay không:
Trang 8Hình 2: Mạng lưới giao thông thể hiện giữa 2 địa điểm khác nhau
có bao nhiêu đường đi trực tiếp đến nhau:
Một số khái niệm trong đồ thị
● Một cạnh được gọi là khuyên nếu nó có dạng (v, v)
● Cạnh bội là 2 cạnh khác nhau nhưng có cùng đỉnh đầu và đỉnh cuối
● Đỉnh treo là đỉnh chỉ có 1 cạnh kề với nó
● Đỉnh cô lập là đỉnh không có cạnh nào kề với nó
● Hai đỉnh của 1 cạnh là hai đỉnh kề nhau
● Hai cạnh chung 1 đỉnh là hai cạnh kề nhau
VD:
Hình 3
● Cạnh (e, e) là khuyên
● Có 2 cạnh (b, d) và (b, d) là cạnh bội
● Đỉnh f là đỉnh treo
Trang 9● Đỉnh g là đỉnh cô lập
● Đỉnh a và đỉnh b là 2 đỉnh kề nhau
● Cạnh (a, b) và (a, c) là 2 cạnh kề nhau
● Đơn đồ thị
○ Đơn đồ thị vô hướng: Đơn đồ thị vô hướng G=(V,E) bao gồm V là tập các đỉnh, và E là tập các cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh
VD:
Hình 4
○ Đơn đồ thị có hướng: Đơn đồ thị có hướng G = (V,E) bao gồm V
là tập các đỉnh, và E là tập các cặp có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh Một cạnh e=(u,v) thì u gọi là đỉnh đầu, v gọi là đỉnh cuối, đồng thời e gọi là cạnh ra của đỉnh u
và gọi là cành vào của đỉnh v
Trang 10VD:
Hình 5
● Đa đồ thị
○ Đa đồ thị vô hướng: Đa đồ thị vô hướng G= (V, E) bao gồm V là tập các đỉnh, và E là tập các cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh, tập E có chứa cạnh bội
VD:
Hình 6
○ Đa đồ thị có hướng: Đa đồ thị có hướng G= (V, E) bao gồm V là tập các đỉnh, và E là tập các cặp có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh, tập E có chứa
Trang 11cạnh bội Một cạnh e=(u,v) thì u gọi là đỉnh đầu, v gọi là đỉnh cuối, đồng thời e gọi là cạnh ra của đỉnh u và gọi là cành vào của đỉnh v
VD:
Hình 7
● Đồ thị có trọng số
○ Một đồ thị mà mỗi cạnh của nó đều được gán trọng số, được gọi là đồ thị có trọng số
○ Trọng số của đồ thị có thể xem như một hàm W, xác định trên tập cạnh và lấy giá trị trên tập số Một cách hình thức,
đồ thị có trọng số G được xem như một bộ ba (V, E, W), trong đó V là tập đỉnh, E là tập cạnh và W là trọng số
○ Tùy từng trường hợp mà trọng số của cạnh e được ký hiệu
là W(e) hay W(u, v)
VD:
Trang 12Hình 8
● Bậc của đỉnh trong đồ thị
○ Bậc của đỉnh v trong đồ thị G, ký hiệu dG(v), là số cạnh liên thuộc với v, trong đó, khuyên được tính hai lần Một đỉnh có bậc 0 là đỉnh cô lập Đỉnh có bậc 1 là một đỉnh treo hay lá Trong đồ thị ví dụ, các đỉnh 1 và 3 có bậc là 2, các đỉnh 2, 4 và 5 có bậc bằng 3, đỉnh 6 có bậc 1
Hình 9
○ Nếu tập cạnh E là hữu hạn thì tổng giá trị bậc của các đỉnh gọi là bậc của đồ thị Bậc của đồ thị bằng hai lần số cạnh
Số các đỉnh bậc lẻ luôn là số chẵn
● Biểu diễn đồ thị
Để lưu trữ đồ thị và thực hiện các thuật toán khác nhau với đô thị trên máy tính cần phải tìm những cấu trúc dữ liệu thích hợp để mô tả
đô thị Việc chọn cấu trúc dữ liệu nào để biểu diễn đồ thị có tác động rất lớn đến hiệu quả của thuật toán Vì vậy, việc chọn lựa cấu trúc dữ liệu để biểu diễn đồ thị phụ thuộc vào từng tình huống cụ thể (bài toán
và thuật toán cụ thể) Mục này sẽ xét một số phương pháp cơ bản được
sử dụng để biểu diễn đồ thị trên máy tính, đồng thời cũng phân tích một cách ngắn gọn những ưu điểm cũng như những nhược điểm của chúng
● Xét đơn đồ thị vô hướng G =(V, E)
Trang 13● Ký hiệu tập đỉnh V = {1, 2, , n}, tập cạnh E = {e1, e2, , em} Ta
Ví dụ:
Đồ thị vô hướng
Hình 10
Ma trận kề:
Trang 14Đồ thị có hướng
Hình 11
Ma trận kề:
Trang 156 0 0 0 0 1 0
● Trong rất nhiều vấn đề ứng dụng của lý thuyết đồ thị, mỗi cạnh e
= (u, v) của đồ thị được gán với một giá trị c(e) gọi là trọng số của cạnh e Ví dụ như đồ thị biểu diễn khoảng cách giữa 2 thành phố
Ví dụ:
Hình 12
● Với đồ thị có trọng số, để biểu diễn đồ thị thay vì biểu diễn bằng
ma trận kề, ta sử dụng ma trận trọng số
C= {c[i, j]; i, j = 1, 2, , n}
với c[i,j] = c(i, j) nếu (i; j) ∈ E và c[i, j] = ∞ nếu (i; j) ∉ E
Ma trận trọng số tương ứng với đồ thị trong hình 4:
Trang 16A 0 41 37 29 0
● Trong trường hợp “đồ thị thưa” (đồ thị n đỉnh có số cạnh m thỏa mãn: m<6n) người ta thường dùng cách biểu diễn đồ thị dưới dạng danh sách cạnh
● Trong cách biểu diễn đồ thị bởi danh sách cạnh chúng ta sẽ lưu trữ danh sách tất cả các cạnh của đồ thị vô hướng (có hướng) Một cạnh e= (x, y) của đồ thị sẽ tương ứng với hai biến Dau[e], Cuoi[e] như vậy, để lưu trữ đồ thị ta cần sử dụng 2*m đơn vị bộ nhớ Nhược điểm của cách biểu diễn này là để xác định những định nào của đồ thị là kề với một đỉnh cho trước chúng ta phải làm cỡ m phép so sánh (khi duyệt qua danh sách tất cả các cạnh của đồ thị)
● Chú ý: Trong trường hợp đồ thị có trọng số ta cần thêm m đơn vị
bộ nhớ để lưu trữ trọng số của các cạnh
Trang 17Đầu Cuối Đầu Cuối
Danh sách cạnh
của đồ thị vô
hướng ở hình 10
Danh sách cạnh của đồ thị có hướng ở hình 11
Trang 18❖ Danh sách đỉnh kề
● Trong rất nhiều vấn đề ứng dụng của lý thuyết đồ thị, cách biểu diễn đồ thị dưới dạng danh sách đỉnh kề là cách biểu diễn thích hợp nhất được sử dụng
● Trong cách biểu diễn này, với mỗi đỉnh v của đồ thị chúng ta lưu trữ danh sách các đỉnh kề với nó, mà ta sẽ ký hiệu là Ke(v) = {u V: (v, u) E}
Hình 13: Danh sách đỉnh kề với đồ thị vô hướng (Hình 10)
Trang 19Hình 14: Danh sách đỉnh kề với đồ thị có hướng (Hình 11)
b
Trang 20CHƯƠNG 2 BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT VÀ CÀI
ĐẶT CHƯƠNG 3 TỔNG KẾT
Tài liệu tham khảo