Thuật toán tìm tất cảđƣờng đi của ma trận liên kết trong lý thuyết đồ thị

Một phần của tài liệu Nghiên cứu bài toán tính độ tin cậy của hệ thống thông qua cấu trúc của hệ thống (Trang 31 - 36)

thị.

Việc mô phỏng thuật toán đã mô tả trong phần 2.1.4 để tìm tất cả các đƣờng đi giữa hai đỉnh là tƣơng đối phức tạp vì thuật toán chỉ thích hợp với những đồ thị có kích thƣớc nhỏ. Đối với các đồ thị có kích thƣớc lớn thì việc thực hiện bƣớc 4 và 5 là tƣơng đối phức tạp, dài và dễ nhầm lẫn vì các phần tử của ma trận lúc này là các chuỗi dài. Chính vì sự phức tạp này đã dẫn đến một yêu cầu cần phát triển một thuật toán và viết chƣơng trình để tự động tìm kiếm tất cả các đƣờng đi giữa 2 đỉnh của đồ thị. Vấn đề này tƣơng đối khác với các bài toán đƣợc đặt ra trong lý thuyết đồ thị, trong lý thuyết đồ thị ta thƣờng nói đến các bài toán tìm đƣờng đi ngắn nhất, đƣờng đi tối thiểu giữa 2 đỉnh trong đồ thị hoặc tìm đƣờng đi qua tất cả các đỉnh của đồ thị....

Vậy làm thế nào để tìm tất cả các đƣờng đi giữa 2 đỉnh, chúng ta cùng xem xét sơ đồ khối của thuật toán tìm tất cả các đƣờng đi của đồ thị nhƣ hình 2.1 dƣới đây:

Hình 2.1 Sơ đồ khối I_end(t)=i_source? Đỉnh kết thúc của đƣờng đi từ i_source đến i_destination có thoả mãn i_end(t)=i_destination hay không?

Có hay không đƣờng đi không lặp từ đỉnh i_end(t) đến i_end(t+1)? Đúng Đúng Sai Bắt đầu Sai Đúng Đọc ma trận A, đỉnh đầu i_source, đỉnh cuối i_destination từ file đầu vào.

Quay lại 01 bƣớc của thủ tục tìm kiếm từ i_end(t)

Kết thúc

Quay lại 01 bƣớc của thủ tục tìm kiếm từ i_end(t)

Lƣu đƣờng đi tìm đƣợc vào ma trận chứa tất cả các đƣờng đi. Làm 0 hoá ma

trận Theo A tìm đỉnh mới i_end(t+1) đi từ đỉnh

i_end(t). Đƣờng mới đƣợc cho vào mảng lƣu trữ các đƣờng đi.

I_end(t)=i_source

Trong sơ đồ trên ta sử dụng phƣơng pháp tìm kiếm theo chiều sâu:

Tƣ tƣởng của tìm kiếm theo chiều sâu là: Từ đỉnh nguồn (đỉnh đầu) của đồ thị ta di chuyển đến một đỉnh khác (một đỉnh bất kỳ mà có thể đi từ đỉnh đầu). Từ đỉnh này ta tiếp tục đi đến khác đỉnh khác. Nếu không thể đi tiếp đƣợc nữa thì quay lại đỉnh trƣớc đó và đi đến đỉnh khác. Cứ nhƣ vậy cho đến khi đến đỉnh cuối của đồ thị.

Để hiểu rõ hơn thuật toán, ta xét ví dụ sau:

Hình 2.2a : Đồ thị vô hướng

Hình 2.2b: Đồ thị có hướng

Đồ thị nhƣ hình 2.2a và 2.2b đƣợc chuyển thành dạng ma trận liên kết tƣơng ứng là A1 và A2 trong đó các phần tử là 0 hoặc (i,j):

A1= =

Ở đây ta đã đơn giản hoá cách viết các phần tử trong ma trận, bỏ dấu ngoặc đơn và dấu phẩy giữa hai đỉnh kết nối với nhau. Ví dụ (1,2) = 12,...

Ta sẽ sử dụng thuật toán 2.1 4 đã nói ở trên để áp dụng với ma trận A1 có đỉnh nguồn là 1 và đỉnh đích 6:

A1 = ; B1 = ; B*1 =

Các bƣớc tiếp theo của thuật toán đƣợc thực hiện nhƣ sau:

B2 = ; B*2 =

B3 = ; B*3 =

B4 =

