Ràng buộc bao gồm (Inclusions)

Một phần của tài liệu Đồ án tốt nghiệp GMLS (Trang 34 - 35)

Nói chung, thực thể tính đường đi có thể được yêu cầu để tính đường đi giữa một hoặc nhiều cạnh, đỉnh không liên kề hoặc đường đi tốt nhất với một yêu cầu bổ sung để bao gồm một danh sách có thứ tự các liên kết và/hoặc các nút từ đường đi số một (bao gồm con đường đầu tiên), một danh sách có thứ tự các liên kết và/hoặc các nút từ con đường số hai (bao gồm con đường thứ hai)…

Vấn đề của việc tính k (k>=2) đường đi không liền kề với thiết lập riêng của ràng buộc bao gồm đượcgiải quyết tương tự như ở phương pháp loại trừ. Cụ thể, thuật toán giả sử một số đoạn đường đi được trao đổi giữa các con đường, và, do đó, ràng buộc bao gồm có bảo đảm là một phần của kết quả đường đi chỉ khi nó được quy định trên tổng thể- đó là, nó được yêu cầu cho mỗi con đường.Trong nhiều trường hợp, người dùng chỉ muốn các dịch vụ chỉ rõ danh sách các nút lệnh có thứ tự . Đây là vấn đề tính đường đi có các ràng buộc bao gồm toàn bộ có thể được hình thành như là một yêu cầu để tính một hoặc nhiều cạnh hoặc con đường tốt nhất, mỗi đương đi tương ứng với danh sách các nút có thứ tự. Vấn đề tính đường đicác ràng buộc bao gồm toàn bộ có thể được giải quyết bằng cách sửa đổi không giới hạn tương ứng với thuật toán tính đường đi đa dạng.

Thuật toán tính đường đi đơn với ràng buộc bao gồm

Xét một đường đi duy nhất từ đỉnh nguồn S đến đỉnh đích Z qua một danh sách có thứ tự của nút A,B,C...,M. Xét cấu trúc tối ưu cho đường đi ngắn nhất, nó rất dễ dàng chứng minh rằng đường đi ngắn nhất từ S đến Z sẽ là đường đi ngắn nhất từ S đến A nối với đường đi ngắn nhất từ A đến B nối với đường đi ngắn nhất từ B đến C…và nối với đường đi ngắn nhất từ M đến Z.

Vì vậy, để cung cấp ràng buộc bao gồm trong việc tính đường đi duy nhất, chúng ta phải thay thế viêc tính đường đi ngắn nhất từ dịch vụ nguồn đến dịch vụ đích bằng cách tính nhiều đường đi ngắn nhất.

Đầu tiên, từ nguồn đến ràng buộc bao gồm đầu tiên, sau đó từ ràng buộc bao gồm đầu tiên đến ràng buộc bao gồm thứ hai, và như vậy cho đến khi đường đi ngắn nhất từ ràng buộc bao gồm cuối cùng đến đích. Bằng cách nối các đường đi đã được tính cùng nhau chúng ta sẽ có được đường đi ngắn nhất từ nguồn đến đích qua danh sách có thứ tự của đỉnh được chỉ rõ.

Có một vấn đề với việc tính đường đi với ràng buộc bao gồm, tuy nhiên, nó làm cho mọi thứ phức tạp hơn. Có thể nhận thấy rằng không có gì ngăn cản được mô tả thuật toán quay trở lại đường đi với vòng lặp. tại sao các vòng lặp có thể xuất hiện trong kết qua đường đi?

Trước hết, người sử dụng có thể chỉ định (có lẽ do nhầm lẫn) danh sách các ràng buộc bao gồm trong một cách mà có một hoặc một vài ràng buộc bao gồm xuất hiện trong danh sách nhiều hơn một lần. Trong trường hợp này, việc tính đường đi sẽ không có lựa chọn, nhưng để trở về kết quả đường đi với vòng lặp.

