Đường đi ngắn nhất không nhất thiết là các đường tối ưu mà dịch vụ truyền tải có thể đặt lên đó. Trong một số trường hợp các đường đi ngắn nhất lại không thỏa mãn một số điều kiện ràng buộc (như băng thông, khả năng bảo vệ, số lượng chuyển đổi quang-điện…) trong khi một số đường đi dài hơn lại thõa mãn các điều kiện này. Một phương pháp lựa chọn đường đi cho một số vector của các điều kiện ràng buộc đó là tính toán một vài đường đi ngắn nhất giữa điểm nguồn và điểm đích của dịch vụ, và sau đó xác định đường đi nào trong số chúng là đường đi ngắn nhất
ngắn nhất (KSP) giữa một số cặp node được sắp xếp theo thứ tự tăng dần của giá trị cost phải được giải quyết.
Một cách thức đơn giản để giải quyết vần đề KSP như sau: - Chọn một thuật toán đường đi ngắn nhất cho một cặp node
- Tính toán và trả về đường đi ngắn nhất bằng cách chạy thuật toán trên lược đồ khởi tạo.
- Nếu k>1 thì tính toán đường đi giữa các node nguồn và đích bằng cách loại bỏ khỏi lược đồ một cung a∈A và chạy lại thuật toán trên đường đi đã thay đổi. Lặp lại các bước này tới khi tính được k đường đi riêng biệt với cost nhỏ nhất.
Giải pháp này rất đơn giản nhưng nó không thực tế bởi vì nó đòi hỏi rất nhiều việc tính toán. Đối với một lược đồ lớn thì nó có thể tạo ra rất nhiều các đường đi vô ích và các bản sao của chúng. Bên cạnh đó, có bao nhiêu đường đi ngắn nhất được yêu cầu (k>1), trong khi tất cả các đường đi có thể có sẽ phải được tính toán mà một sốđường trong chúng lại được tính rất nhiều lần.
Có một phương pháp và thuật toán k đường đi ngắn nhất được đưa ra để không phải tính toán tất cả các đường có thể có mà chỉ các đường đi “tốt” và nếu nó là cần thiết thì được tính toán. Một thuật toán như vậy duy trì một danh sách của các đường đi được trả về trước đó theo hàng đợi ưu tiên nhỏ nhất đã được tính toán chứ không phải theo giá trị cost của chúng. Thuật toán này sử dụng một kỹ thuật được gọi là nhánh của các đường đi được trả về trước đó: Nếu cần phải tính toán một đường đi thứ j (j>2), và nó đã được xác định rằng đường đi được trả về trước đó j-1 có một số cung đầu tiên trong đó là chung với tất cả các đường đi được trả về trước đó thì các bước sau được thực hiện:
- Một trạng thái điểm nhánh được ấn định cho một điểm node mà kết cuối phần chung của đường đi được trả về trong phép lặp trước đó và tất cả các đường trả về trước đó (phần chung này đươc gọi là một cuống)
- Tất cả các cung mà bắt nguồn từ điểm nhánh và thuộc một trong số j-2 các đường đi được trả về trước đó thì bị loại bỏ khỏi lược đồ.
- Một hoặc một số đường được tính toán giữa điểm nhánh và điểm đích bằng cách loại bỏ một cung trong một lần khỏi đoạn của đường đi thứ j-1 mà nó liên kết điểm nhánh và điểm đích.
- Các đường mới được tạo ra bởi cuống, nếu một đường đi mới này không giống với một trong các đường đã được tính toán trước đó (không phải trong danh sách các đường đước trả về trước đó và cũng không phải trong hàng đợi ưu tiên nhỏ nhất) thì được thêm vào trong hàng đợi ưu tiên nhỏ nhất.
- Một đường đi với giá trị cost nhỏ nhất được loại bỏ khỏi hàng đợi ưu tiên nhỏ nhất và được trả về như một đường đi thứ j.
Thuật toán KSP được mô tả ở đây sử dụng thủ tục như trong bảng 2.7. Các biến đượckhởi tạo trước tiên và sau đó chức năng KSP_NEXT_SHORTEST_PATH được gọi một cách lặp đi lặp lại để tính toán đường đi mới.
Quá trình chạy thuật toán như sau:
- Bước 1-3: đường đi ngắn nhất đầu tiên được tính toán và trả về
- Bước 4-6: Tất cả các đường được trả về trước đó được lưu trong P bị ngắt ra bởi việc loại bỏ tất các cung bắt nguồn từ điểm nhánh. Điều này bắt thuật toán tạo ra các đường đi mới trong các phép tính đường sau đó. - Bước 7-12: Đường đi mới được tính toán: các cung của đường đi được trả
về trong bước lặp ngay trước đó được loại bỏ trong mỗi lần lặp, thuật toán BFS được sử dụng trên các lược đồđã thay đổi, các đường đi được trả về bởi BFS là đường chờ của cuống và được thêm vào hàng đợi Q của các đường được cung cấp mà chúng không giống với các đường đã biết. - Bước 13: Đường đi với giá trị cost nhỏ nhất được tách ra khỏi hàng đợi
Q. Đây là đường mà sẽđược trả về như kết quả của vòng lặp hiện tại. - Bước 14-16: Tất cả các đường được trả về trước đó được lưu trong P và
bị gãy với bước 4-6 được lưu lại.
cuống được khởi tạo cho đường đi ngắn nhất đầu tiên; một điểm nhánh mới được xác định bằng cách nhận dạng một phần chung của đường để được trả về và cuống hiện tại bắt đầu từ điểm s, và sau khi điểm nhánh mới được xác định thì cuống lại mở rộng đến điểm nhánh.
- Bước 23-24: Đường được trả về trong vòng lặp trước đó được đưa vào P; đường mới được sao chép vào trong đường trước đó.
- Bước 25: Đường mới được trả vềđể yêu cầu ứng dụng.
Theo cách này, Thuật toán KSP xác định bốn đường đi ngắn nhất giữa điểm nguồn S và điểm đích D trên lược đồ (xem hình 2.2). Quá trình của thuật toán được thể hiện trong hình 2.4-2.7. Đường đi ngắn nhất được xác định trong mỗi vòng lặp được thể hiện bằng mũi tên nét đậm.
Hình 2.4: Trạng thái của thuật toán KSP sau khi trả vềđường đi ngắn nhất đầu tiên: P_prev=SACD(12), P=0, stem=undifined, branch= undifined, Q=0
Hình 2.5: Trạng thái của thuật toán KSP sau khi trả vềđường đi ngắn nhất thứ hai: P_prev=SACBD(23), P=SACD(12), stem=SAC, branch= C,
Hình 2.6: Trạng thái của thuật toán KSP sau khi trả vềđường đi ngắn nhất thứ ba: P_prev= SAECD(23), P={SACD(12), SACBD(23)}, stem=SA, branch=A, Q= {
SBD(24), SAED(35)}
Hình 2.7: Trạng thái của thuật toán KSP sau khi trả vềđường đi ngắn nhất thứ tư: P_prev= SBD(24), P={SACD(12), SACBD(23), SAECD(23)}, stem=0, branch=S,
Q= SAED(35)
2.3.4. Tính toán đường đa hướng
Ngày nay, với sự cạnh tranh khốc liệt của các nhà mạng cung cấp dịch vụ, người sử dụng có quyền yêu cầu chất lượng cao đối với các dịch vụ mà họ trả tiền. Cụ thể họ không thể chấp nhận việc gián đoạn dịch vụ trong khoảng thời gian một vài chục ms. Tuy nhiên, trong thực tế các thành phần trong mạng của nhà cung cấp dịch vụ có thể bị lỗi do: đứt gãy cáp, lỗi các thiết bị chuyển mạch… Cách duy nhất để bảo vệ các dịch vụ này không bị gián đoạn đó là cung cấp thêm các đường khác cho dịch vụ. Một dịch vụ thường được phép cho nhiều hơn một đường, nên khi đường chính bị lỗi thì lưu lượng của người sử dụng có thểđược chuyển ngay lập tức
hoặc một đoạn lỗi của nó. Chú ý rằng trong trường hợp này một số dịch bị gián đoạn là không tránh khỏi, tuy nhiên, mức độ nghiêm trọng của gián đoạn sẽ phải nhỏ hơn trong trường hợp dịch vụ không được bảo vệ (trường hợp đường đi phải định tuyến và gián nhãn lại hoàn toàn sau khi phát hiện ra lỗi). Do vậy các đường phải là đa hướng (nghĩa là sử dụng các tài nguyên mạng khác nhau) nếu không thì một lỗi mạng đơn lẻ có thể làm cho một sốđường bị đứt, và dịch vụ có thể bị gián đoạn ngay. Đó là lý do tại sao việc tính toán các đường đa hướng giữa một cặp điểm trên lược đồ mô tả một mạng GMPLS thực tế là hết sức quan trọng. Chúng ta sẽ nghiên cứu các thuật toán tính toán đường đa hướng dựa trên lược đồ mô phỏng một mạng GMPLS để giải quyết vấn đề này.
2.3.4.1. Thuật toán hai bước tương đồng
Thuật toán này được xây dựng dựa trên ý tưởng sử dụng các thuật toán đường đi ngắn nhất (ví dụ như thuật toán Dijkstra) để tìm đường đi ngắn nhất đầu tiên, sau đó ngắt bỏ một sốđoạn trên đường này và chạy lại thuật toán để tìm đường đi thứ 2. Tuy nhiên thuật toán này không phải lúc nào cũng đúng, để giải thích vấn đề này chúng ta cùng xem xét việc tính toán đường từđiểm S đến điểm Z trên lược đồ như hình 2.8.
Hình 2.8: Lược đồ áp dụng cho thuật toán hai bước tương đồng.
Trong trường hợp này, sau khi chạy thuật toán Dijkstra(G,S,Z) cho ta đường đi ngắn nhất là SCEZ(3). Nếu ta bỏđi các đoạn SC, CE và EZ thì điểm S sẽ không
nhiên, các đường này vẫn tồn tại, chúng là SCDGZ(31) và SBFEZ(31). Thậm chí, nếu thuật toán hai bước tương đồng này có đưa ra được các đường phụ thì chúng có thể là đường tối ưu hơn. Nghĩa là, có thể có các đường mà tổng giá trị cost của nó nhỏ hơn giá trị của các đường mà được xác định bởi thuật toán. Vì vậy, thuật toán hai bước tương đồng này không còn đúng nữa.
2.3.4.2. Tính toán hai đường tách rời cạnh
Một trong các thuật toán mà được sử dụng rộng rãi để tính toán hai đường tách rời cạnh đối với dịch vụ truyền tải được bảo vệ quan niệm rằng lược đồ mạng G(V,E) không chứa các cạnh với giá trị âm.
1. Chạy thuật toán Dijkstra để tính toán đường đi ngắn nhất từ điểm nguồn S tới điểm đích Z.
2. Tách tất cả các cạnh trên đường đi ngắn nhất thành các cung của chúng. Loại bỏ các cung trên đường đi ngắn nhất. Đổi dấu cho giá trị của các cung tương ứng với chiều ngược lại của cung (tạo ra các giá trị âm của cung). Phép biến đổi lược đồ này được chuẩn bị cho tính toán đường thứ hai và đạt được hai điều:
- Nó bảo vệ cạnh không cần phải tách của đường thứ hai khỏi đường ban đầu – các cung của đường đi ngắn nhất theo hướng đến đích bị loại bỏ và vì thế không thểđược lựa chọn cho đường thứ hai.
- Nó khuyến khích việc sử dụng các cạnh của đường đi thứ nhất theo chiều ngược lại (bởi vì các cung theo chiều ngược lại có giá trị âm), các cạnh này được yêu cầu để đảm bảo sự tối ưu của hai đường tạo thành bởi vì nó ép các đường tạo thành gần nhất có thể với đường đi ngắn nhất được tính ở bước 1.
3. Chạy một thuật toán mà có thể xử lý các cung có giá trị âm (như BFS) trên lược đồ đã được biến đổi để tính đường đi ngắn nhất với các điểm nguồn và đích.
- Dò tìm các đường và xác định các cạnh mà được sử dụng bởi cả các đường theo các chiều ngược lại.
- Khi cạnh được xác định thì loại nó khỏi cả hai đường và hoán đổi các phần đường còn lại (đoạn bắt đầu với một trong các của điểm cạnh đó tới điểm đích Z).
5. Khôi phục lược đồ gốc và trả về các đường tạo thành để gọi dịch vụ. Chú ý: Theo thuật toán này, việc tính toán đường đi thứ hai được thực hiện trên một lược đồ với một số cung có giá trị âm. Như chúng ta đã thảo luận trước đây, điều này chỉ có thể thực hiện nếu không có các vòng lặp âm được nhận biết từ điểm nguồn. Rất dễ dàng để chứng minh rằng không có các vòng lặp như thế tồn tại với điều kiện lược đồ không chứa các cung với giá trị âm. Giả sửđiều này là không đúng và phép biến đổi lược đồ trên đây đã tạo ra một vòng lặp âm: Điều này sẽ có nghĩa là có một đoạn P(x,y) bên ngoài của đường đi ngắn nhất (được trả về theo đường đi ngắn nhất đầu tiên) nối một cặp điểm x và y (thuộc đường đi ngắn nhất ) là ngắn hơn đoạn P_shortest(x,y) nối hai điểm x và y đó. Nếu điều này là đúng thì chúng ta sẽ thay thế đoạn P_shortest(x,y) của đường đi ngắn nhất bằng P(x,y) và chúng ta sẽ thu được một đường ngắn hơn đường đi ngắn nhất. Điều này là không thể bởi vì thuật toán Dijkstra đảm bảo rằng không có đường đi nào ngắn hơn đường đi mà nó xác định. Vì vậy, giả thuyết về sự tồn tại của vòng lặp âm là không đúng.
Quá trình hoạt động của thuật toán này được minh họa trong các hình từ 2.9- 2.11.
Hình 2.10: Thực hiện phép biến đổi lược đồ, đường đi thứ hai được tính (SBFECDGZ)
Hình 2.11: Thực hiện xử lý bổ xung, kết quả là hai đường đi được tính SCDGZ và SBFEZ.
2.3.4.3. Tính toán hai đường tách rời điểm
Khi một dịch vụ truyền tải được áp dụng với thuật toán hai đường đi tách rời cạnh thì nó cũng có thể xảy trường hợp lỗi một thành phần mạng làm cho dịch vụ mất theo cả hai đường. Ví dụ, xem xét một mạng với lược đồ như hình 2.12.
Nếu một dịch vụ GMPLS được sử dụng trên một cặp đường tách rời cạnh ngắn nhất từ điểm S đến điểm Z là SACDZ(4) và SBCEZ(4) thì khi xảy ra lỗi tại điểm C thì cả hai đường sẽ bị ảnh hưởng vì chúng đi xuyên qua điểm C. Tuy nhiên, vấn đề này sẽ không tồn tại nếu dịch vụ được sử dụng trên hai đường tách rời điểm SADZ(12) và SBCEZ(4). Vì thế, cần thiết phải tính toán đường tách rời cạnh.
Chúng ta gọi số các cạnh mà bắt nguồn/kết cuối trên điểm v là bậc của điểm v (ví dụ, bậc của điểm S trong hình 2.13 là 2 trong khi bậc của điểm C là 4). Thứ nhất, chúng cũng giống với các đường tách rời cạnh và vì thế vấn đề tính toán hai đường tách rời điểm có thể được giải quyết bằng cách thay đổi thuật toán ở phần trên với điều kiện là các được đi được tạo ra phải không đi qua chung một điểm nào. Thứ hai, chỉ những điểm node với bậc 4 hoặc cao hơn là cần được xem xét bởi vì chỉ các điểm này mới có thể chia sẻ theo các đường tách rời cạnh. Để tính toán hai đường tách rời điểm, thuật toán được mô tả trong phần 2.3.4.2 được thay đổi như sau:
1. Chạy thuật toán Dijkstra để tính toán đường đi ngắn nhất từ điểm nguồn S tới điểm đích Z.
2. Tách tất cả các cạnh trên đường đi ngắn nhất thành các cung của chúng. Loại bỏ các cung trên đường đi ngắn nhất. Đổi dấu cho giá trị của các cung tương ứng với chiều ngược lại của cung (tạo ra các giá trị âm của cung).
3. Tìm các điểm thuộc đường đi ngắn nhất khác với điểm nguồn và điểm đích mà kết cuối nhiều hơn một cạnh bên ngoài đường ngắn nhất (các điểm có bậc lớn hơn hoặc bằng bốn). Tách tất cả các điểm V như thế thành hai điểm phụ V’ và V”. Kết nối hai điểm này theo một cung có giá trị bằng 0 và có hướng ngược với đường ngắn nhất. Tách tất cả các cạnh của điểm V bên ngoài đường ngắn nhất thành các thành phần cung của chúng.
4. Chạy một thuật toán mà có thể xử lý các cung giá trị âm (như BFS) trên lược đồ đã được biến đổi để tính đường đi ngắn nhất từđiểm nguồn đến đích.
5. Xử lý bổ sung đã tính toán các đường theo cách sau:
- Dò tìm các đường và xác định các cạnh được sử dụng bởi cả hai đường theo chiều ngược lại.
- Khi một cạnh được xác định thì loại bỏ nó khỏi cả hai đường và hoán đổi các phần đường đi còn lại.
6. Khôi phục lược đồ ban đầu, và trả về các đường thu được để gọi ứng dụng.
2.3.4.4. Tính toán hai đường tách rời tốt nhất
Với thuật toán hai đường tách rời theo cạnh chúng ta có thể tạo ra được hai đường từ một điểm nguồn S đến điểm đích D, nhưng cũng có thể không thu được các đường hoàn toàn tách rời. Ví dụ, ta xem xét một lược đồ như hình 2.13: