3 Các giải thuật tìm đường
3.1.1 Giải thuật Djkstra
Giải thuật Dijsktra là giải thuật tìm đường đi ngắn nhất giữa các điểm trong đồ thị. Giải thuật này được Edsger W. Dijkstra đưa ra vào năm 1956 và được công bố trong năm 1959. Giải thuật này tồn tại dưới nhiều biến thể, thuật toán nguyên bản của Dijkstra đưa ra để tìm đường đi ngắn nhất giữa hai điểm trong đồ thị, nhưng một biến thể phổ biến thay đổi một đỉnh đơn như là đỉnh nguồn và tìm kiếm tất cả các đường đi ngắn nhất từ đỉnh nguồn tới các đỉnh khác trong đồ thị gọi là cây đường đi ngắn nhất.
Bài toán được đặt ra như sau: Cho một đồ thị có hướng G=(V, E), một hàm trọng số w: E −→ [0, ∞ ) và một đỉnh nguồn s. Cần tính toán được đường đi ngắn nhất từ đỉnh nguồn s đến mỗi đỉnh của đồ thị. Ví dụ: Chúng ta dùng đỉnh của đồ thị để mô tả các điểm giao cắt trên đường ở một thành phố. Chúng ta cần di chuyển từ điểm s tới điểm t trong một thành phố. Thuật toán Dijkstra sẽ giúp chúng ta tìm được cây đường đi ngắn nhất từ điểms tới mọi điểm trong thành phố và qua đấy biết được đường đi ngắn nhất từs tới t.
3.1. Những thuật toán cơ bản 17
Algorithm 1Giải thuật tìm đường đi ngắn nhất Dijkstra
Đầu vào: một đồ thị liên thông có trọng số G và đỉnh bắt đầu s
Kết quả: cây đường đi ngắn nhất T với gốc là s 1: Khởi tạo: Cây T với đỉnh s
2: Khởi tạo: Tập S là tập các cạnh liên kết với s 3: while (S !=∅ ) do
4: Gán e :=Dijkstra-nextEdge(G,S)
5: Gọi w là đỉnh không kết thúc của cạnh e 6: Thêm cạnh e và đỉnh w vào trong cây T 7: Thực hiện cập nhật đồ thị G và tập S 8: end while
9: return Cây T
Hàm Dijkstra-nextEdge được định nghĩa như sau: Coi S là tập hợp các cạnh biên hiện tại, Dijkstra-nextEdge(G,S) lựa chọn và trả lại giá trị các cạnh biên mà không có đỉnh cuối không thuộc cây nào là gần nhất với đỉnh bắt đầu s. Nếu có nhiều hơn một giá trị cạnh như vậy thìDijkstra-nextEdge(G,S) sẽ ưu tiên giá trị được chọn lựa mặc định theo một tiêu chí đưa ra trước.