Thứ hai, tính đường đi để xác định các phân đoạn giữa các ràng buộc bao gồm được thực hiện độc lập, và do đó không có gì ngăn cản sự phân đoạn từ phân đoạn này dang phân đoạn khác. Điều này sẽ không xảy ra nếu các đoạn tiếp theo được tính với các ràng buộc loại trừ của tất cả các đỉnh được thực hiện bởi các đường đi của đoạn trước đó.

Cuối cùng, nếu việc tính đường đi cho một đoạn đường cụ thể được ràng buộc để loại trừ các đỉnh đã được tính với các đoạn đường trước đó, nếu việc tính đường đi cho

đoạn đường này thất bại không có nghĩa là đường đi từ nguồn đến đích không tồn tại. Nếu các đỉnh và cạnh đãđược tính trước đó thì sẽ bị loại trừ khỏi việc tính đường đi tiếp theo và việc tính sẽ có thể thành công. Như vậy, nếu việc tính đường đi trên đoạn đường i thất bại, thì sẽ nỗ lực để dùng đệ quy tính lại tất cả các đoạn đường trước bắt đầu từ đoạn đường i-1. Tại thời điểm một cung được loại bỏ từ đoạn đường i-1 thì đường đi sẽ được tính lại để xem xét các đường đi khác. Khi một con đường mới được tính cho đoạn đường i-1, các đỉnh đường đi nên được thêm vào danh sách các ràng buộc loại trừ cho việc tính đường đi cho đoạn đường i và cố gắng tính lại đường đi cho đoạn đường i. Nếu không có đường đi mới cho đoạn đường i-1 để đưa có kết quả đường đi cho đoạn đường đi i thì xem xét đường đi mới cho đoạn đường đi i-2, có thể đảm bảo tính đường đi thành công cho cả hai đoạn đường i-1 và i. Quá trình này nên tiếp tục cho đến khi việc tính đường đi thành công từ đoạn đường đang xét đến đoạn đường i hoặc không có đường đi qua đoạn đường đầu tiên cho đến đoạn đường cuối cùng và bao gồm đoạn đường i, thuật toán sẽ dừng với đoạn code “không tồn tại đương đi” .

Xem xét tất cả những quan sát này, thuật toán tính đường đi ngắn nhất từ đỉnh nguồn S đến đỉnh đích Z đi qua các đỉnh A, B,. . . , M có thể được mô tả như sau:

Bước1: Hãy chắc chắn rằng danh sách các ràng buộc bao gồm không một mục nào xuất hiện nhiều hơn hơn một lần.

Bước 2: Chạy thuật toán single-pair shortest path (ví dụ, BFS) để xác định đường đi ngắn nhất từnguồn đến ràng buộc bao gồm đầu tiên.

Bước 3: Nếu đích của việc tính đường đi cũng là đích đoạn đường cuối cùng của toàn bộ đường đi (có nghĩa là đỉnh Z), dừng thuật toán và trả lại kết quả đường đi là đoạn đường được nối lại với nhau.

Bước 4: Nếu không, thêm đỉnh thực hiện bởi các đường đi xác định cho các đoạn đường trước vào danh sách loại trừ. Chạy thuật toán single-pair shortest path xử lý loại trừ để xác định đường đi cho những đoạn đương tiếp theo.

Bước 5: Nếu việc tính đường đi ở bước 4 là thành công, quay lại bước 3.

Bước 6: Nếu không, dùng đệ quy tính lại đường đi cho tất cả các phân đoạn trước đó bắt đầu từ phân đoạn thành công gần đây nhất, do đó việc tính đường đi cho những phân đoạn hiện tại thành công.

Bước 7: Nếu bước 6 đã thành công, quay lại bước 3.

Bước 8: Nếu không, dừngthuật toán và trả lại đoạn code về” con đường không tồn tại”

Một phần của tài liệu Đồ án tốt nghiệp GMLS (Trang 34 - 35)