Danh mục

Mục đích của việc mô hình hóa và đánh giá đặc tính hoạt động của hệ thống p6

Số trang: 14      Loại file: pdf      Dung lượng: 2.56 MB      Lượt xem: 15      Lượt tải: 0    
tailieu_vip

Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Thuật toán Dijkstra Tất cả các thuật toán tìm đường đi ngắn nhất đều dựa vào các nhận xét được minh hoạ trên hình 4.5, đó là việc lồng nhau giữa các đường đi ngắn nhất nghĩa là một nút k thuộc một đường đi ngắn nhất từ i tới j thì đường đi ngắn nhất từ i tới j sẽ bằng đường đi ngắn nhất từ i tới k kết hợp với đường đi ngắn nhất từ j tới k. Vì thế, chúng ta có thể tìm đường đi ngắn nhất bằng công thức đệ quy sau:...
Nội dung trích xuất từ tài liệu:
Mục đích của việc mô hình hóa và đánh giá đặc tính hoạt động của hệ thống p6 Thuật toán Dijkstra Tất cả các thuật toán tìm đường đi ngắn nhất đều dựa vào các nhận xét được minh hoạ trên hình 4.5, đó là việc lồng nhau giữa các đường đi ngắn nhất nghĩa là một nút k thuộc một đường đi ngắn nhất từ i tới j thì đường đi ngắn nhất từ i tới j sẽ bằng đường đi ngắn nhất từ i tới k kết hợp với đường đi ngắn nhất từ j tới k. Vì thế, chúng ta có thể tìm đường đi ngắn nhất bằng công thức đệ quy sau: d ij  min (d ik  d kj ) k dxy là độ dài của đường đi ngắn nhất từ x tới y. Khó khăn của cách tiếp cận này là phải có một cách khởi động đệ quy nào đó v ì chúng ta không thể khởi động với các giá trị bất kỳ ở vế phải của phương trình 4.2. Có một số cách để thực hiện việc này, mỗi cách là cơ sở cho một thuật toán khác nhau. Hình 4.5. Các đường ngắn nhất lồng nhau Thuật toán Dijkstra phù hợp cho việc tìm đường đi ngắn nhất từ một nút i tới tất cả các nút khác. Bắt đầu bằng cách thiết lập dii = 0 và dij =   ij sau đó thiết lập  j là nút kề cận của i dij  lij Sau đó tìm nút j có dij là bé nhất. Tiếp đó lấy chính nút j vừa chọn để khai triển các khoảng cách các nút khác, nghĩa là bằng cách thiết lập dikmin (dik, dij+ljk) Tại mỗi giai đoạn của quá trình, giá trị của dik là giá trị ước lượng hiện có của đường đi ngắn nhất từ i tới k; và thực ra là độ dài đường đi ngắn nhất đã được tìm cho tới thời điểm đó. Xem djk như là nhãn trên nút k. Quá trình sử dụng một nút để triển khai các nhãn cho các nút khác gọi là quá trình quét nút. Thực hiện tương tự, tiếp tục tìm các nút chưa được quét có nhãn bé nhất và quét nó. Chú ý rằng, vì giả thiết rằng tất cả các ljk đều dương do đó một nút không thể gán cho nút khác một nhãn bé hơn chính nhãn của nút đó. Vì vậy, khi một nút được quét thì việc quét lại nó nhất thiết không bao giờ xảy ra. Vì thế, mỗi nút chỉ cần được quét một lần. Nếu nhãn trên một nút thay đổi, nút đó phải được quét lại. Thuật toán Dijkstra có thể được viết như sau: 63 array[n] chủ yếu của thuật toán này là không có được nhiều ưu điểm khi mạng là mỏng v à chỉ phù hợp với các mạng có độ dài các cạnh là dương. Hình 4.6. Các đường đi ngắn nhất từ A Ví dụ 4.7: Xét một mạng trong hình 4.6. Mục tiêu ở đây là tìm các đường đi ngắn nhất từ nút A tới các nút khác. Khởi đầu, A được gắn nhãn 0 và các nút khác được gắn nhãn là vô cùng lớn. Quét nút A, B được gán bằng 5 và C được gán là 1. C là nút mang nhãn bé nhất nên sau đó C được quét và B được gán bằng 4 (=1+3), trong khi D được gán bằng 6. Tiếp theo B (có nhãn bằng 4) được quét; D và E được gán lần lượt là 5 và 10. Sau đó D (có nhãn bằng 5) được quét và F được gán bằng 9. E được quét và dẫn đến không có nhãn mới. F là nút có nhãn bé nhất nên không cần phải quét vì không có nút nào phải đánh nhãn lại. Mỗi nút chỉ được quét một lần. Chú ý rằng việc quét các nút có các nhãn theo thứ tự tăng dần là một điều cần lưu ý vì trong quá trình thực hiện thuật toán một số nút được đánh lại số. Các nút được quét ngay tức thì hoặc là phải được quét lại sau đó. Chú ý rằng các đường đi từ A đến các nút khác (nghĩa là (A, C), (C, B), (B, D), (B, E) và (D, F)) tạo ra một cây. Điều này không là một sự trùng hợp ngẫu nhiên. Nó là hệ quả trực tiếp từ việc lồng nhau của các đường đi ngắn nhất. Chẳng hạn, nếu k thuộc đường đi ngắn nhất từ i tới j thì đường đi ngắn nhất từ i tới j sẽ là tổng của đường đi ngắn nhất từ i tới k và đường đi ngắn nhất từ k tới j. Tương tự như trong ví dụ minh hoạ cho thuật toán Prim, kết quả của ví dụ trên có thể được trình bày một cách ngắn gọn như bảng sau: 65 Bảng 4.2 Nút init. A(0) C(1) B(4) D(5) F(9) E(10) A 0(-) 0(-) 0(-) 0(-) 0(-) 0(-) 0(-) B  (-) 5(A) 4(C) 4(C) 4(C) 4(C) 4(C) C  (-) 1(A) 1(A) 1(A) 1(A) 1(A) 1(A) D  (-)  (-) 6(C) 5(B) 5(B) 5(B) 5(B) E  (-)  (-)  (-) 10(B) 10(B) 10(B) 10(B) F  (-)  (-)  (-)  (-) 9(D) 9(D) 9(D) Thuật toán Bellman Một thuật toán khác của dạng thuật toán Dijkstra do Bellman phát biểu và sau đó được Moore và Page phát triển, đó là việc quét các nút theo thứ tự mà chúng được đánh nhãn. Việc đó loại trừ việc phải tìm nhãn nhỏ nhất, nhưng tạo ra khả năng; một nút có thể cần quét nhiều hơn một lần. Trong dạng đơn giản nhất, thuật toán Bellman duy trì một hàng đợi các nút để quét. Khi một nút được đánh nhãn nó được thêm vào hàng đợi trừ khi nó đã tồn tại trong hàng đợi. Hàng đợi được quản lý theo quy tắc vào trước, ra trước. Vì thế các nút được quét theo thứ tự mà chúng được đánh nhãn. Nếu một nút được đánh nhãn lại sau khi nút đó được quét thì nó được thêm vào sau hàng đợi và được quét lần nữa. Ví dụ 4.8: Trong ví dụ ở hình 4.6, chúng ta bắt đầu quá trình bằng các đặt nút A vào hàng đợi. Quét A các nhãn 5 và 1 lần lượt được gán cho nút B và C, đồng thời các nút B và C được đưa vào hàng đợi (vì các nút này nhận giá trị mới và chưa có mặt trong hàng đợi). Tiếp đó chúng ta quét nút B và các nút E và D được đánh nhãn lần lượt là 11 và 6. D và E cũng được đặt vào hàng đợi. Sau đó chúng ta quét C, khi đó B được gán nhãn là 4 và lại được đặt vào sau hàng đợi. E được quét và F được gán nhãn 13 và đưa vào hàng đợi. D được quét và F được gán nhãn là 10; F vẫn còn ở trong hàng đợi nên F không được đưa vào hàng đợi. B được quét lần thứ hai. trong lần quét này E và D lần lượt được đánh nhãn là 10 và 5 đồng thời cả hai nút được đặ ...

Tài liệu được xem nhiều:

Gợi ý tài liệu liên quan: