Thuật toán
- Từ node nguồn tìm một cây đường đi ngắn nhất (shortest-path tree) tới tất cả các node khác trong đồ thị.
- Sau khi tìm được cây đường đi ngắn nhất, tới node đích, lần vết ngược trở về node bắt đầu để tìm ra dãy đường đi ngắn nhất giữa hai node.
Chúng ta tìm cây đường đi ngắn nhất bằng cách loang theo chiều rộng. Ở mỗi node, có một biến cục bộ để đánh dấu tình trạng của node là đã được thăm hay chưa được thăm. Thuật toán bắt đầu bằng việc nhảy tới node nguồn, từ nút nguồn di chuyển tới tất cả các node có đường nối trực tiếp với node nguồn, kiểm tra nếu biến cục bộ lưu tình trạng của node đang ở trạng thái chưa được thăm thì gán giá trị của biến cục bộ đó bằng địa chỉ của node mà chuỗi wave vừa từ đó di chuyển tới node hiện tại. Lặp lại việc di chuyển tới tất cả các node có đường nối trực tiếp với node đang đứng. Trong WAVE có lệnh “##” di chuyển sang các nút lân cận trừ node mà từ đó đã tới nó. Do vậy chuỗi WAVE sẽ di chuyển sang các node có đường nối trực tiếp với các node hàng xóm của node nguồn nhưng không di chuyển trở về node nguồn. Loang cho tới khi thăm xong toàn bộ đồ thị.
Sau khi đã tạo được cây đường đi ngắn nhất. Nhảy tới node đích, di chuyển ngược về node khởi đầu dựa vào biến cục bộ lưu tình trạng tại mỗi node và lưu đường đi vào một biến toàn cục.
Đồ thị minh họa thuật toán:Giả sử ta cần tìm đường đi ngắn nhất giữa node A và node H
.
Hình 5 3
Phần 1: Tìm cây đường đi ngắn nhất (loang theo chiều rộng):
Đặt chuỗi WAVE vào node A. Di chuyển tới các node hàng xóm của A là B, C, D – mũi tên màu da cam. Chuỗi WAVE tách thành ba nhánh tại ba node B, C, D.
Hình 5 4
Từ các node B, C, D di chuyển tới các node có đường nối trực tiếp với B, C, D – mũi tên màu xanh biển. Do có ba nhánh WAVE nên chuỗi WAVE sẽ di chuyển tới các node B, C, D, E, F, G. Ở các node B, C, D, biến Nback đã có giá trị. Nên chuỗi WAVE sẽ bị dừng. Còn ở ba node E, F, G biến Nback vẫn có giá trị NONE – node chưa được thăm nên chuỗi WAVE sẽ tiếp tục lan tỏa. Từ E, F, G chuỗi WAVE lại tiếp tục lan tỏa tới hai node chưa được thăm là H và I. Ở hai node H và I, chuỗi WAVE dừng do không tìm thấy node nào chưa thăm.
Hình 5 5
Hình 5 6
Nhảy tới node đích là node H. Gán biến Fpath=C – với C là nội dung (tên) của node H. Di chuyển tới node G - chứa trong biến Nback của nod H. Gán Fpath:0=C (tức tên của node G). Di chuyển tiếp tới node B – chứa trong biến Nback của node G. Fpath giờ đang là [H,G] sẽ được gán Fpath:0=C và sẽ chứa các giá trị [H,G,B]. Tiếp tục di chuyển tới node A – chứa trong biến Nback của node B và gán Fpath:0=C. Fpath giờ sẽ chứa [H,G,B,A]. Di chuyển tiếp tới node chứa trong biến Nback của node A, nhưng node `stop’ không tồn tại nên vòng lặp trong chuỗi WAVE sẽ dừng. Và ta có đường đi ngắn nhất giữa hai node A và H chứa trong biến Fpath=[H,G,B,A]
Wave code: SQ( (@#`blogsource'.Nback=`stop'. RP(##.(Nback==NONE.Nback=P))), (@#`blogdesti'.Fpath=C.RP(#Nback.Fpath:0=C).T=Fpath) )