Thuật toán Dijkstra

Một phần của tài liệu nghiên cứu một số thuật toán trong gis ứng dụng logic mờ (Trang 47)

Thuật toán này do nhà khoa học Hà Lan – ông Edsger Dijkstra đưa ra vào năm 1959 cung cấp nền tảng cơ bản cho thuật toán hữu hiệu nhất để giải quyết bài toán này. Thuật toán Dijkstra được thiết kế dựa trên kỹ thuật tham ăn để giải quyết bài toán tìm đường đi ngắn nhất từ một đỉnh nguồn trong đồ thị có hướng với trọng số không âm. Thuật tián Dijkstra hoạt động dựa trên việc gán nhãn cho các đỉnh.

a. Phát biểu bài toán

Đầu vào: Cho một đồ thị có hướng G = (V, E) (với V: tập đỉnh, E: tập cạnh), một hàm trọng số w: E [0,∞) và một đỉnh nguồn s

Đầu ra: Hãy tìm đường đi ngắn nhất từ tập nguồn s đến mỗi đỉnh trong đồ thị.

b. Ý tưởng chính

Giả sử đã biết k đỉnh gần đỉnh s nhất về tổng chiều dài trong đồ thị và đường đi ngắn nhất từ s đến mỗi đỉnh đó. Gán nhãn đỉnh s và k đỉnh này với khoảng cách ngắn nhất từ s. Sau đó đỉnh thứ k+1 gần đỉnh x nhất được tìm thấy như sau. Với mỗi đỉnh được gán nhãn y, xây dựng k đường đi phân biệt từ s đến y bằng cách kết nối đường đi ngắn nhất từ s đến x với cung (x, y) cho tất các đỉnh x đã được gán nhãn. Chọn đường đi ngắn nhất trong k đường đi này và đặt nó là đường đi ngắn nhất từ s đến y.

Vì vậy, nếu đã biết đỉnh thứ k gần đỉnh s nhất thì đỉnh thứ k+1 có thể được xác định như trên. Bắt đầu với k=0, quá trình này có thể lặp đi lặp lại cho đến khi tìm ra đường đi ngắn nhất từ s đến t (tức là t đã được gán nhãn).

c. Thuật toán

Thuật toán Dijsktra được thực hiện như sau:

Bước 1

 Ban đầu tất cả các cung và các đỉnh chưa được gán nhãn.

 Với mỗi đỉnh x ∈ V, gọi d(x) là nhãn được gán cho mỗi đỉnh x là độ dài đường đi ngắn nhất từ s đến x.

 Khởi tạo, đặt d(s) = 0 và d(x) = ∞ cho mọi đỉnh x ≠ s.

 Gọi y là đỉnh cuối cùng được gán nhãn.

 Gán nhãn đỉnh s và đặt y = s.

Bước 2

 Với mỗi đỉnh chưa được gán nhãn x, tính lại nhãn d(x) như sau: d(x) = min { d(x), d(y) + a(x, y)}

 Nếu d(x) = ∞ với mọi đỉnh x chưa gán nhãn thì dừng lại vì không tồn tại đường đi từ s đến đỉnh bất kỳ chưa gán nhãn.

 Ngược lại:

 Gán nhãn cho đỉnh x chưa gán nhãn với giá trị d(x) nhỏ nhất.

 Gán nhãn cho cung có hướng đến đỉnh x từ đỉnh đã được gán nhãn với giá trị d(x) ở trên.

 Đặt y = x.

Bước 3

 Nếu đỉnh t đã được gán nhãn thì dừng, vì đường đi ngắn nhất từ s đến t đã được tìm ra. Đường đi này chứa đường đi đơn của các cung đã được gán nhãn từ s đến t.

 Nếu đỉnh t chưa được gán nhãn thì lặp lại bước 2.

Chú ý rằng bất cứ khi nào thuật toán gán nhãn cho đỉnh (ngoại trừ đỉnh s) thì cũng gán nhãn cho cung hướng về đỉnh này. Vì vậy, mỗi đỉnh có tối đa một cung đã được gán nhãn hướng vào nó và các cung đã được gán nhãn

không có chu trình vì không có cung nào được gán nhãn nếu cả hai điểm đầu cuối có cung đã được gán nhãn tạo thành một dạng cây có gốc tại s đến bất kỳ điểm x nào khác nằm trong cây đường đi ngắn nhất là đường đi ngắn nhất từ s đến x.

Nếu đường đi ngắn nhất từ s đến x trong cây đường đi ngắn nhất đi qua đỉnh y thì phần đường đi từ y đến x này là đường đi ngắn nhất từ y đến x.

Ngược lại tồn tại đường đi khác thậm chí còn ngắn hơn đường đi từ y đến x, điều này mâu thuẫn với đường đi ngắn nhất từ s đến x đã tìm ra.

