Nhiều bài toán mà cách tiếp cận tham lam đưa ra những giải pháp tối ưu có thể được trình bày rõ ràng bởi việc tìm ra tập con độc lập có trọng số lớn nhất trong matroid trọng
số. Tức là, ta được cho một matroid trọng số M=(S,l) và ta muốn tìm ra một tập A∈l độc
lập sao cho ω( )A được cực đại hoá. Ta gọi tập con độc lập và có trọng số lớn nhất là tập
con tối ưu của matroid. Bởi vì trọng số ω( )x của bất kỳ phần tử x∈Slà số dương, một tập con tối ưu luôn là tập con độc lập lớn nhất.
Ví dụ, trong bài toán tìm cây khung nhỏ nhất, ta có một đồ thị vô hướng, liên thông
G=(V,E) và hàm tính độ dài ω sao cho ω( )e là độ dài của cạnh e. (Ta sử dụng đại lượng
“độ dài” để chỉ trọng số của cạnh ban đầu trong đồ thị, “trọng lượng” để chỉ trọng số trong matroid). Ta cần tìm ra tập con của các cạnh mà kết nối tất cả các đỉnh với nhau và có tổng độ dài nhỏ nhất. Để xem ví dụ này như là một bài toán tìm một tập con tối ưu của matroid, cho một matroid trọng số MG với hàm trọng số ω', trong đó ω'( )e =ω(0)−ω( )e và ω0 thì
dương và một tập con tối ưu là một cây khung có tổng độ dài nhỏ nhất trong đồ thị ban đầu. Cụ thể hơn, mỗi tập con độc lập lớn nhất A tương ứng với một cây khung và bởi vì:
0
'( ) (A V 1) ( )A
ω = − ω ω−
Trong một tập con độc lập lớn nhất bất kỳ, một tập con độc lập đạt cực đại về ω'( )A thì
phải cực tiểu ω( )A . Vì vậy, một thuật toán bất kỳ có thể tìm ra một tập con tối ưu A trong
matroid tuỳ ý có thể giải quyết bài toán cây khung nhỏ nhất
Chương 23 đưa ra thuật toán cho bài toán cây khung nhỏ nhất, nhưng ở đây ta có một thuật toán tham lam thực hiện trên matroid trọng số bất kỳ. Giải thuật trên nhận dữ liệu vào
là một matroid trọng số M=(S,l) với một hàm trọng số dương và nó trả về một tập con tối
ưu A. Trong phần giả mã, ta biểu diễn những thành phần của M bởi S[M] và l[M] và hàm
trọng số bởi ω. Thuật toán là tham lam bởi vì nó xem mỗi phần tử x S∈ lần lượt được sắp
xếp theo trọng số giảm dần đều và trực tiếp cộng nó vào tập A đang được tích luỹ nếu {x}
A∪ là độc lập.
GREEDY(M,w)
1. A←∅
2. Sắp xếp S[M] theo thứ tự giảm dần bởi trọng lượng w
3. for mỗi x∈S[M] lấy ra từ tập được sắp xếp giảm dần theo trọng lượng w(x)
4. do if A∪{x}∈l[M]
5. then A←A∪{x}
6. return A
Những phần tử thuộc S được sắp xếp giảm dần theo trọng lượng. Nếu phần tử x được xem có thể thêm vào A trong khi vẫn duy trì sự độc lập của A, thì đúng là nó. Bằng không, x bị loại bỏ. Bởi vì tập rỗng là độc lập bởi định nghĩa về matroid và x được thêm vào A với
điều kiện A ∪{x} là độc lập, nên tập con A luôn luôn độc lập bằng phương pháp qui nạp.
Vì vậy, GREEDY luôn trả về một tập con độc lập A. Như sẽ thấy dưới dây A là tập con trọng số khả dĩ lớn nhất, vì vậy A một tập con tối ưu.
Thật dễ dàng để phân tích thời gian thực hiện của thuật toán tham lam. Cho n biểu diễn
cho S . Giai đoạn sắp xếp mất thời gian là O(nlogn). Dòng 4 thực hiện chính xác là n lần,
mỗi lần là một phần tử của S. Mỗi lần thực hiện dòng 4 yêu cầu là tập A∪{x}có độc lập
không. Nếu mỗi lần kiểm tra như thế chiếm O(f(n)), thì một giải thuật hoàn chỉnh chạy trong thời gian O(nlgn + nf(n))
Ta chứng minh rằng GREEDY trả về một tập con tối ưu.
a. Bổ đề 16.7: (Matroid có tính chất lựa chọn tham lam)
Giả sử rằng M=(S,l) là một matroid trọng số với hàm trọng số là ω và S được sắp xếp
theo thứ tự giảm dần theo trọng lượng. Cho x là phần tử đầu tiên của S sao cho {x} là độc lập. Nếu x tồn tại thì tồn tại một tập con tối ưu A của S chứa x.
Chứng minh: Nếu không tồn tại x như thế thì tập con độc lập duy nhất là tập rỗng. Nói
cách khác, cho B là một tập con tối ưu khác rỗng bất kỳ. Giả sử x∉B, mặt khác ta cho
A=B.
Không có phần tử nào của B có trọng số lớn hơn ω( )x . Để thấy điều này, ta có y∈B
dẫn đến {y} là độc lập, vì rằng B∈l và l là di truyền. Vì vậy việc chọn x đảm bảo rằng
( )x ( )y
ω ≥ω với bất kỳ y∈B.
Xây dựng tập A như sau. Bắt đầu với A={x}. Do cách chọn x nên A độc lập. Áp dụng tính chất trao đổi, lặp lại việc tìm một phần tử mới của B sao cho có thể thêm vào A cho
đến khi A = B trong khi vẫn giữ được tính độc lập của A. Lúc đó, A= B - {y}∪{x} với
mọi y∈B, và vì vậy:
( )A ( )B ( )y ( )x
ω =ω −ω +ω ≥ω( )B
Bởi vì B là tối ưu, A cũng phải tối ưu và bởi vì x∈Anên bổ đề được chứng minh.
Tiếp theo ta chỉ ra rằng nếu một phần tử không được lựa chọn lúc đầu thì nó không thể được lựa chọn sau đó.
b. Bổ đề 16.8
Cho M=(S,l) là một matroid bất kỳ. Nếu x, một phần tử của S, là một mở rộng của tập
Chứng minh: Bởi vì x là một mở rộng của A, ta có A∪{x} là độc lập. Vì rằng l là di
truyền, {x} phải là độc lập. Vì vậy, x là một mở rộng của tập ∅.
c. Hệ quả 16.9
Cho M=(S,l) là một matroid bất kỳ. Nếu x là phần tử của S sao cho x không là mở
rộng của ∅ thì x không là tử mở rộng của bất kỳ tập con A độc lập nàp của S.
Chứng minh: Hệ quả quả này là hoàn toàn trái ngược với Bổ đề 16.8
Hệ quả 16.9 cho rằng bất kỳ phần tử nào không được dùng ngay tức thì thì có thể không bao giờ được sử dụng. Vì vậy, GREEDY không thể gây ra lỗi bởi việc bỏ qua
những phần tử ban đầu bất kỳ trong S mà không là một mở rộng của ∅, vì rằng chúng
không bao giờ được sử dụng.
d. Bổ đề 16.10: Matrroid có tính chất cấu trúc con tối ưu
Cho x là phần tử đầu tiên của S được chọn bởi GREEDY đối với matroid M=(S,l).
Vấn đề còn lại của việc tìm ra một tập con độc lập có trọng số cực đại chứa x là tìm một tập con độc lập có trọng số cực đại của matroid có trọng số M’=(S’,l'), với điều kiện:
• S' {y S:{x,y}= ∈ ∈l}
• l' {B S-{x}:B {x}= ⊆ ∪ ∈l}
• Hàm trọng số đối với M’ là hàm trọng số đối với M nhưng bị giới hạn bởi S’. (ta
gọi M’ rút gọn của M bởi phần tử x).
Chứng minh: Nếu A là một tập con độc lập có trọng số cực đại của M chứa x, thì A’=A-{x} là một tập con độc lập của M’. Ngược lại, bất kỳ tập con độc lập A’ nào của M’
dẫn đến một tập con độc lập A=A’∪{x} của M. Bởi vì ta có cả hai trường hợp là
( )A ( ')A ( )x
ω =ω +ω , một giải pháp có trọng số cực đại trong M chứa x dẫn đến một giải
pháp có trọng số cực đại của M’, và ngược lại.
e. Định lý 16.11: (Tính đúng đắn của giải thuật tham lam trên matroid)
Nếu M=(S,l) là một matroid trọng số với hàm trọng số ω thì GREEDY(M,ω) trả lại
Chứng minh: Với hệ quả 16.9, bất cứ phần tử nào mà được bỏ qua lúc đầu bởi vì
chúng không phải là mở rộng của ∅ không hữu dụng nên không bao giờ xét lại nữa. Mỗi
lần phần tử đầu tiên x được chọn, Bổ đề 16.7 chỉ ra rằng GREEDY đúng khi thêm x vào A, vì luôn tồn tại một tập con tối ưu chứa x. Cuối cùng, Bổ đề 16.10 chỉ ra rằng bài toán còn lại là tìm ra tập con tối ưu trong matroid M’ mà là rút gọn của M bởi x. Sau khi GREEDY đặt A là {x}, tất cả các bước còn lại có thể được làm sáng tỏ như hoạt động trong matroid
M’=(S’,l'), bởi vì B là độc lập trong M’ nếu và chỉ nếu B∪{x} là độc lập trong M, đối
với tất cả các tập B∈l'. Vì vậy, phép tính tiếp theo của GREEDY sẽ tìm ra tập con độc lập
có trọng số lớn nhất của M’, và phép tính toàn diện của GREEDY sẽ tìm ra một tập con độc lập có trọng số cực đại của M.
PHẦN 5: BÀI TOÁN LẬP LỊCH LÀM VIỆC
Một bài toán thú vị mà có thể được giải quyết bằng cách dùng matroid là bài toán lập lịch làm việc tối ưu trên một bộ xử lý đơn lẻ, với điều kiện mỗi nhiệm vụ đều được giới hạn trong một thời gian nhất định, cùng với số tiền phạt phải trả nếu thời hạn kết thúc không đúng. Bài toán này trông có vẻ phức tạp nhưng nó có thể được giải quyết một cách đơn giản bằng cách dùng thuật toán tham lam.
Một nhiệm vụ trong một đơn vị thời gian là một công việc, có thể xem như là một chương trình có thể được chạy trên một máy tính với yêu cầu chính xác một đơn vị thời gian để hoàn thành. Cho một tập hữu hạn S gồm các công việc, mỗi lịch đối với S là một hoán vị của S chỉ ra thứ tự thực hiện của các công việc. Công việc đầu tiên trong lịch bắt đầu tại thời điểm 0 và kết thúc tại thời điểm 1, công việc thứ hai bắt đầu tại thời điểm 1 và kết thúc tại thời điểm 2, và tiếp tục như thế.
Bài toán lập lịch với thời hạn kết thúc và số tiền phạt cho một bộ xử lý đơn lẻ có dữ liệu vào như sau:
• Một tập S={a1,a2,…,an} của n công việc
• Một tập gồm n thời hạn kết thúc d1, d2,…,dn nguyên, sao cho mỗi di thoả 1≤ ≤di n
và nhiệm vụ ai được giả sử kết thúc trước thời hạn di với i = 1..n
• Một tập gồm n trọng số không âm hoặc các phạt số tiền w1, w2,…,wn sao cho ta phải
chịu một số tiền phạt wi nếu nhiệm vụ ai không hoàn thành trước thời hạn di và ta không phải chịu số tiền phạt nào nếu một nhiệm vụ hoàn thành đúng với thời hạn kết thúc của nó.
Ta được yêu cầu tìm ra một lịch của S sao cho giảm đến mức tối thiểu tổng số tiền phạt phải chịu do không đúng thời hạn.
Giả sử có một lịch cho trước. Ta nói rằng công việc là “trễ” trong lịch này nếu nó hoàn thành sau thời hạn kết thúc. Mặt khác, công việc đó được gọi là “sớm”. Một lịch tuỳ ý có thể luôn được đưa về dưới dạng sớm-trước trong đó công-việc-sớm hoàn thành trước công- việc-trễ. Để thấy được điều này, lưu ý rằng nếu một công việc ai nào đó theo sau một công việc trễ aj, thì ta thay đổi vị trí của ai và aj và ai sẽ vẫn là sớm và aj sẽ vẫn là trễ.
Tương tự ta khẳng định rằng một lịch tuỳ ý luôn được đưa về dưới dạng chuẩn trong đó những công việc sớm hoàn thành trước những công việc trễ và những công việc sớm này là được sắp xếp theo thứ tự tăng dần về thời hạn kết thúc. Để làm được điều này, ta đưa bài toán lập lịch làm việc về dạng sớm-trước. Sau đó, với điều kiện là có hai công việc sớm ai và aj hoàn thành với thời hạn tương ứng k và k+1 trong lịch sao cho di≤dj, ta hoán đổi vị trí của ai và aj. Vì rằng aj là công việc sớm trước khi hoán đổi, k+1≤ dj. Bởi vậy, k+1< di và vì vậy ai vẫn là công việc sớm sau khi hoán đổi. Công việc aj là trở nên sớm hơn trong lịch, vì thế nó cũng vẫn là sớm sau khi hoán đổi.
Bài toán tìm một lịch tối ưu được đưa về bài toán tìm một tập A các công việc sớm trong lịch tối ưu này. Một khi A được xác định, ta có thể tạo ra một lịch làm việc bằng việc sắp xếp các phần tử của A theo thứ tự tăng dần về thời hạn, rồi liệt kê những công việc trễ (ví dụ: S-A) theo thứ tự bất kỳ, đưa ra một thứ tự chuẩn của lịch làm việc tối ưu.
Ta nói rằng tập A gồm các công việc độc lập nếu tồn tại một lịch làm việc gồm những công việc này sao cho không có công việc nào là trễ. Rõ ràng, tập các công việc sớm trong một lịch làm việc là tập các công việc độc lập. Gọi l là tập của tất cả các tập công việc độc lập. Xét bài toán xác định một tập con A gồm các công việc cho trước có độc lập hay không. Với t= 0,1,2,…, n, đặt Nt(A) là số công việc có trong A mà thời hạn kết thúc là t hoặc sớm hơn. Lưu ý rằng N0(A)=0 đối với tập A bất kỳ.
5.1. Bổ đề 16.12
Với một tập A bất kỳ gồm các công việc, các mệnh đề sau là tương đương. 1. Tập A là độc lập
2. Với t=0,1,2,…, n, ta có Nt(A)≤t
3. Nếu các công việc trong A được sắp xếp theo thứ tự tăng dần về thời hạn kết thúc thì không có công việc nào trễ.
Chứng minh: Rõ ràng, nếu Nt(A) >t với t nào đó, thì không có cách nào để lập lịch làm việc mà không có một công việc trễ nào đối với A, bởi vì có nhiều hơn t công việc hoàn thành trước thời gian t. Vì vậy, (1) suy ra (2). Nếu (2) có giá trị thì (3) xảy ra: không có cách nào để “get stuck” khi việc lên lịch các công việc theo thứ tự tăng dần về thời hạn kết
thúc, vì rằng (2) suy ra rằng thời hạn kết thúc lớn nhất thứ i hầu hết đều là i. Cuối cùng, (3) thông thường suy ra (1).
Sử dụng tính chất 2 của Bổ đề 16.12, ta có thể dễ dàng tính toán được liệu có hay không một tập cho trước gồm các công việc là độc lập (xem 16.5-2)
Bài toán tối thiểu hoá tổng số tiền phạt của những công việc trễ giống như bài toán cực đại hoá tổng số tiền phạt của những công việc sớm. Định lý sau đây đảm bảo rằng ta có thể sử dụng thuật toán tham lam để tìm ra một tập độc lập. Một tập các công việc với tối đa số tiền phạt.
5.2. Định lý 16.13
Nếu S là một tập các công việc với các thời hạn kết thúc tương ứng và l là tập của tất
cả các tập độc lập thì hệ thống tương ứng (S,l) là một matroid.
Chứng minh: Mọi tập con của một tập các công việc độc lập đều là độc lập. Để chứng
minh tính chất trao đổi, giả sử B và A là những tập công việc độc lập và B > A . Gọi k là
giá trị t lớn nhất sao cho Nt(B)≤ Nt(A). (Ví dụ một giá trị t tồn tại vì rằng N0(B)=0). Bởi vì Nn(B)= B và Nn(A)= A , nhưng B > A , ta ắt hẳn có k<n và Nj(B)>Nj(A) đối với tất cả
các j trong khoảng k+1≤j≤ n. Vì vậy, B chứa nhiều công việc với thời hạn kết thúc k+1
hơn A. Đặt ai là một công việc trong B-A với thời hạn kết thúc là k+1. Đặt A’=A∪{ai}.
Bây giờ ta chỉ ra rằng A’ phải là độc lập bởi tính chất 2 của bổ đề 16.12. Với 0≤ t≤ k, ta có Nt(A’) = Nt(A)≤ t, vì rằng A là độc lập. Với k<t=n, ta có Nt(A’)≤ Nt(B)≤t vì rằng B là độc lập. Vì vậy, A’ là độc lập, ta hoàn thành việc chứng minh rằng (S,l) là một matroid.
Bằng định lý 16.11, ta có thể sử dụng thuật toán tham lam để tìm ra một tập các nhiệm vụ A độc lập có trọng số cực đại. Sau đó ta có thể lập nên một làm việc tối ưu gồm các công việc trong A như là những công việc sớm của nó. Phương thức này là một thuật toán lập lịch các công việc hiệu quả với các thời hạn kết thúc và số tiền phạt đối với bộ xử lý
đơn. Thời gian chạy thuật toán là O(n2) bằng cách sử dụng GREEDY, vì rằng có O(n) lần
kiểm tra tính độc lập mà mỗi lần tốn O(n) đơn vị thời gian (xem Bài tập 15.5-2). Minh hoạ 16.7 đưa ra một ví dụ về bài toán lập lịch các công việc với các thời hạn kết thúc và số tiền phạt đối với bộ xử lý đơn. Trong ví dụ này, thuật toán tham lam chọn các công việc a1, a2,
a3 và a4, sau đó loại bỏ a5 và a6, và cuối cùng nhận a7. Lịch làm việc tối ưu cuối cùng là: a2,