Vì ở bƣớc 6 của thuật toán khi gặp điều kiện k=n-1 (4=5-1) thì ta dừng lại và liệt kê tất cả các đƣờng đi đã tìm đƣợc. Vậy ta dừng thuật toán tìm tất cả các đƣờng đi của ma trận A1 tại bƣớc này.

Ta thấy để tìm đƣờng đi theo thuật toán 2.1.4 thì ta phải tính đƣợc ma trận B1, B2, B3, B4 nhƣ trên và danh sách tất cả các đƣờng đi từ đỉnh 1 đến đỉnh 5 nhận đƣợc là:

1 2 5; 1 4 5; 1 3 2 5; 1 3 4 5; 1 2 3 4 5; 1 4 3 2 5; Nếu ta áp dụng thuật toán 2.1.5 tìm kiếm theo chiều sâu thì kết quả sẽ nhƣ sau: Ma trận A1 sẽ đƣợc viết lại nhƣ sau:

A1=

Xuất phát từ đỉnh 1 ta đi tiếp đến đỉnh 2, từ đỉnh 2 ta đi tiếp đến đỉnh 3, tiếp đến đỉnh 4, tiếp đến đỉnh 5 ta dừng lại vì đỉnh 5 đã là đỉnh cuối. Vậy ta đƣợc đƣờng đi 1 2 3 4 5. (adsbygoogle = window.adsbygoogle || []).push({});

Từ đỉnh 5 ta quay lại đỉnh 4 nhƣng từ đỉnh 4 không có đƣờng nào khác đến đỉnh 5 ngoài đƣờng đã nói ở trên nên ta quay lại đỉnh 3, từ đỉnh 3 ta có thể quay lại đỉnh 2 hoặc đỉnh 1:

- Nếu quay lại đỉnh 2 thì từ đỉnh 2 ta có thể đi tiếp đến đỉnh 5, vậy ta có đƣờng đi là 1 2 5.

- Nếu quay lại đỉnh 1 thì ta có thể đi tiếp đến đỉnh 3, tiếp đỉnh 4 và 5, vậy ta có đƣờng đi 1 3 4 5 hoặc từ đỉnh 3 ta đi tiếp đến đỉnh 2 và tiếp đến đỉnh 5, vậy ta có đƣờng đi là 1 3 2 5;

- Từ đỉnh 1 ta cũng có thể đi đến đỉnh 4 và đi tiếp đến đỉnh 5, vậy ta có đƣờng đi 1 4 5 hoặc từ 4 ta có thể quay về đỉnh 3 rồi về đỉnh 2 và đi tiếp đến đỉnh 5, vậy ta có đƣờng đi 1 4 3 2 5;

Áp dụng thuật toán 2.1.5 này cho ta kết quả là các đƣờng đi: 1 2 3 4 5; 1 2 5; 1 3 4 5 ; 1 3 2 5; 1 4 5 và 1 4 3 2 5. Kết quả này trùng với kết quả tính theo thuật toán 2.1.4

 Hai thuật toán 2.1.4 và 2.1.5 cho ta kết quả tƣơng tự nhau.

2.1.6 Kêt luận

Dựa vào những kết quả các thuật toán đã trình bày, ta có thể rút ra một vài kết luận nhƣ sau:

- Thuật toán chuyển đổi từ sơ đồ cấu trúc logic sang đồ thị liên kết nếu thực hiện bằng tay sẽ đơn giản hơn là lập trình, vì việc lập trình chuyển đổi là tƣơng đối phức tạp. Đầu tiên phải nói đến là số lƣợng lớn các thành phần trong sơ đồ cấu trúc logic và sự phức tạp trong việc xây dựng các ký pháp đồ hoạ. Vậy việc chuyển đổi từ sơ đồ cấu trúc logic sang đồ thị liên kết bằng tay là đơn giản tuy nhiên lại mất rất nhiều thời gian.

- Từ thuật toán tìm đƣờng đi đã biết trong lý thuyết đồ thị ta có thể phát triển thành thuật toán tìm tất cả các đƣờng đi trong đồ thị bằng cách chuyển đồ thị đó thành ma trận tƣơng ứng, phần tử trong ma trân δij =1 nếu tồn tại đƣờng đi giữa i và j, δij =0 nếu không tồn tại đƣờng đi giữa i và j.

Một phần của tài liệu Nghiên cứu bài toán tính độ tin cậy của hệ thống thông qua cấu trúc của hệ thống (Trang 31 - 36)