Vì các cung đã được gán nhãn luôn luôn tạo thành cây nên có thể xem thuật toán này như phát triển một cây có gốc tại đỉnh s. Một khi đến được đỉnh t thì có thể kết thúc quá trình phát triển.

d. Mở rộng thuật toán (adsbygoogle = window.adsbygoogle || []).push({});

Nếu muốn tìm đường đi ngắn nhất từ đỉnh s đến mọi đỉnh khác trong đồ thị thì tiếp tục quá trình phát triển cho đến khi tất cả các đỉnh được nằm trong cây đường đi ngắn nhất. Trong trường hợp này, cây trở thành cây mở rộng (nếu cây tồn tại). Khi đó bước 3 sẽ là:

Bước 3

 Nếu tất cả các đỉnh đã được gán nhãn thì dừng lại vì đường đi duy nhất của các cung đã được gán nhãn từ s đến x là đường đi ngắn nhất từ s đến x với mọi đỉnh x.

 Ngược lại, trở về bước 2.

e. Ví dụ minh hoạ

Tìm đường đi ngắn nhất từ nút s đến nút t trong đồ thị G trong hình 2.2 bằng thuật toán Dijkstra

Hình 2.2 Đồ thị minh hoạ thuật toán Dijkstra Bước 1: Khởi tạo, d(s) = 0, d(x) = ∞ với mọi x ≠ s. Đặt y = s.

Bước 2: Tính lại khoảng cách cho các nút chưa gán nhãn: d(1) = min{ d(1), d(s) + a(s, 1)} = min {∞, 0 + 4} = 4 d(2) = min { d(2), d(s) + a(s, 2)} = min {∞, 0 + 7} = 7 d(3) = min {d(3), d(s) + a(s, 3)} = min {∞, 0 + 3} = 3

Vì khoảng cách nhỏ nhất trong các nút chưa gán nhãn là d(3) = 3 nên gán nhãn cho nút 3 và cung (s, 3). Cây đường đi ngắn nhất hiện tại chứa cung (s, 3). Đặt y = 3.

Bước 3: Nút t chưa được gán nhãn nên quay lại bước 2.

Bước 2: Tính d(4) = min{d(4), d(3) + a(3, 4) } = min {∞, 3 + 3} = 6 Khoảng cách nhỏ nhất trong các nút chưa gán nhãn là d(1) = 4 nên gán nhãn cho nút 1 và cung (s, 1). Cây đường đi ngắn nhất hiện tại chứa cung (s, 3) và (s, 1). Đặt y = 1.

Bước 3: Đỉnh t chưa được gán nhãn nên quay lại bước 2

Bước 2: Tính d(2) = min{d(2), d(1) + a(1, 2)} = min {7, 4 + 3} = 7 d(4) = min{d(4), d(1) + a(1, 4)} = min {6, 4 + 2} = 6

Khoảng cách nhỏ nhất trong các nút chưa gán nhãn là d(4) = 6 nên gán nhãn cho nút 4 và cung (1, 4) hoặc (3, 4) vì cả hai đều bằng d(4).

Chọn tuỳ ý cung (3, 4). Khi đó, cây đường đi ngắn nhất chứa cung (s, 3), (s, 1) và (3, 4). Đặt y = 4.

Bước 3: Đỉnh t chưa được gán nhãn nên quay lại bước 2.

Bước 2: Tính d(t) = min {d(t), d(4) + a(4, t)} = min {∞, 6 + 2} = 8 Khoảng cách nhỏ nhất trong các nút chưa gán nhãn là d(2) = 7 nên gán nhãn cho nút 2 và cung (s, 2). Đường đi ngắn nhất hiện tại chứa cung (s, 3), (s, 1), (3, 4) và (s, 2). Đặt y = 2.

Bước 3: Đỉnh t chưa được gán nhãn nên quay lại bước 2.

Bước 2: Tính d(t) = min {d(t), d(2) + a(2, t)} = min {8, 7 + 2} = 8 Khi đó, nút t được gán nhãn cuối cùng và cung (4, t) cũng được gán nhãn là d(t). Do vậy, đường đi ngắn nhất cuối cùng chứa các cung (s, 3), (s, 1), (3, 4), (s, 2) và (4, t).

Đường đi ngắn nhất từ s đến t chứa các cung (s, 3), (3, 4) và (4, t) với chiều dài là 3 + 3 + 2 = 8. Đường đi này không chỉ là đường đi ngắn nhất duy nhất từ s đến t vì đường đi (s, 1), (1, 4) và (4, t ) cũng có chiều dài bằng 8.

Một phần của tài liệu nghiên cứu một số thuật toán trong gis ứng dụng logic mờ (Trang 47)