Giải thuật cho những bài toán tối ưu thường đi qua một sốbước, với một tập hợp các
chọn lựa tại mỗi bước. Với nhiều bài toán tối ưu hoá có thểsửdụng phương pháp đơn
giản và hiệu quảhơn phương pháp qui hoạch động. Phương pháp tham lam luôn chọn
phương án tốt nhất vào thời điểm hiện tại. Nó chọn tối ưu cục bộvới hy vọng rằng lựa
chọn này sẽdẫn đến một kết quảtối ưu toàn cục. Trong chương này sẽchỉra những bài
toán tối ưu mà có thể được giải quyết bằng phương pháp tham lam. Trước khi đọc
chương này chúng ta nên đọc kỹvềphần quy hoạch động.
Phương pháp thamlam không phải luôn mang lại các kết quảtối ưu, nhưng có nhiều
bài toán nó có thểgiải quyết được. Trong khuôn khổ đềtài này, nhóm chúng tôi xin đưa
ra các phần nhưsau:
- Phần 1: giới thiệu bài toán chọn hoạt động, đối với vấn đềnày thì phương pháp tham
lam là hiệu quả để đưa ra kết quả. Ta sẽ đi đến một phương pháp tham lam bởi việc
xét đến đầu tiên là một giải pháp quy hoạch động và sau đó chỉra rằng ta có thểluôn
đưa ra những lựa chọn tham lam để đi đến một kết quảtối ưu.
- Phần 2: nhắc lại những yếu tốcơbản của phương pháp tham lam, đưa ra một một
cách tiếp cận trực tiếp hơn đểchứng minh phương pháp
tham lam đúng hơn dựa trên
quy hoạch động đã đềcập ởphần 1.
- Phần 3: giới thiệu một ứng dụng quan trọng của kỹthuật tham lam: một mô hình của
các chuẩn nén dữliệu.
- Phần 4: ta nghiên cứu kỹmột sốlý thuyết tổng hợp cơsở được gọi là "matroids" mà
đối với vấn đềnày phương pháp tham lam luôn đưa ra kết quảtối ưu.
- Phần 5: minh hoạ ứng dụng của việc sửdụng maitroids trong một bài toán lập lịch
làm việc với thời hạn cuối cùng và sốtiền phạt.
61 trang |
Chia sẻ: tuandn | Lượt xem: 5098 | Lượt tải: 3
Bạn đang xem trước 20 trang tài liệu Tiểu luận Thuật toán tham lam, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ĐẠI HỌC HUẾ
TRƯỜNG ĐẠI HỌC KHOA HỌC
KHOA CÔNG NGHỆ THÔNG TIN
[[\\
Tiểu luận học phần Phân tích Thiết kế thuật toán
THUẬT TOÁN THAM LAM
(GREEDY ALGORITHM)
Học viên thực hiện: Nhóm 8 ‐ Lớp KHMT Khóa 2009‐2011
Hoàng Minh
Lê Viết Chinh
Nguyễn Mạnh Cường
Lương Việt Tiến
Trần Khánh Hưng
Giáo viên hướng dẫn: TS Hoàng Quang
Huế, Tháng 11 năm 2009
Thuật toán tham lam
Trang 1
LỜI NÓI ĐẦU
Giải thuật cho những bài toán tối ưu thường đi qua một số bước, với một tập hợp các
chọn lựa tại mỗi bước. Với nhiều bài toán tối ưu hoá có thể sử dụng phương pháp đơn
giản và hiệu quả hơn phương pháp qui hoạch động. Phương pháp tham lam luôn chọn
phương án tốt nhất vào thời điểm hiện tại. Nó chọn tối ưu cục bộ với hy vọng rằng lựa
chọn này sẽ dẫn đến một kết quả tối ưu toàn cục. Trong chương này sẽ chỉ ra những bài
toán tối ưu mà có thể được giải quyết bằng phương pháp tham lam. Trước khi đọc
chương này chúng ta nên đọc kỹ về phần quy hoạch động.
Phương pháp tham lam không phải luôn mang lại các kết quả tối ưu, nhưng có nhiều
bài toán nó có thể giải quyết được. Trong khuôn khổ đề tài này, nhóm chúng tôi xin đưa
ra các phần như sau:
- Phần 1: giới thiệu bài toán chọn hoạt động, đối với vấn đề này thì phương pháp tham
lam là hiệu quả để đưa ra kết quả. Ta sẽ đi đến một phương pháp tham lam bởi việc
xét đến đầu tiên là một giải pháp quy hoạch động và sau đó chỉ ra rằng ta có thể luôn
đưa ra những lựa chọn tham lam để đi đến một kết quả tối ưu.
- Phần 2: nhắc lại những yếu tố cơ bản của phương pháp tham lam, đưa ra một một
cách tiếp cận trực tiếp hơn để chứng minh phương pháp tham lam đúng hơn dựa trên
quy hoạch động đã đề cập ở phần 1.
- Phần 3: giới thiệu một ứng dụng quan trọng của kỹ thuật tham lam: một mô hình của
các chuẩn nén dữ liệu.
- Phần 4: ta nghiên cứu kỹ một số lý thuyết tổng hợp cơ sở được gọi là "matroids" mà
đối với vấn đề này phương pháp tham lam luôn đưa ra kết quả tối ưu.
- Phần 5: minh hoạ ứng dụng của việc sử dụng maitroids trong một bài toán lập lịch
làm việc với thời hạn cuối cùng và số tiền phạt.
Mặc dù nội dung của tiểu luận được dịch từ Chương 16 trong cuốn Introdution To
Algorithms, đây là một cuốn sách được viết khá công phu và kỹ lưỡng của nhóm tác giả
Thomas H. Cormen, Charles E. Leiserson và Ronald L. Rivest. Tuy nhiên, vì thời gian
thực hiện tiểu luận có hạn, đồng thời còn nhiều hạn chế trong vấn đề ngôn ngữ, nên chắc
Thuật toán tham lam
Trang 2
chắn tiểu luận sẽ có nhiều sai sót. Rất mong sự góp ý của Thầy và các bạn lớp Cao học
ngành Khoa Học Máy Tính khóa 2009 để chúng tôi hoàn chỉnh tiểu luận.
Xin chân thành cảm ơn TS. Hoàng Quang đã tận tụy giúp đỡ chúng tôi hoàn thành
tiểu luận này.
Thuật toán tham lam
Trang 3
PHẦN 1: BÀI TOÁN CHỌN HOẠT ĐỘNG
1.1. Giới thiệu bài toán
Bài toán sắp xếp lịch cho nhiều hoạt động với ý nghĩa để có thể sử dụng chung một tài
nguyên (mỗi thời điểm chỉ có một hoạt động sử dụng tài nguyên chung), với mục tiêu là
sắp xếp sao càng có nhiều hoạt động tương thích sử dụng tài nguyên càng tốt.
Giả sử ta có một tập hợp S = {a1,a2,..an } là tập các hoạt động muốn sử dụng tài
nguyên, ví dụ một hội trường, chỉ mỗi một hoạt động tại mỗi thời điểm. Mỗi hoạt động ai
sẽ có thời điểm bắt đầu là si và thời điểm kết thúc là fi, với điều kiện 0 ≤ si < fi < ∞. Nếu
hoạt động ai được chọn, thì nó sẽ độc chiếm tài nguyên trong khoảng thời gian [si, fi).
Hoạt động ai và aj được gọi là tương thích lẫn nhau nếu như khoảng thời gian [si, fi) và [aj,
fj) là không giao nhau (Ví dụ ai và aj là tương thích nếu si ≥ fj hoặc sj ≥ fi ). Trong bài toán
chọn hoạt động ta phải chọn tập con lớn nhất của các hoạt động tương thích lẫn nhau.
Chẳng hạn, xem tập S của các hoạt động sau, mà ta có thể sắp xếp tăng dần theo thời
điểm kết thúc.
i 1 2 3 4 5 6 7 8 9 10 11
Si 1 3 0 5 3 5 6 8 8 2 12
Fi 4 5 6 7 8 9 10 11 12 13 14
Ta sẽ thấy một cách ngắn gọn là tại sao nó thuận lợi để xem xét các hoạt động trong
trình tự sắp xếp. Chẳng hạn như, một tập con {a3, a9, a11 } bao gồm những hoạt động
tương thích lẫn nhau. Nó không phải là tập con lớn nhất, vì một tập con {a1, a4, a8, a11} là
lớn hơn. Thật ra {a1, a4, a8, a11} là tập con lớn nhất của các hoạt động tương thích lẫn
nhau; một tập con lớn nhất khác là {a2, a4, a9, a11}.
Ta sẽ giải quyết bài toán này trong một vài bước. Ta bắt đầu bởi việc đưa ra công thức
của giải pháp quy hoạch động đối với bài toán này trong đó ta tổng hợp các giải pháp tối
ưu đối với hai bài toán con để thiết lập giải pháp tối ưu của bài toán gốc. Ta có các lựa
chọn khi quyết định các bài toán để sử dụng trong một giải pháp tối ưu. Sau đó, ta sẽ
nhận thấy rằng ta chỉ cần một lựa chọn duy nhất - lựa chọn tham lam - và sau khi ta lựa
chọn chỉ còn một bài toán con, một bài toán con còn lại sẽ rỗng. Dựa trên những nhận xét
Thuật toán tham lam
Trang 4
này, ta sẽ xây dựng một giải thuật tham lam đệ quy để giải quyết bài toán lập lịch hoạt
động. Ta sẽ hoàn thành quá trình xây dựng giải thuật tham lam bởi việc biến đổi giải
thuật đệ quy sang giải thuật lặp. Mặc dù những bước ta thực hiện trong phần này thể hiện
mối liên quan nhiều hơn là tiêu biểu cho sự phát triển của phương pháp tham lam, chúng
minh hoạ cho mối quan hệ của phương pháp tham lam và quy hoạch động.
1.2. Cấu trúc con tối ưu của bài toán chọn hoạt động
Như đã đề cập ở trên, ta bắt đầu bằng phương quy hoạch động để giải quyết bài toán
lựa chọn hoạt động. Như ở chương 15, bước đầu tiên là tìm ra cấu trúc con tối ưu và sau
đó sử dụng nó để xây dựng một giải pháp tối ưu cho bài toán từ các giải pháp tối ưu cho
các bài toán con.
Ta nhận thấy rằng ở chương 15 ta cần định nghĩa một không gian thích hợp của bài
toán con. Ta hãy bắt đầu bằng việc định nghĩa các tập hợp:
Sij = {ak ∈S : fi ≤ sk < fk ≤ sj }
Sao cho Sij là một tập con của các hoạt động trong tập S mà có thể bắt đầu sau khi
hoạt động ai kết thúc và kết thúc trước hoạt động aj bắt đầu. Thật ra, Sij chứa tất cả các
hoạt động tương thích với ai và aj và cũng tương thích với tất cả các hoạt động hoàn thành
không trễ hơn ai và tất cả các hoạt động bắt đầu không sớm hơn aj bắt đầu. Để thuận tiện
trong việc biểu diễn bài toán, không mất tính tổng quát, ta thêm vào những hoạt động giả
sử a0 và an+1 với qui ước rằng f0 = 0 và Sn+1 = ∞. Sau đó S = S0..n+1, và phạm vi của i và j
được cho bởi 0 ≤ i, j ≤n+1.
Ta có thể giới hạn hơn nữa phạm vi của i và j như sau. Giả sử rằng các hoạt động đó
được sắp xếp theo một thứ tự tăng dần của thời điểm kết thúc:
f0 ≤ f1 ≤ f2 ≤...≤fn ≤ fn+1. (16.1)
Ta dễ dàng thấy rằng Sij = Ø với i ≥ j. Tại sao? Giả sử rằng tồn tại hoạt động ak ∈ Sij
sao cho i ≥ j, vì vậy ai kế tiếp aj trong thứ tự sắp xếp. Sau đó ta sẽ có
fi ≤ sk < fk ≤ sj < fj. Vì vậy, fi < fj, điều này mâu thuẫn với giả thiết rằng ai kế tiếp aj trong
thứ tự sắp xếp. Ta có thể kết luận rằng, ta sắp xếp các hoạt động theo thứ tự tăng dần của
thời điểm kết thúc, phạm vi của các bài toán con của ta là chọn một tập con cực đại của
Thuật toán tham lam
Trang 5
các hoạt động tương thích lẫn nhau từ Sij với 0 ≤ i < j ≤ n+1, biết rằng tất cả các Sij khác là
đều rỗng.
Để nhận ra được cấu trúc con của bài toán chọn hoạt động, ta xét một bài toán con
khác rỗng Sij, và giả sử rằng một giải pháp đối với Sij tồn tại một hoạt động ak, mà fi ≤ sk <
fk ≤ sj. Việc chọn hoạt động ak sẽ phát sinh ra hai bài toán con, Sik (những hoạt động mà
bắt đầu sau khi ai kết thúc và kết thúc trước khi ak bắt đầu) và Skj (những hoạt động mà bắt
đầu sau khi ak kết thúc và kết thúc trước khi aj bắt đầu), mỗi hoạt đó bao gồm một tập con
của các hoạt động trong Sij. Giải pháp của ta đối với bài toán Sij là tổng hợp hai giải pháp
cho hai bài toán con Sik và Skj, ứng với hoạt động ak. Vì vậy số các hoạt động trong giải
pháp đối với Sij của ta là kích thước của bài toán Sik, cộng với kích thước của bài toán Skj,
cộng với một (cho ak).
Cấu trúc con tối ưu của bài toán này là như sau. Nếu Aij là giải pháp tối ưu cho bài
toán có chứa các hoạt động ak. Thì giải pháp Aik cho Sik và Akj cho Skj được sử dụng trong
Sij cũng tối ưu. Lý luận cắt và dán thông thường áp dụng. Thật vậy, nếu tồn tại một giải
pháp A'ik cho Sik chứa nhiều hoạt động hơn Aik, ta có thể thay Aik bởi A'ik trong Aij, ta sẽ
tìm ra một giải pháp khác đối với Sij có nhiều hoạt động hơn Aij. Điều này trái với giả
thiết ta co rằng Aij là giải pháp tối ưu đối với Sij. Tương tự, nếu ta có một giải pháp A'kj
đối với Skj với nhiều hoạt động hơn Akj, ta có thể thay thế Akj bởi A'kj để đưa ra một giải
pháp cho Sij với nhiều hoạt động hơn Aij.
Bây giờ ta sử dụng cấu trúc con tối ưu để chỉ ra rằng có thể xây dựng một giải pháp
tối ưu cho bài toán từ những giải pháp tối ưu đối với những bài toán con. Ta đã thấy rằng
giải pháp nào đó cho bài toán con khác rỗng Sij có chứa hoạt động ak, và giải pháp tối ưu
bất kỳ đó chứa trong nó những giải pháp tối ưu đối với bài toán con Sik và Skj. Vì vậy, ta
có thể xây dựng một tập con cực đại của những hoạt động tương thích lẫn nhau trong Sij
bởi việc phân chia bài toán thành hai bài toán con (tìm tập con lớn nhất của các hoạt động
tương thích lẫn nhau trong Sik và Skj ), tìm ra những tập con lớn nhất Aik và Akj của những
hoạt động tương thích lẫn nhau đối với những bài toán con này, và thành lập tập con lớn
nhất Aij của các hoạt động tương thích lẫn nhau như:
Aij = Aik U {ak } U Akj (16.2)
Thuật toán tham lam
Trang 6
Giải pháp tối ưu cho bài toán chính là giải pháp cho S0,n+1.
1.3. Giải pháp đệ quy
Bước thứ hai trong việc phát triển giải pháp quy hoạch động là định nghĩa một cách
đệ quy giá trị của giải pháp tối ưu. Đối với những bài toán chọn hoạt động, gọi c[i,j] là số
các hoạt động trong tập con lớn nhất chứa các hoạt động tương thích lẫn nhau trong Sij.
Ta có c[i,j] = 0 khi Sij = Ø, hoặc c[i,j] = 0 khi i ≥ j.
Xét một tập con Sij khác rỗng. Như ta đã thấy, nếu ak được sử dụng trong tập con lớn
nhất các hoạt động tương thích lẫn nhau của Sij, Ta cũng sử dụng các tập con lớn nhất của
các hoạt động tương thích lẫn nhau cho các bài toán con Sik và Skj. Dùng công thức (16.2),
ta có công thức c[i,j] = c[i,k] + c[k,j] + 1.
Công thức đệ quy này cho thấy rằng ta biết giá trị của k, mà ta không biết. Ta có i-j-1
giá trị có thể chấp nhận cho k, cụ thể là k = i+1,..., j-1. Vì tập con lớn nhất của Sij phải
dùng một trong những giá trị này của k, ta phải kiểm tra tất cả chúng để tìm ra giá trị tốt
nhất. Vì vậy công thức đệ quy đầy đủ của c[i,j] trở thành:
{ }⎪⎩
⎪⎨
⎧
≠++
=
=
<<
φ
φ
ij
jki
ij
Sifjkckic
Sif
jic 1],[],[max
0
],[ (16.3)
1.4. Biến đổi một giải pháp quy hoạch động thành một giải pháp tham lam
Tại điểm này, nó sẽ là một bài tập dễ hiểu lập một cái bảng, từ dưới lên, thuật toán
quy hoạch động dựa trên công thức (16.3). Thực ra, bài tập 16.1-1 yêu cầu bạn thực hiện
điều này. Có hai sự xác định then chốt, tuy nhiên, điều này cho phép ta đơn giản hoá giải
pháp của ta.
Định lý 16.1
Xét một bài toán con khác rỗng Sij,và nếu am là một hoạt động trong Sij có thời điểm
kết thúc sớm nhất: fm = min{fk : ak ∈ Sij}. Thì:
1. Hoạt động am được sử dụng trong một tập con lớn nhất nào đó của các hoạt
động tương thích lẫn nhau của Sij.
Thuật toán tham lam
Trang 7
2. Bài toán con Sim là rỗng, do đó nếu chọn am thì chỉ còn duy nhất bài toán con
khác rỗng Smj.
Chứng minh
Ta chứng minh phần hai trước vì đơn giản hơn. Giả sử rằng Sim là khác rỗng, do đó có
một hoạt động ak nào đó sao cho fi ≤ sk < fk ≤ sm < fm . Mà ak cũng nằm trong Sij và nó có
thời gian kết thúc sớm hơn am, điều này mâu thuẫn với việc chọn am Ta kết luận rằng Sim
là rỗng.
Để chứng minh phần thứ nhất, ta giả sử rằng, Aij là một tập con lớn nhất của các hoạt
động tương thích lẫn nhau của Sij, và ta sắp xếp các hoạt động của Aij theo thứ tự tăng dần
của thời điểm kết thúc. Gọi ak là hoạt động đầu tiên trong Aij. Nếu ak = am, thì ta đã chứng
minh được, chỉ ra rằng am được sử dụng trong tập con lớn nhất nào đó của các hoạt động
tương thích lẫn nhau của Sij. Nếu ak ≠ am, ta xây dựng tập con A’ij = Aij – {ak} ∪ {am}. các
hoạt động trong A’ij thì tách rời nhau, các hoạt động trong Aij thì, ak là hoạt động kết thúc
đầu tiên trong Aij, và fm ≤ fk. Chú ý rằng A’ij có số hoạt động giống như Aij, ta thấy rằng
A’ij cũng là một tập con lớn nhất của các hoạt động tương thích lẫn nhau của Sij mà có
chứa am.
Tại sao định lý 16.1 có giá trị? Quay về phần 15.3 cấu trúc con tối ưu làm thay đổi
cách nhiều bài toán được sử dụng trong giải pháp tối ưu để đến bài toán gốc và trong
nhiều cách chọn ta có xác định những bài toán con để sử dụng. Trong giải pháp quy
hoạch động, hai bài toán con được sử dụng trong giải pháp tối ưu, và có j-i-1 cách chọn
khi giải quyết bài toán con Sij. Định lý 16.1 giảm cả số lượng lớn đáng kể này: chỉ duy
nhất một bài toán con được sử dụng trong giải pháp tối ưu (một bài toán con khác thì là
rỗng), và khi giải quyết bài toán con Sij, ta cần xem duy nhất một cách chọn: một cách với
thời gian kết thúc sớm nhất trong Sij. May mắn thay, ta có thể dễ dàng xác định đây là
hoạt động nào.
Cùng với việc giảm số các bài toán con và số cách chọn, định lý 16.1 cung cấp một lợi
ích khác: ta có thể giải quyết mỗi bài toán con theo kiểu từ trên xuống (top-down), hơn là
kiểu từ dưới lên (bottom-up) sử dụng điển hình trong quy hoạch động. Để giải quyết bài
toán con Sij, ta chọn hoạt động am trong Sij với thời gian kết thúc sớm nhất và thêm vào
Thuật toán tham lam
Trang 8
giải pháp này một tập của các hoạt động dùng trong giải pháp tối ưu đối với bài toán con
Sij. Bởi vì ta biết rằng, có chọn am, ta sẽ được sử dụng một giải pháp nào đó cho Smj trong
giải pháp tối ưu của ta cho Sij, ta không cần giải quyết Smj trước việc giải quyết Sij. Để
giải quyết Sij, ta có thể chọn am trước tiên như hoạt động trong Sij với thời điểm kết thúc
sớm nhất và sau đó giải quyết Smj.
Cũng chú ý rằng có một mô hình đối với những bài toán con mà ta giải quyết. Bài
toán ban đầu của ta là S =S0,n+1. Giả sử rằng chọn am1 là hoạt động trong S0,n+1 với thời
điểm kết thúc sớm nhất. (Từ việc sắp xếp các hoạt động theo thứ tự thời điểm kết thúc
tăng dần và f0 = 0, ta phải có m1 = 1.) Bài toán con tiếp theo là Sm1,n+1. Bây giờ giả sử rằng
ta chọn am2 là hoạt động trong Sm1,n+1 với thời điểm kết thúc sớm nhất. (Nó không cần
thiết trong trường hợp m2 = 2). Bài toán con tiếp theo là Sm2,n+1. Tiếp theo, ta thấy rằng
mỗi bài toán con sẽ có dạng S
im ,n+1 cho số hoạt động mi nào đó. Tóm lại, mỗi bài toán
con gồm có các hoạt động cuối cùng để kết thúc, và một số các hoạt động biến đổi từ bài
toán con này đến bài toán con khác.
Cũng có một mô hình đối với các hoạt động mà ta chọn. Bởi vì ta luôn luôn chọn hoạt
động với thời điểm kết thúc sớm nhất trong S
im ,n+1, thời điểm kết thúc của các hoạt động
được chọn qua tất cả các bài toán con sẽ làm gia tăng nghiêm trọng thời gian. Tuy nhiên,
ta có thể xem như mỗi hoạt động là một toàn diện, trong việc sắp xếp tăng dần của thời
điểm kết thúc.
Hoạt động am mà ta chọn khi giải quyết một bài toán con thì luôn là một hoạt động với
thời điểm kết thúc sớm nhất mà có thể được lập lịch hợp lý. Hoạt động được chọn như
vậy là chọn lựa “tham lam” trong hướng này, qua trực giác, nó để lại nhiều cơ hội có thể
cho những hoạt động còn lại để lập lịch. Đó là, lựa chọn tham lam là một cách mà cực đại
hoá số lượng đáng kể của thời gian còn lại chưa lập lịch.
1.5. Giải pháp tham lam đệ quy
Bây giờ ta đã thấy cách tổ chức hiệu quả giải pháp quy hoạch động, và cách xử lý nó
theo phương pháp từ trên xuống, ta xem một giải thuật mà nó hoạt động một cách thuần
tuý trong thuật toán tham lam, kiểu từ trên xuống. Dễ hiểu, một giải thuật đệ quy như là
thủ tục RECURSIVE-ACTIVITY-SELECTOR. Nó lấy thời điểm bắt đầu và kết thúc của
Thuật toán tham lam
Trang 9
các hoạt động, được trình bày như các mảng s và f, xem như những chỉ số bắt đầu i và n
mà nó định nghĩa bài toán con Si,n+1 nó là để giải quyết. (Tham số n chỉ hoạt động thực tế
cuối cùng an trong bài toán con và không chỉ hoạt động không có thật an+1 mà nó cũng ở
trong bài toán con). Nó trả về một tập lớn nhất của các hoạt động tương thích lẫn nhau
trong Si,n+1 .Ta cho rằng n hoạt động đưa vào được sắp xếp theo thời điểm kết thúc tăng
dần, theo công thức (16.1). nếu không, ta có thể sắp xếp chúng theo thứ tự này với độ
phức tạp O(nlgn), phá vỡ sự ràng buộc một cách tuỳ tiện. Lời gọi ban đầu là
RECURSIVE-ACTIVITY-SELECTOR(s,f, 0, n).
RECURSIVE-ACTIVITY-SELECTOR(s,f,i,n)
1 mÅi+1
2 while m≤n and sm<fi ¾Tìm hoạt động đầu tiên trong Si,n+1
3 do m Åm+1
4 if m<n
5 Then return {am}∪RECURSIVE-ACTIVITY-SELECTOR(s,f,m,n)
6 else return ∅
Minh hoạ 16.1 chỉ ra sự thực hiện của thuật toán. Trong việc gọi đệ quy của
RECURSIVE-ACTIVITY-SELECTOR(s,f,i,n), vòng lặp while của dòng 2-3 tìm kiếm
hoạt động đầu tiên trong vòng lặp ví dụ ai+1, ai+2, …, an, cho đến khi nó tím thấy hoạt động
đầu tiên am mà tương thích với ai, một hoạt động như vậy có Sm ≥ fi. Nếu vòng lặp giới hạn
bởi nó tìm thấy một hoạt động như vậy giải thuật quay lại dòng 5 sự kết hợp của {am} và
tập con cực đại của Sm,n+1 quay lại bởi việc gọi đệ quy RECURSIVE-ACTIVITY-
SELECTOR(s,f,m,n). Một cách lựa chọn, vòng lặp có thể giới hạn bởi m>n, trong trường
hợp này ta đã có kiểm tra tất cả các hoạt động mà không tìm thấy một hoạt động nào
tương thích với ai. Trong trường hợp này Si,n+1= ∅ , vì vậy giải thuật sẽ trả về ∅ ở dòng
6.
1.6. Giải pháp tham lam lặp
Ta dễ dàng chuyển đổi giải thuật đệ quy thành giải thuật lặp. Giải thuật RECURSIVE-
ACTIVITY-SELECTOR thì hầu như “đệ qui yếu“ (xem bài toán 7-4): nó kết thúc với lời
gọi đệ quy chính nó theo một sự thực hiện kết hợp. Dễ dàng để thay đổi một giải thuật đệ
Thuật toán tham lam
Trang 10
qui yếu thành giải thuật lặp, thật ra, một số trình biên dịch cho ngôn ngữ lập trình bất kỳ
thực hiện công việc này một cách tự động. Như đã được viết, RECURSIVE-ACTIVITY-
SELECTOR thực hiện cho các bài toán con Si,n+1…, những bài toán con mà có các hoạt
động kết thúc cuối cùng.
Giải thuật GREEDY-ACTIVITY-SELECTOR là một phiên bản lặp của giải thuật
RECURSIVE-ACTIVITY-SELECTOR, ở đây cũng giả sử các hoạt động đầu vào được
sắp xếp theo thời điểm kết thúc tăng dần. Nó tập hợp các hoạt động được chọn vào một
tập A và quay lại tập này khi nó đã được thực hiện xong.
Thuật toán tham lam
Trang 11
Hình 16.1 Sự thực hiện của RECURSIVE-ACTIVITY-SELECTOR trong hoạt động 11
được cho sớm hơn. Các hoạt động đã được xem trong mỗi lời đệ quy xuất hiện giữa
những đường kẻ ngang. Hoạt động không có thật a0 kết thúc tại thời điểm 0, và trong lời
gọi ban đầu RECURSIVE-ACTIVITY-SELECTOR (s,f,0,11), hoạt động a1 được chọn.
Trong mỗi lời gọi đệ quy, những hoạt động mà đã được chọn được tô đen, và các hoạt
động tmàu tô trắng đang được xem xét. Nếu thời gian bắt đầu của một hoạt động xảy ra
trước thời gian kêt thúc của hoạt động mới được chọn (mũi tên giữa chúng chỉ sang trái),
nó bị loại. Trái lại (mũi tên chỉ trực tiếp hay qua phải), nó được chọn. Lời gọi đệ quy
cuối cùng, RECURSIVE-ACTIVITY-SELECTOR (s, f, 0, 11) trả về Ø. Tập kết quả của các
hoạt động được chọn là{a1, a4, a8, a11}.
GREEDY-ACTIVITY-SELECTOR(s,f)
1 n ← length[s]
2 A ← {a1}
3 i ← 1
4 for m ← 2 to n
5 do if sm≥fi
6 Then A ← A ∪ {am}
7 i ← m
8 Return A
Giải thuật thực hiện như sau. Biến i đánh số các phần tử thêm vào A gần nhất, tương
ứng đối với hoạt động ai trong phiên bản đệ quy. Giả sử các hoạt động được sắp xếp theo
thứ tự tăng dần của thời điểm kết thúc, fi luôn là thời điểm kết thúc lớn nhất của hoạt động
nào đó trong A. Điều đó là:
fi = max{fk : ak ∈A} (16.4)
Dòng 2-3 chọn hoạt động ai, ban đầu A chỉ chứa chỉ m