Chia để trị

Một phần của tài liệu Giải thuật di truyền giải bài toán phủ đỉnh nhỏ nhất (Trang 41 - 44)

Thuật toán chia để trị áp dụng cho bài toán này của Tarjan và Trojanowski có độ phức tạp thời gian là / 2

(2n )

O .

Ý tưởng: Ban đầu ta tìm ra tất cả các thành phần liên thông của đồ thị sau đó thực hiện tìm phủ đỉnh nhỏ nhất cho tất cả các thành phần liên thông đó bằng các lời gọi đệ quy.

Việc xử lý mỗi thành phần liên thông dựa trên ý tưởng như sau: Gọi i V là một đỉnh của đồ thị, A i( )V là tập các đỉnh kề của i trong G và với mọi tập đỉnh con SVgọi

( ) ( , ( ))

G SS E S là đồ thị con thu được từ S, tức là E S( )E( x )S S . Khi đó, phủ đỉnh nhỏ nhất của đồ thị G ban đầu:

 Hoặc là gồm i kết hợp với phủ đỉnh nhỏ nhất của G V \ i ( \V  i ,E C i\ ( )).  Hoặc là gồm tập A(i) kết hợp với phủ đỉnh nhỏ nhất của G V \ i \ ( )A i    ( \V i \ ( ),A i E Q i\ ( ))  . Trong đó C(i) là tập tất cả các cạnh có một đầu mút là i, còn Q(i) là tập tất cả các cạnh có đầu mút là một trong số các đỉnh thuộc A(i).

Ta có thủ tục chia để trị viết dạng đệ quy như sau:

Procedure Min_vertex_cover(V, E, S)

begin

if |V|<=1 then S= V;

else

chọn ngẫu nhiên một đỉnh i từ tập đỉnh V

begin Min_vertex_cover(V-{i}, E-C(i), S1); Min_vertex_cover(V-{i}-A(i), E-Q(i), S2); if |S1|>=|S2| then S = S2; // Min_vertex_cover(V-{i}, E-C(i), S) else S = S1; //Min_vertex_cover(V-{i}-A(i), E-Q(i), S); end; end;

Ngoài ra, thuật toán sử dụng khái niệm về sự thống trị – domination. Về cơ bản ta xem xét các đồ thị con S. Trong số tất cả các phủ đỉnh có thể có của đồ thị con, ta có thể bỏ qua tất cả những phủ đỉnh chứng minh được là không thể dẫn tới các phủ đỉnh tốt hơn cho đồ thị đầy đủ, bởi vì chúng phủ ít hoặc không phủ các cạnh nối giữa các đỉnh từ S tới V\S. Xét trường hợp đơn giản nhất cho sự thống trị, các lá thống trị, nghĩa là các đỉnh i chỉ có một đỉnh kề j. Ở đây, phủ đỉnh nhỏ nhất phải phủ hoặc là i hoặc j. Vì i chỉ có một đỉnh kề nhưng j có thể kề nhiều đỉnh nên ta đưa j vào phủ đỉnh và loại bỏ đỉnh các i, j và tất cả các cạnh liên quan tới chúng ra khỏi đồ thị. Đây là ý tưởng cơ bản của thuật toán loại bỏ lá của Bauer và Golinelli.

Thuật toán đầy đủ vẫn xác định nhưng tổng quát hơn so với loại bỏ lá: với mỗi thành phần liên thông, xác địnhđỉnh có bậc nhỏ nhất i0. Nếu bậc của i0 là di0 = 0 thì i0

là đỉnh độc lập và không cần phủ. Nếu bậc di0 = 1 thì i0 là lá và được xử lý như ở trên. Tương tự, rõ ràng thuật toán xử lý được các trường hợp bậc di0= 2, 3 và 4. Với các trường hợp bậc nhỏ nhất di0 > 4 thì phải đưa về bài toán con i0 được phủ và i0 không được phủ. Tuy nhiên, trong quá trình gọi đệ quy theo cách này có thể xảy ra trường hợp bài toán con đã được xét trước đó. Dựa trên việc áp dụng sự thống trị, thuật toán chạy nhanh hơn nhưng chỉ tìm được một phủ đỉnh nhỏ nhất do đó nó không thể dùng để liệt kê tất cả các lời giải.

Một cải tiến khác của thuật toán có độ phức tạp thời gian là O(2n/2.863) do Shindo M và Tomita E đề xuất. Các tác giả còn chứng minh được rằng với các thực nghiệm trên máy tính của họ, thuật toán này còn chạy nhanh hơn nhiều so với thuật toán chia để trị của Tarjan và Trojanowski [1].

Nếu ta không quan tâm tới việc tìm một lời giải phủ đỉnh nhỏ nhất mà chỉ quan tâm tới việc liệt kê tất cả các phủ đỉnh có thể thì phương pháp chia để trị không thích hợp mà thay vào đó ta có thể dùng phương pháp nhánh và cận. Tương tự, khi số đỉnh dùng để phủ k đã cho trước và cần tìm tất cả các lời giải có thể (bài toán P2) thì phương pháp nhánh và cận là khả thi.

Một phần của tài liệu Giải thuật di truyền giải bài toán phủ đỉnh nhỏ nhất (Trang 41 - 44)