4.3.4.1. Giới thiệu
Tìm đường đi ngắn nhất là bài toán cơ bản chomột loạt ứng dụng. Trong lý thuyết đồ thị, bài toán tìm đường đi ngắn nhất là một bài toán kinh điển. Trên thực
Tìm đường đi từ điểm-đến-điểm: tìm đường đi ngắn nhất từ một nút nguồn cho trước đến một nút đích .
Tìm đường đi ngắn nhất từ một nguồn duy nhất: cho một nút nguồn cho , tìm đường đi ngắn nhất đến tất cả các nút còn lại .
Tìm đường đi giữa nhiều-đến-nhiều: cho tập nút , tìm đường đi ngắn nhất cho mỗi cặp nút .
Tìm đường đi giữa tất cả các cặp nút: trường hợp đặc biệt của biến thể nhiều-
đến-nhiều với .
Chiều dài của đường đi được tính là tổng chiều dài của các cạnh thuộc . là đường ngắn nhất nếu như không có bất kỳ tuyến đường từ tới sao cho . Khoảng cách giữa hai nút và là độ dài của đường đi ngắn nhất từ đến .
Vấn đề tìm đường đi ngắn nhất đã được giải quyết phần lớn vào năm 1959 bởi Dijkstra [67] , người đã đưa ra thuật toán giải quyết bài toán tìm đường đi ngắn nhất từ một nguồn đơn duy nhất cho đồ thị , với nút và cạnh. Phiên bản gốc của thuật toán Dijkstra thực thi với độ phức tạp .
4.3.4.2. Một số kỹ thuật tăng tốc thực thi
Hàng đợiưu tiên
Để cải thiện tốc độ thực thi thuật toán Dijkstra ta có thể sử dụng hàng đợi ưu tiên. Giới hạn của thuật toán Dijkstra đã được cải thiện đáng kể với phiên bản hiện thực khác nhau của hàng đợi ưu tiên. Ví dụ,thuật toán sẽ có độ phức tạp khi sử dụng binary heap hay khi sử dụng Fibonacci heap [68] …
Duyệttừ hai phía
Một trong những biến thể cơ bản của thuật toán Dijkstra tìm đường đi ngắn nhất từ điểm-đến-điểm là tìm kiếm từ hai chiều; thay vì chỉ xây dựng cây đường đi ngắn nhất bắt nguồn từ nút nguồn s, ta cũng xây dựng cây đường đi ngắn nhất xuất phát từ nút đích trên đồ thị nghịch đảo , khi . Ngay khi
một nút được khám phá ra ở cả hai hướng tìm kiếm, chúng ta có thể có được bảo đảm rằng đường đi ngắn nhất tìm thấy theo chiều xuôi và đường đi ngắn nhất tìm thấy theo chiều ngược sẽ tạo thành đường đi ngắn nhất . Ta có thể coi thuật toán Dijkstra khám phá ra các nút trong hình tròn tâm tại s tăng dần bán kính đến khi gặp như quá trình loang khám phá nút trong vòng tròn tâm tại với bán kính tăng là cho đến khi đạt đến (Hình 4.25a). Các phiên bản duyệt hai chiều nhanh hơn bởi vì nó khám phá các nút trong cả hai hình tròn ở tâm và , cho đến khi hai hình tròn đụng nhau (Hình 4.25b). Vùng giới hạn bên trong hai hình tròn, đại diện cho số nút khám phá được sẽ nhỏ hơn trường hợp duyệt theo một chiều khoảng hai lần.
s t s t
a) b)
Hình 4.25. Không gian tìm kiếmtrườnghợp theo mộthướng và song hướngsửdụng thuật toán Dijkstra
Giảithuật Dijkstra song hướng
Input: source node s and target node t Output: distance
1
2 ; ;
3 while ( ) do {
4 select direction such that ;
5 ;
6 if u has been settled from both direction then ;
7 foreach do {
8 ;
11 }
12 }
13 return ;
Để tăng tốc độ của thuật toán tìm đường đi ngắn nhất trên mạng giao thông, chúng tôi sử dụng mô hình biểu diễn ở dạng mạng phân cấp như Hình 4.26.
Phương pháp phân cấp mạng giao thông đã được nhiều tác giả đến, ta có thể tham khảo [69] cho các phiên bản cơ bản. Ý tưởng chính đằng sau phương pháp phân cấp mạng giao thông là xác định ra tập con các đỉnh mà đường đi ngắn nhất phủ lên đồ thị với điều kiện là tập tối thiểu các cạnh sao cho , độ dài đường đi ngắn nhất giữa và trong bằng với độ dài đường đi ngắn nhất giữa và trong . Nói cách khác, có một cạnh khi và chỉ khi bất kỳ đường đi ngắn nhất từ đến trong không chứa nút cục bộ nào của các đường đi (tức là tất cả các nút ngoại trừ và ) thuộc . Ta có thể nhận thấy rằng là duy nhất theo [69] . Trong thuật toán tìm kiếm hai chiều, các thành phần có chứa nút nguồn và nút đích được tìm kiếm toàn bộ, nhưng bắt đầu từ các nút tách chỉ những cạnh thuộc đồ thị phủ được xem xét. Cách tiếp cận này có thể được khái quát hóa và áp dụng cho mạng phân cấp, xây dựng một vài mức đồ thị phủ với tập nút thỏa điều kiện: , cho tất cả các cặp nút
là phần của đường đi ngắn nhất giữa và nằm ngoài các thành phần mức mà và thuộc về được chứa hoàn toàn ở đồ thị phủ cấp . Đồ thị phủ trở nên nhỏ hơn khi tăng mức trong hệ thống phân cấp này, việc tính toán đường đi ngắn nhất trở nên nhanh hơn, bởi vì hầu hết các tìm kiếm khoảng cách dài cho đường đi từ , diễn ra ở cấp độ phân cấp cao nhất, và do đó ít nút phải khám phá hơn. Đường đi trên đồ thị gốc có thể được tái tạo, bởi vì mỗi cạnh ở mức có phân rã duy nhất như là các cạnh ở mức .
Đồthị con
Hình 4.26. Ví dụvềmạng phân cấp giao thông
Trong [71] , một tập con tùy ý của được chọn theo cách sao cho nó chứa các nút quan trọng nhất, tức là những nút xuất hiện "thường xuyên hơn" trên đường đi ngắn nhất. Điều này mang lại một tập hợp nhỏ hơn , hơn phân bố đồng đều trên toàn đồ thị và vì thế sẽ nhỏ hơn, kết quả là nó chiếm một không gian ít hơn và sẽ thực thi truy vấn nhanh hơn.
Ý tưởngchủđạo
Để tìm đường đi từ nút s đến nút t ta thực hiện như sau:
Thực hiện tìm trong vùng lân cận quanh nút và . Tìm trong mạng đồ thị cao tốc (thưa hơn).
Lặp lại các quá trình trên.
Khái niệm vùng lân cận
Tập các nút liên kết đến nút được gọi là vùng lân cận. Các nút trong vùng lân cận là tương đối gần .
Với thông số , vùng lân cận phải đủ lớn để phủ nút gần nhất. Chúng ta ký hiệu vùng lân cận là .
Cho đồ thị . Cho trước một nút . tập nút được sắp xếp theo khoảng cách của chúng tính từ . Giả sử là khoảng cách từ đến nút thứ
trong . [ ; ],
Định nghĩa 8. (Cạnh cao tốc)
là cạnh cao tốc nếu thỏa các điều kiện sau: là một cạnh trong đồ thị gốc.
thuộc đường đi ngắn nhất từ đến với một số và . không thuộc vùng lân cận của và .
Định nghĩa 9.(Mạng cao tốc)
Mạng cao tốc của đồ thị là một đồ thị thỏa các điều kiện sau:
là tập con của . là tập con của .
bao gồm tất cả các cạnh cao tốc trong . bao gồm tất cả các nút trong .
Tìm các nút lân cậncủa 1 một nút theo thông số H
0 4 2 1 3 5 6 7 8 9 H = 5 S N5(S)
Hình 4.27. Vùng lân cận (Neighborhood - Local area)
Tìm các cạnh cao tốc
s t
NH(s) NH(t)
Cạnh cao tốc
Tất cả các cạnh và các đỉnh màu xám đều thuộc mạng cao tốc
u v
Hình 4.28. Tìm các đoạn cao tốc
Tiêu chuẩnloạibỏmột nút
Các cạnh tắt Các nút cầnloạibỏ
Hình 4.29. Chọn các nút cầnloạibỏ
Tính toán đồthị lõi (core)
Loại bỏ các nút cần loại bỏ Thêm tất cả các cạnh tắt
Tạohệ phân cấp cao tốc
1. Tính các cạnh cao tốc
2. Loại các nút cần loại bỏ và thêm các cạnh tắt 3. Lặp lại bước 1
S0 P
NH(s1) NH(p)
S1
Hình 4.30. Điềukiệndừngcủađườngđingắnnhấtcủađồthị
Tìm đường từ s đến t trên mạng phân cấp cao tốc
Mỗi đỉnh có 3 giá trị:
: khoảng cách từ đỉnh nguồn đến : cấp đồ thị hiện tại của đỉnh
: khoảng cách từ đỉnh đến biên cục bộ Tìm đường:
Việc tìm đường được thực hiện từ hai đầu: từ và từ .
Điềukiệndừng:
Khi hai miền tìm kiếm gặp nhau tạo nên một đường đi ngắn nhất tạm thời . Tuy nhiên thuật toán chưa dừng lại ở đây mà vẫn được tiếp tục cho đến khi đỉnh được lấy ra từ hàng đợi của hướng tìm từ hoặc từ thỏa mãn điều
kiện .
Tìm kiếm trên mạng phân cấp cao tốc
Tìm kiếm được thực hiện từ hai hướng: từ đỉnh và từ đỉnh , bắt đầu ở mức . Trước tiên, tìm kiếm trong phạm vi vùng lân cận của được thực hiện, phạm vi này chính là bán kính lân cận của đỉnh ở mức - . Thuật toán tìm kiếm tương tự như thuật toán Djikstra, khi đỉnh được lấy ra khỏi hàng đợi ưu tiên, nó điều chỉnh giới hạn tìm kiếm của đỉnh cha của nó bằng cách trừ đi . Nếu thì tiếp tục tìm kiếm cục bộ:
if v has been reached then ;
else
Ngược lại , cạnh cắt qua biên lân cận. Mục tiêu bây giờ là tìm kiếm mức phù hợp để tiếp tục tìm kiếm. Việc tìm kiếm mức được thực hiện như sau:
, (19)
Khi có hai trường hợp xảy ra với đỉnh
o Nếu . Đỉnh trở thành ngõ vào của mạng cấp cao hơn. Tìm kiếm được chuyển lên mức được tìm thấy.
o Nếu ( ). Đối với trường hợp này, thực hiện tìm kiếm bình thường ở mức cũ.
Cảitiếntốcđộ
Nếu thì không cần xét đến cạnh nữa.
Nếu : khi một đỉnh được lấy ra, tất cả các cạnh mà không được xem xét.
Thuật toán
Thuật toán tìm kiếm từ hai hướng là đối xứng, nên trình bày thuật toán theo một hướng là đủ, còn hướng kia thực hiện theo cách tương tự.
Khoảng cách đến biên (s) Hạnchế 1 Hạnchế 2 s1 s s'1 v s2=s’2 Cạnhtắt (s)
Hình 4.31. Mô phỏngthuật toán tìm đườngđi trên mạng phân cấp
Giải thuật Dijkstra song hướng cao tốc (theo mức độ quan trọng của đường)
Input: source node s and target node t Output: distance
1
2 ; ;
3 while ( ) do {
4 select direction such that ;
5 ;
6 if u has been settled from both direction then
; 7 if then else ; 8 foreach do { 9 for ( , ; ; l++, ); 10 if then continue; 11 if then continue; 12 ;
13 if v has been reached then ;
14 else ;
15 }
16 }
17 return ;
Định tuyến cao tốc dựa trên hạng mục đường. Giải thuật truy vấn cao tốc trên cũng có thể được áp dụng để tìm đường đi hợp lý (không phải ngắn nhất) dựa trên hạng mục của đường, giống như ý tưởng của các hệ thống định tuyến thương mại mà ta đã đề cập lúc đầu, với vài điểm khác biệt sau:
Mức của một cạnh e (không phải cạnh shortcut) được xác định bởi cấp đường tương ứng với hạng mục của nó dựa trên mức độ quan trọng. Ví dụ, các ngõ hẻm sẽ thuộc cấp 0 do ít quan trọng nhất, các đường lớn thuộc cấp 1, tỉnh lộ cấp 2, và quốc lộ thuộc cấp 3. Và hiển nhiên số mức tìm kiếm của ta cũng sẽ tương ứng với số cấp đường ta có.
Việc một node u có trở thành điểm nhập vào mức cao hơn không sẽ được quyết định bởi cấp cao nhất của u, tức cấp đường cao nhất trong số các cạnh của
u. Ví dụ, node u có hai cạnh tỉnh lộ thuộc cấp 2, một cạnh quốc lộ cấp 3, như vậy u sẽ thuộc đồ thị tìm kiếm ở mức 3.
Bán kính tìm kiếm ở mức l sẽ được chọn cố định cho mọi node thuộc đồ thị tìm kiếm ở mức đó. Ta có thể tự đặt ra các bán kính này hoặc hay hơn là, dựa theo các bán kính ta có được từ kết quả tiền xử lý. Với một tập node thuộc , ta có một tập các bán kính đã được tính sẵn, ta có thể lấy trung bình cộng hoặc lấy median của tập các bán kính này, và ta sẽ có được bán kính tìm kiếm cố định cho mức l. Ngoại trừ mức ứng với cấp đường cao nhất thì ta sẽ đặt bán kính bằng vô cùng. Việc lấy bán kính cố định dựa trên các bán kính từ bước xây dựng khá là hợp lý, do với một mạng xa lộ được thiết kế tốt thì những cạnh có cấp đường cao ứng với mức độ quan trọng hơn thường sẽ được chọn lên đồ thị ở mức trên.
Giải thuật Dijkstra song hướng cao tốc (theo hạng mục của đường)
Input: source node s and target node t Output: distance
1
2 ; ;
3 while ( ) do {
4 select direction such that ;
5 ;
6 if u has been settled from both direction then
; 7 if then else ; 8 foreach do { 9 for ( , ; ; ) if then else ; 10 if then continue; 11 ;
12 if v has been reached then ;
13 else ;
14 }
15 }
4.3.4.3. Cấu trúc dữ liệu thể hiện
4.3.4.3.1. Mảngkề
Đồ thị được biểu diễn ở dạng mảng kề là một cấu trúc dữ liệu không gian rất hiệu quả cho phép duyệt đồ thị nhanh. Có hai mảng biểu diễn, một cho các nút và một cho các cạnh. Các cạnh được nhóm bởi nút nguồn và chỉ số của nút đích cùng với trọng số . Mỗi nút lưu chỉ số của các cạnh của nó đi ra đầu tiên trong mảng cạnh. Để cho phép tìm kiếm ngược trong đồ thị, chúng ta lưu trữ một cạnh cũng như là cạnh ngược trong nhóm cạnh của nút . Để phân biệt giữa chiều và chiều ngược của cạnh, mỗi cạnh có một cờ xuôi và một cờ nguợc. Bằng cách này, chúng ta có thể lưu trữ các cạnh hai chiều (chiếm đa số trong các cạnh của một mạng lưới giao thông trong thế giới thực) với không gian lưu trữ hiệu quả: chúng ta chỉ phải lưu một bản sao của và một bản sao của , và ta thiết lập cả hai cờ huớng của mỗi cạnh.
p1 p3 p6 1362 Mức 1 Mức 2 u s1 s2 v 1023 1031 1058 1059 1060 1140 1141 1142 p4 p5 1278 1032 p2
Hình 4.32. Ví dụ minh họađồthị phân cấp
Các mảng kề cơ bản được mở rộng để kết hợp với các mức dữ liệu để thể hiện sự phân cấp mạng giao thông. Ngoài chỉ số của cạnh ra đầu tiên, mỗi nút lưu bán kính lân cận của mức 0 của mình . Hơn nữa, đối với mỗi nút , tất cả các cạnh ra được nhóm lại theo mức của nó . Giữa mảng nút và mảng cạnh, chúng ta chèn một lớp: cho mỗi nút và mức mà thuộc về, nút mức lưu bán
kính lân cận và chỉ mục của cạnh ra đầu tiên ở mức . Tất cả các mức nút đều được lưu trong một mảng duy nhất. Mỗi nút lưu chỉ số của mức nút .
Mảng nút mởrộng … r1 r2 … r1 … Mảng nút … r0 u … r0 s1 s2 r0 … … Mảng cạnh … 1023p1 0 1031 s1 1 1032 p2 2 1278 s2 3 1362 v 4 1031 u 0 1058 s2 1 … … 1058 s1 0 1059 p3 1 1060 v 2 1278 u 3 … Hình 4.33. Cấu trúc mảngkề và lớpmởrộngtrạng thái mức nút 4.3.4.3.2. Cấu trúc giảicạnhmởrộng
Đặc tính. Quản lý cấu trúc nén các cạnh tắt để xác định đường đi trên đồ thị gốc từ cạnh tắt nào đó.
Hiện thực. Xét ví dụ ở Hình 92, với cạnh tắt 1278 ở mức 1 tạo thành từ cạnh 1031 và 1058, và cạnh tắt 1362 ở mức 2 tạo thành từ cạnh tắt 1278 và cạnh 1060. Ta có mảng kề được mở rộng bởi lớp nút mức tuơng ứng ở Hình 93 (ta tạm thời bỏ qua chiều cũng như trọng số của cạnh).
Để mô tả đường đi ở đồ thị bên dưới tương ứng với cạnh tắt, ta sẽ không lưu một chuỗi các chỉ số của nút (hay cạnh), mà ta sẽ nén thành các chỉ số bước nhảy, tức chỉ số thứ tự của cạnh quanh một nút. Ví dụ, chuỗi chỉ số bước nhảy biểu diễn cho cạnh tắt 1362 đi từ u đến v sẽ là (3, 2), nghĩa là nó sẽ gồm cạnh thứ 3 của nút u (cạnh tắt 1278 đến s2), và cạnh thứ 2 của nút s2 (cạnh 1060 đến v). Với cạnh tắt 1278 cũng tương tự như vậy, và quá trình giải nén sẽ được thực hiện đệ quy đến khi