Chương 2: PHƯƠNG PHÁP THAM VÀ PHƯƠNG PHÁP NHÁNH
2.2 Phương pháp tham lam giải một số bài toán về đồ thị
Giải thuật tham lam GrA (Greedy algorithm) là một thuật toán giải quyết một bài toán theo kiểu metaheuristic để tìm kiếm lựa chọn tối ưu ở mỗi bước đi với hy vọng tìm được tối ưu toàn cục.
Đối với nhiều bài toán, giải thuật tham lam hầu như không cho ra lời giải tối ưu toàn cục (nhưng không phải luôn như vậy), vì chúng thường không chạy trên tất cả các trường hợp. Chúng có thể bám chặt lấy một số lựa chọn nhất định một cách quá sớm, điều này dẫn đến hậu quả là trong giai đoạn sau, các thuật toán này không thể tìm ra các lời giải toàn cục tốt nhất. Ví dụ, đối với bài toán tô màu đồ thị và tất cả các bài toán NP-C khác, không một thuật toán tham lam đã được biết nào đảm bảo tìm thấy các lời giải tối ưu. Tuy nhiên, các thuật toán này vẫn hữu ích vì chúng dễ thiết kế và cho ra các ước lượng tốt về lời giải tối ưu.
Nếu có thể chứng minh rằng một thuật toán tham lam cho ra kết quả tối ưu toàn cục cho một lớp bài toán nào đó, thì thuật toán thường sẽ trở thành phương pháp được chọn lựa, vì nó chạy nhanh hơn các phương pháp tối ưu hóa khác như quy hoạch động. Các ví dụ cho giải thuật loại này là bài toán tô màu đồ thị, thuật toán Kruskal và thuật toán Prim dành cho bài toán cây bao trùm nhỏ nhất, thuật toán Dijkstra dành cho bài toán đường đi ngắn nhất nguồnđơn, và thuật toán tìm cây Huffman tối ưu.
Thuật toán tham lam để giải bài toán tô màu:
* Phát biểu bài toán
Bài toán tô màu rất quen thuộc , bài toán điển hình chính là bài toán 4 màu được phát biểu như sau : Mọi bản đồ trên mặt phẳng đều có thể tô bằng 4 màu sao cho không có hai nước láng giềng nào lại bị tô cùng 1 màu. Vậy chúng ta sẽ mở rộng bài toán trên thành một bài toán tổng quát mà hầu hết chúng ta đều đã quen thuộc :
Cho một đồ thị vô hướng N đỉnh ( N <= 200 ), mỗi đỉnh được nối với 1 số đỉnh khác bằng 1 cung nối trực tiếp duy nhất ( không có 2 đỉnh nào có nhiều hơn 1 đường nối trực tiếp ). Bài toán đặt ra là : Hãy tô màu các đỉnh sao cho không có hai đỉnh nào có 2 màu giống nhau mà lại nối trực tiếp với nhau với số màu cần tô là ít nhất.
Bài toán trên có rất nhiều cách giải. Trong đó cách đơn giản nhất để giải bài toán trên là Duyệt có chặn nhánh. Thuật toán trên khá hiệu quả. Có thể phát biểu qua cách trên như sau :
Procedure try(k : integer) ;
Begin
If ( k > N) then Begin
Cap_nhat_min;
Exit;
End;
Ok := false;
For i := 1 to somau do If To_duoc_mau(i,k) then
Begin Ok := true;
Dat_trang_thai(i,k); { Ghi nhan i co mau k, va danh so cac dinh ke voi i phai co mau khac i }
Try(k+1);
Tra_trang_thai(i,k);
end;
if (ok = false) { inc(somau);
Dat_trang_thai(somau,k);
Try(k+1);
Tra_trang_thai(somau,k);
Dec(somau);
}
End;
Tuy nhiên với dữ liệu lớn một chút thì thuật toán Duyệt sẽ không tối ưu về mặt thời gian. Do đó chúng ta sẽ áp dụng thuật toán tham lam để giải bài toán trên.
Thuật toán
Cho đồ thị G = (V, E), /V/ = n.
Bài toán đặt ra là tô màu đồ thị G với số màu ít nhất.
-Trước hết ta định nghĩa bậc của một đỉnh là số đỉnh trên đồ thị chưa được tô mầu mà đỉnh này được nối trực tiếp với đỉnh đang xét bằng một cạnh nối trực tiếp. Nếu đỉnh đó không được nối với bất kỳ đỉnh nào thì bậc của đỉnh đó là 0.
Ý tưởng là trên mỗi bước tô màu được nhiều đỉnh nhất bằng 1 màu.
-Bước 1 : Sắp xếp các đỉnh theo thứ tự giảm dần của bậc.
-Bước 2 : Tô màu 1 cho đỉnh có bậc cao nhất và lần lượt các đỉnh không liền kề với các đỉnh đã được tô màu.
-Bước 3 : Tiếp tục tô màu 2, màu 3… cho các đỉnh còn lại.
Thí dụ: Tô màu cho đồ thị sau:
Bước 1 : Sắp xếp các đỉnh theo thứ tự giảm dần của bậc
Đỉnh g b e h a d f c
Bậc của đỉnh 5 4 4 4 3 3 3 2
- Bước 2 : Tô màu 1 cho đỉnh có bậc cao nhất và lần lượt các đỉnh không liền kề với các đỉnh đã được tô màu.
+ Tô màu 1 cho đỉnh c, đỉnh g.
+ Tô màu 2 cho đỉnh b, đỉnh d, đỉnh f + Tô màu 3 cho đỉnh a, đỉnh e.
+ Tô màu 4 cho đỉnh h.
Vậy số màu đã dùng để tô màu cho đồ thị là 4.
Hình 2.3 Ví dụ về bài toán tô màu