THUẬT TỐN THAM LAM.

Một phần của tài liệu Thuật toán và một số thuật toán sơ cấp (Trang 56 - 60)

3.1. Mở đầu

Các thuật tốn tham lam cũng thường được sử dụng để giải quyết các bài tốn tối ưu như tìm một trình tự tốt nhất thực hiện các cơng việc, tìm đường đi ngắn nhất trên đồ thị, v.v. Trong tình huống tổng quát ta cĩ:

 Một tập (hoặc một danh sách) các đối tượng đề cử: các đối tượng này cĩ thể là các cơng việc cần thực hiện, các đỉnh của đồ thị, v.v. Các đối tượng này là các ứng viên cĩ thể lựa chọn để xây dựng lời giải của bài tốn.

 Một tập các đối tượng đề cử đã được lựa chọn.

 Một hàm kiểm tra xem một tập các đối tượng đề cử cĩ cung cấp lời giải cho vấn đ (tức là cĩ thỏa mãn các ràng buộc) ề hay khơng, bỏ qua việc xem xét tính tối ưu.

 Một hàm kiểm tra xem một tập các đối tượng đề cử cĩ triển vọng hay khơng, tức là cĩ khả năng bổ sung vào tập này các đối tượng đề cử để cho nĩ trở thành một lời giải (chưa xét tới tính tối ưu) hay khơng.

 Một hàm chọn, xác định ở mỗi thời điểm đối tượng đề cử chưa sử dụng hứa hẹn cĩ hiệu quả nhất.

 Một hàm lượng giá trả lại giá trị của lời giải và chính là hàm cần tối ưu. Để giải quyết bài tốn tối ưu ta sẽ tìm kiếm một tập các đối tượng đề cử chứa lời giải làm tối ưu hàm lượng giá. Thuật tốn tham lam được tiến hành theo từng bước. Khởi đầu tập S các đối tượng đề cử đã lựa chọn là tập rỗng. Sau đĩ ở mỗi bước ta thử thêm vào S đối tượng đề cử tốt nhất cịn lại dựa vào hàm chọn. Nếu tập S trở nên khơng cĩ triển vọng thì x

ta loại bỏ đối tượng vừa thêm vào S và đối tượng này sẽ khơng bao giờ được xem xét lại x

nữa. Nếu việc thêm vào làm S vẫn cĩ triển vọng thì ta giữ nguyên x x trong S. Mỗi khi mở rộng tập S ta kiểm tra S chứa lời giải hay chưa. Khi một thuật tốn tham lam hoạt động đúng, lời giải đầu tiên tìm được luơn là lời giải tối ưu.

Mơ tả tổng quát:

Greedy(C:tập hợp); // C là tập hợp tất cả các đối tượng đề cử S=; // S là tập chứa lời giải được xây dựng từng bước While (S chưa là lời giải) and (C) {

x= một phần tử của C làm tối đa hàm chọn; // x là phần tử tốt nhất hiện cĩ C=C\{x}; // loại x khỏi tập đề cử để tránh xem xét lại x

If (S {x}) là  cĩ triển vọng { S=S {x} } 

}

If S là lời giải then return S; Else “Khơng cĩ lời giải”;

Thuật tốn được gọi là tham lam vì nĩ coi các đối tượng đề cử chưa sử dụng hứa hẹn cĩ hiệu quả nhất như là “miếng” ngon nhất mà nĩ cĩ thể “nuốt”. Nếu khơng nuốt được thì nĩ khơng quan tâm tới miếng đĩ nữa và nếu nuốt được thì nĩ nuốt ngay mà khơng bận tâm gì.

Hàm chọn thường dựa vào hàm lượng giá, i khi hai hàm này là một.đơ

Ví dụ 1: Giả sử cĩ các loại tiền giấy cĩ giá trị lần lượt là 1, 5, 10, 25. Cần trả số tiền n với số tờ ít nhất.

Các đối tượng đề cử: tập hữu hạn các đồng tiền thuộc các loại tiền đã cho, mỗi loại cĩ ít nhất một tờ.

Một lời giải: tổng giá trị của các tờ tiền đã chọn bằng n.

Tập cĩ triển vọng: tổng giá trị các tờ tiền trong tập hợp đã chọn khơng vượt quá n. Hàm chọn: chọn tờ tiền cĩ giá trị cao nhất cịn lại trong tập đề cử.

Hàm lượng giá: số tờ tiền đã sử dụng trong lời giải.

Một điều đặc biệt cần lưu ý là thuật tốn tham lam khơng phải lúc nào cũng hoạt động tốt, cĩ nghĩa là khơng phải với tình huống nào nĩ cũng cho lời giải tối ưu. Hơn thế nữa đơi khi thuật tốn tham lam cịn khơng cho lời giải (chưa nĩi tới tính tối ưu) trong khi tồn tại lời giải. Vì vậy, khi sử dụng thuật tốn tham lam ta cần phải chứng minh rằng, trong tình huống tương ứng thuật tốn tham lam cho ta lời giải tối ưu.

n với số tờ ít nhất.

Giả sử số tiền cần trả là n=20. Theo thuật tốn tham lam các tờ tiền sẽ được chọn lần lượt như sau: 12, 5, 1, 1, 1 và cho ta một phương án khơng tối ưu.

Ví dụ3: Giả sử cĩ các loại tiền giấy cĩ giá trị lần lượt là 2, 5, 10, 12, 25. Cần trả số tiền

n với số tờ ít nhất.

Giả sử số tiền cần trả là n=15. Theo thuật tốn tham lam các tờ tiền sẽ được chọn lần lượt như sau: 12, 2 và khơng dẫn tới lời giải.

