Đầu tiên ta trình bày một thuật toán tham lam heuristic để tìm các phủ đỉnh nhỏ nhất, tức là một thuật toán để tìm các lời giải cho bài toán (P1). Ý tưởng của heuristic ở đây là tìm cách phủ được càng nhiều cạnh với càng ít đỉnh càng tốt. Do đó, thuật toán sẽ quan tâm tới các đỉnh có bậc cao. Chiến thuật này được lặp lại nhiều lần trong khi đó bậc của các đỉnh được hiệu chỉnh tự động bằng cách loại bỏ các đỉnh và các cạnh đã được phủ. Thuật toán sẽ trả về một xấp xỉ của phủ đỉnh nhỏ nhấtV’ có kích thước |V’|, kích thước | V’| là cận trên thực sự của kích thước phủ đỉnh nhỏ nhất.
Dưới đây là một số dạng khác của thuật toán tham lam [21].
3.3.2.1. Thuật toán tham lam đơn giản greedy 1
Một ý tưởng heuristic cho bài toán phủ đỉnh là một thuật toán tham lam thực hiện lặp lại việc chọn một cạnh chưa được phủ và đưa một đỉnh của cạnh vào tập phủ hiện tại.
greedy1 (G) ' V while E Chọn một cạnh e bất kỳ thuộc tập E và chọn một đỉnh v của e. ' ' \ : V V v E E e E v e returnV’ Nhận xét:
Vì với mỗi cạnh e bất kỳ được đưa ra khỏi tập cạnh E đều có một đỉnh v được đưa vào phủ nên khi kết thúc thuật toán E , thì tất cả các cạnh đều được phủ bởi ít nhất một đỉnh trong phủ V’.
Thuật toán greedy1 thực sự có ý nghĩa với đồ thị hai phía. Xét đồ thị hai phía B
= (L, R, E). Tập đỉnh L chứa r đỉnh. Tập đỉnh R được chia nhỏ hơn thành r tập con R1,
R2, ..., Rr. Mỗi đỉnh trong Ri có một cạnh tới i đỉnh trong L và không có hai đỉnh nào trong Ri có một hàng xóm chung trong L; vì vậy |Ri | r i/ . Từ đó dẫn tới mỗi đỉnh trong L có bậc lớn nhất là r và mỗi đỉnh trong Ri có bậc i. Tổng số đỉnh là
( log )
n r r . Người ta chứng minh được tỉ lệ xấp xỉ của thuật toán là hàm phụ thuộc đa thức đối với n, (log )n .
3.3.2.2. Thuật toán tham lam greedy2 (clever greedy)
Thuật toán này đưa ra tỉ lệ xấp xỉ tốt hơn greedy1. Ý tưởng của thuật toán là thay vì chọn tùy ý đỉnh v như greedy1 thì ta chọn đỉnh kề với nhiều cạnh chưa được phủ nhất.
Ý tưởng thuật toán:
1. Tìm một đỉnh v có bậc lớn nhất
2. Đưav vào phủ đỉnh và loại bỏ v cùng với tất tất cả các cạnh kề với nó trong đồ thị. Cập nhật bậc của v.
3. Lặp lại cho đến khi tất cả các cạnh đều được phủ.
greedy2 (G) '
V
while E do
Chọn một đỉnh v V có bậc lớn nhất trong đồ thị hiện thời. ' ' \ : V V v E E e E v e returnV’
Giải thích hoạt động của greedy2 với đồ thị hai phía
Hình 3.3. Hoạt động của greedy2 với đồ thị hai phía
Lời giải tối ưu gồm các đỉnh màu đỏ, và có kích thước là 6. Sử dụng thuật toán greedy2, nếu không may mắn có thể đầu tiên ta sẽ chọn tất cả các đỉnh màu xanh lá cây (hai đỉnh đầu tiên bên dưới), sau đó chọn tất cả các đỉnh màu xanh (ba đỉnh tiếp theo) và cuối cùng chọn các đỉnh màu cam (bốn đỉnh cuối cùng). Như vậy lời giải có kích thước là 11. Người ta chứng minh được tỉ lệ xấp xỉ của thuật toán này là O(log n). Thuật toán greedy2 thất bại với đồ thị có dạng
Lời giải tối ưu có kích thước là k! , gồm tất cả các đỉnh ở chóp của đồ thị.
Lời giải tồi nhất tìm được bởi thuật toán greedy2 có kích thước bằng k! (1/k + 1/(k – 1 ) + 1/(k – 2 ) + … + 1) ≈k! log(k), tất cả các đỉnh ở đáy.
Ngoài ra, người ta còn đưa ra một thuật toán xấp xỉ tỉ lệ 2 cho bài toán phủ đỉnh nhỏ nhất dựa trên thuật toán duyệt cây theo chiều sâu của Savage. Thuật toán này được gọi là DFS – Depth First Spanning Tree. Ý tưởng của thuật toán này là tìm một cây khung theo chiều sâu trong đồ thị G. Khi đó, phủ đỉnh V’ là tập tất cả các nút không là lá trong cây. Thuật toán này đưa ra một phủ đỉnh và có tỉ lệ xấp xỉ không tầm thường. Nó đặt ra một bài toán mở là tìm một thuật toán xấp xỉ tỉ lệc cho bài toán với 2 – c =
(1)
.
3.3.2.3. Thuật toán xấp xỉ với sai số tỉ lệ bị chặn là 2
Thuật toán này trả về một phủ đỉnh có kích thước không lớn hơn hai lần kích thước phủ đỉnh tối ưu [2][14]. Thuật toán được mô tả như sau.
k! đỉnh bậc k
APRRPOX – VERTEX – COVER (G) 1. C← ØØ 2. E’ ← E[G] 3. whileE’ 4. do gọi (u, v) là một cạnh bất kỳ trong E’ 5. CCu v,
6. loại bỏ tất cả các cạnh trong E’ kề với u hoặc v
7. returnC
Ở đây, biến C chứa phủ đỉnh đang được xây dựng. Bước 1 khởi tạo C là rỗng. Bước 2 thiết lập E’ là tập các cạnh E[G] của đồ thị. Bước 3 đến 6 lặp lại việc chọn một cạnh bất kỳ từ E’, bổ sung các đỉnh u, v của nó vào C và xóa các cạnh trong E’ chứa u
hoặc v. Thời gian tính toán của thuật toán là O(|E|) khi sử dụng cấu trúc dữ liệu thích hợp để biểu diễn E’.
Các thao tác của thuật toán xấp xỉ giải bài toán phủ đỉnh
Đồ thị đầu vào G gồm 7 đỉnh và 8 cạnh. (b, c) là cạnh đầu tiên được chọn, đỉnh b và c
được đưa vào phủ đỉnh C, các cạnh (a, b), (c,
e) và (c, d) bị loại khỏi đồ thị vì chứa đỉnh thuộc phủ đỉnh C. b d g a e f c b d g a e f c
Cạnh (e, f ) được chọn, đỉnh e và f được đưa vào C, các cạnh (e, d) và (e, d) bị loại khỏi đồ thị.
Cạnh (d, g) được chọn và các đỉnh e, g được đưa vào C.
Phủ đỉnh tạo bởi thuật toán xấp xỉ gồm 6 đỉnh b, c, d, e, f, g.
Phủ đỉnh tối ưu gồm 3 đỉnh b, d, e.
Hình 3.4. Minh họa thuật toán xấp xỉ với sai số tỉ lệ bị chặn bởi 2
Chứng minh thuật toán APPROX – VERTEX – COVER có sai số tỉ lệ bị chặn bởi 2
Gọi C* là phủ đỉnh tối ưu và A là tập các cạnh được chọn. C là phủ đỉnh tìm được bởi thuật toán trên.
Ta có |C*| | |A vì C* là một phủ đỉnh của đồ thị mà mọi cạnh đều phải có ít nhất một đỉnh trong C*.
Từ thuật toán trên ta thấy |C| = 2 * |A| , mỗi cạnh có 2 đỉnh đưa vào trong C. Từ hai bất đẳng thức trên ta có |C| 2* |C*|.
Nhận xét:
Rõ ràng tập các cạnh được chọn bởi thuật toán là một cặp ghép của đồ thị, không có hai cạnh nào có chung một đỉnh (các cạnh không giao nhau). Thực ra nó
b d g a e f c b d g a e f c b d g a e f c b d g a e f c
chính là một cặp ghép cực đại. Khi đó, ta có thể thay thế mô tả của thuật toán bằng mô tả như sau.
Tìm một cặp ghép cực đại M của đồ thị.
Trả về tập các đầu mút của tất cả các cạnh thuộc M.
Câu hỏi đặt ra là liệu thuật toán này có thể thực hiện tốt hơn tỉ lệ xấp xỉ 2 hay không. Ta sẽ chứng minh là tỉ lệ xấp xỉ 2 này là tỉ lệ chặt cho thuật toán dựa trên một ví dụ chặt của bài toán như sau. Xét một đồ thị hai phía đầy đủ gồm n nút bên trái và n
nút bên phải, ký hiệu là Kn, n .Kích thước của một cặp ghép cực đại bất kỳ của đồ thị này là n, tức là |M| = n, do đó thuật toán APPROX-VERTEX-COVER(G) trả về một phủ có kích thước là 2n.
ALG(Kn, n ) = 2n
Hình 3.5. Đồ thị hai phía đầy đủ Kn, n
Quan sát đồ thị 2 phía ta dễ thấy, rõ ràng lời giải tối ưu có kích thước là n,
OPT(Kn, n) = n. Như vậy, thuật toán luôn đưa ra tỉ lệ xấp xỉ là 2 với mọi kích thước n