Ví dụ 2 và ví dụ 3 cho thấy thuật tốn tham lam cĩ thể đưa ra lời giải khơng tối ưu hoặc cho kết luận sai là khơng cĩ lời giải trong khi cĩ lời giải tối ưu.

3.2. Bài tốn Tìm đường đi ngắn nhất.

Bài tốn tìm đường đi ngắn nhất đã được giới thiệu trong lý thuyết đồ thị cùng với thuật tốn Dijkstra. Ở đây ta sẽ mơ tả ý tưởng thuật tốn tham lam của thuật tốn này và chứng minh tính ng đú đắn của thuật tốn.

Xét đồ thị G=(V,E) là đơn đồ thị cĩ trọng số khơng âm, V={1, 2,.., n}, là một đỉnh v

thuộc V. Bài tốn đặt ra là tìm đường đi ngắn nhất từ tới tất cả các đv ỉnh cịn lại của đồ thị. Sử dụng tiếp cận của thuật tốn tham lam ta cĩ C là tập các đỉnh của đồ thị và S là tập các đỉnh đã chọn. Tại mỗi thời điểm S chứa các đỉnh mà khoảng cách nhỏ nhất tới v là đã biết, cịn C chứa tất cả các đỉnh cịn lại. Khởi đầu S chứa và khi kết thúc thuật tốn S chứa v

tất cả các đỉnh của đồ thị. Ở mỗi bước ta chọn đỉnh trong C sao cho khoảng cách từ đĩ tới v

là nhỏ nhất và thêm đỉnh đĩ vào S.

Ta nĩi rằng mộ đường đi từ tới một đỉnh nào đĩt v là đặc biệt nếu tất cả các đỉnh trung gian trên đường đi này đều thuộc S. Ở mỗi bước của thuật tốn, một mảng D chứa độ dài của đường đ đặc biệt ngắn nhất tơi mỗi đỉnh của đồ thị. Tại thời điểm ta thêm một đỉnh mới i

u vào S, đường đi đặc biệt ngắn nhất tới u cũng là đường đi ngắn nhất tới . Khi kết thúc u

thuật tốn tất cả các đỉnh của đồ thị đều thuộc S, do đĩ các giá trị lưu trong D cho ta lời giải bài tốn.

đơn giản ta giả sử v là đỉnh 1. Cĩ thể mơ tả thuật tốn như sau: int Dijkstra(L); // Kết quả là mảng D[2..n]

C={2,3,..,n}

For (i=2;i<=n;i++) { D[i]=L[1,i] ; }

For (i=1;i<=n-2;i++) { // Lặp tham lam v= phần tử của C cĩ D[v] nhỏ nhất; C=C \ {v}; S= S {v}; 

For w thuộc C { D[w]= min(D[w], D[w]+L[v,w]) ; } }

Chứng minh tính đúng đắn của thuật tốn: Ta sẽ chứng minh quy nạp rằng

a) Nếu đỉnh i thuộc S thì D[i] cho độ dài đường đi ngắn nhất từ đỉnh đầu tới đỉnh i. b) Nếu đỉnh i khơng thuộc S thì D[i] cho độ dài đường đi đặc biệt ngắn nhất từ đỉnh đầu tới đỉnh i.

Dễ thấy bước cơ sở của chứng minh là đúng theo thuật tốn. Ta tiến hành bước quy nạp vơi giả thiết rằng hai điều kiện trên đã thỏa mãn trước khi ta thêm đỉnh mới u vào S.

- Nếu i thuộc S trước khi thêm u vào S thì hiển nhiên a) đúng với i. Vì u là đỉnh mới thêm vào S nên ta chỉ cần kiểm chứng rằng D[u] cho độ dài đường đi ngắn nhất từ đỉnh đầu tới u. Theo giả thiết quy nạp thì D[u] ch độ dài đường đi ngắn nhất đặc biệt từ đo ỉnh đầu tới u. Ta chỉ cần chứng minh đường đi ngắn nhất từ đỉnh đầu tới u phải là một đường đ đặc i biệt. Giả sử ngược lại rằng cĩ đường đi ngắn nhất từ đỉnh đầu tới u qua một đỉnh x đầu tiên khơng thuộc S. Rõ ràng độ dài đường đi từ đỉnh đầu tới u thơng qua x phải

 độ dài đường đi tới x (vì ít nhất cĩ thêm các cạnh để tới u)  D[x] (do giả thiết quy nạp b))

 D[u] (do thuật tốn tham lam chọn u trước x)

Vì thế đường đi ngắn nhất tới u thơng qua x khơng thể ngắn hơn đường đ đặc biệt ngắn i nhất tới u. Vậy a) đúng.

năng cho đường đi đặc biệt ngắn nhất từ đỉnh đầu tới w: hoặc là nĩ khơng thay đổi, hoặc là nĩ đi qua u. Nếu đường đi đặc biệt khơng thay đổi thì theo giả thiết quy nạp b) đúng với w. Nếu đường đ đặc biệt qua u thì cĩ hai khả năng: hoặc u đi ngay trước w hoặc đi trước w là i đỉnh x nào đĩ khác u và thuộc S. Nếu đi trước w là đỉnh x nào đĩ khác u và thuộc S, tức là x được thêm vào S trước u, khi đĩ đường đi này khơng ngắn hơn đường đi cĩ độ dài D[x]+L[x,w] vì D[x] D[u]. Do trong  đĩ đường đi đặc biệt tới w qua u thì u đi ngay trước w và thuật tốn của ta xác định D[w] làm cho b) đúng.

3.3. Bài tốn lập lịch.

Một phần của tài liệu Thuật toán và một số thuật toán sơ cấp (Trang 56 - 60)

Tải bản đầy đủ (PDF)

(71 trang)