THUẬT TỐN THAM LAM

Một phần của tài liệu Giáo trình nhập môn Thuật toán (Trang 60 - 93)

2 .QUI HOẠCH ĐỘNG

3. THUẬT TỐN THAM LAM

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 qt 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.

• 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 đề 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 x dựa vào hàm chọn. Nếu tập S trở nên khơng cĩ triển vọng thì ta loại bỏ đối tượng x vừa thêm vào S và đối tượng này sẽ khơng bao giờ được xem xét lại nữa. Nếu việc thêm x vào làm S vẫn cĩ triển vọng thì ta giữ nguyên 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.

Function 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≠∅) do

x:= một phần tử của C làm tối đa hàm chọn C:=C\{x}

If (S∪{x}) là cĩ triển vọng then 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ế

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.

Ví dụ2: Giả sử cĩ các loại tiền giấy cĩ giá trị lần lượt là 1, 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à 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à 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.

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}, v là một đỉnh

thuộc V. Bài tốn đặt ra là tìm đường đi ngắn nhất từ v tới tất cả các đỉ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 và khi kết thúc thuật

tốn S chứa 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ột đường đi từ v tới một đỉnh nào đĩ 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 đi đặc biệt ngắn nhất tơi mỗi đỉnh của đồ thị. Tại thời điểm ta thêm

trong D cho ta lời giải bài tốn.

Giả sử đồ thị được cho bởi ma trận trọng số L với L[i,j]=∞ nếu khơng cĩ cạnh (i,j). Để đơn giản ta giả sử v là đỉnh 1. Cĩ thể mơ tả thuật tốn như sau:

Procedure Dijkstra(L) {Kết quả là mảng D[2..n]} C:={2,3,..,n}

For i:=2 to n do D[i]:=L[1,i] {Lặp tham lam} Repeat n-2 lần v:= phần tử của C cĩ D[v] nhỏ nhất C:=C \ {v}; S:= S∪{v} For w thuộc C do 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 qui 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 qui nạp vơi giả thiết rằng hai điều kiện trên đã thoả 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 qui nạp thì D[u] cho độ dài đường đi ngắn nhất đặc biệt từ đỉ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 đi đặc 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 qui 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 đi đặc biệt ngắn nhất tới u. Vậy a) đúng.

- Bây giờ xét một đỉnh w khơng thuộc S và khác với u. Khi thêm u vào S thì cĩ hai khả 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 qui nạp b) đúng với w. Nếu đường đi đặ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à đỉ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.

a. Lịch phục vụ với thời gian hệ thống tối thiểu

Bài tốn: Một người phục vụ phải phục vụ cho n khách hàng. Khách hàng thứ i cần

phục vụ trong thời gian t[i] , 1 ≤ i ≤ n. Ta muốn tổng thời gian chờ đợi và thời gian được phục vụ của tất cả các khách hàng (gọi là thời gian hệ thống) là nhỏ nhất. Vấn đề là tìm một trình tự phục vụ khách hàng (gọi là lịch phục vụ) đạt được mục đích đặt ra.

Ví dụ: Giả sử cĩ 3 khách hàng với t[1]=5, t[2]=10, t[3]=3. Khi đĩ cĩ thể cĩ 6 lịch

phục vụ như sau:

Thứ tự Tổng thời gian hệ thống T

2 3 1: 10+(10+3)+(10+3+5) =41

3 1 2: 3+(3+5)+(3+5+10) =29  tối ưu

3 2 1: 3+(3+10)+(3+10+5) =34

Trong trường hợp thứ nhất khách hàng 1 được phục vụ ngay, khách hàng 2 chờ trong khi khách hàng 1 được phục vụ và đến lượt được phục vụ, khách hàng 3 chờ trong khi hai khách hàng trước được phục vụ và đến lượt được phục vụ, do đĩ T=38.

Ta sẽ xây dựng thuật tốn hoạt động theo từng bước. Giả sử sau khi đã xếp lịch cho các khách hàng i1, i2,…, im ta thêm khách hàng j. Tại thời điểm này T sẽ tăng thêm một lượng là

t[i1]+t[i2]+…+t[im]+t[j]

Để tối thiểu T ta chỉ cần làm tối thiểu t[j]. Vì thế, ở mỗi bước ta sẽ thêm vào cuối lịch khách hàng địi hỏi ít thời gian phục vụ nhất trong các khách hàng cịn lại. Ta cĩ mơ tả sau Procedure Lichpv; {C là tập khách hàng, C={1,2, …,n}, L là lịch phục vụ} i:=1; While C≠∅ do x:= khách hàng trong C cĩ tx nhỏ nhất L[i]:=x; i:=i+1 C:=C\{x}

Chứng minh tính đúng đắn của thuật tốn:

Giả sử I=(i1, i2, …, in) là một hốn vị của các số nguyên (1, 2, …, n). Nếu các khách hàng được phục vụ theo thứ tự I thì tổng thời gian hệ thống tương ứng là

= n.t[i1]+(n-1)t[i2]+…+t[in] = ∑ = + − n k k i t k n 1 ] [ ) 1 (

Giả sử trong I tìm được hai chỉ số a và b sao cho a < b và t[ia] > t[ib], nĩi cách khác là khách hàng thứ a được phục vụ trước khách hàng thứ b trong khi khách hàng thứ b cần ít thời gian phục vụ hơn khách hàng thứ a. Nếu ta thay đổi vị trí của hai khách hàng này thì được một thứ tự mới I’ nhận được từ I bằng cách đổi chỗ ia và ib. Thứ tự mới này tốt hơn vì T(I’) = (n-a+1)t[ia]+(n-b+1)t[ib] + ∑ ≠ = − + n b a k k k i t k n , 1 ] [ ) 1 ( từ đĩ T(I’)-T(I) = (b-a)(t[ia]-t[ib]) > 0.

Do đĩ ta cĩ thể cải thiện một lịch bất kỳ mà trong đĩ cĩ khách hàng được phục vụ trước một khách hàng khác cần ít thời gian phục vụ hơn.

Lịch duy nhất khơng thể cải tiến được là lịch thu được khi sắp thứ tự các khách hàng khơng giảm theo thời gian phục vụ. Các lịch này là tương đương nhau và đều là tối ưu.

b. Lịch phục vụ cĩ thời hạn.

Bài tốn: Cĩ một tập n cơng việc cần thực hiện, mỗi cơng việc được thực hiện trong

một đơn vị thời gian. Tại một thời điểm t = 1, 2, … chỉ cĩ thể thực hiện được đúng một cơng việc.

Cơng việc i, 1 ≤ i ≤ n mang lại một giá trị gi chỉ khi nĩ được thực hiện khơng sau thời điểm d[i].

Tìm lịch thực hiện các cơng việc sao cho tổng giá trị thu được là lớn nhất.

Ví dụ: với n=4 và các giá trị sau

cĩ một vài lịch thực hiện và các giá trị mang lại như sau Lịch Giá trị 1, 3 65 2, 1 60 3, 1 65 4, 1 80  tối ưu

dãy 3, 2 chẳng hạn khơng được xét vì khi đĩ cơng việc 2 khơng được thực hiện đúng thời hạn.

Ta gọi một tập S các cơng việc là cĩ triển vọng nếu tồn tại ít nhất một cách sắp xếp các cơng việc trong tập S thành dãy sao cho tất cả các cơng việc trong dãy được thực hiện trong thời hạn của nĩ, ta cũng gọi dãy này là dãy cĩ triển vọng. Khi đĩ một thuật tốn tham lam hiển nhiên là xây dựng tập các cơng việc cĩ triển vọng theo từng bước, ở mỗi bước thêm vào tập này cơng việc cĩ giá trị lớn nhất chưa xét sao cho tập các cơng việc vẫn cịn cĩ triển vọng.

Ở ví dụ trên đầu tiên ta chọn cơng việc 1, sau đĩ chọn cơng việc 4: tập hợp {1, 4} cĩ triển vọng vì cĩ thể thực hiện theo thứ tự 4, 1. Tiếp theo ta thử tập {1,3,4} khơng cĩ triển vọng và loại cơng việc 3 ra. Cuối cùng thử {1,2,4} cũng khơng cĩ triển vọng nên loại cơng việc 2 ra. Lời giải trong trường hợp này là {1,4} mà cĩ thể thực hiện theo thứ tự 4, 1 là tối ưu.

Bây giờ ta sẽ chứng minh rằng thuật tốn luơn tìm được một lịch tối ưu và tìm một cách cài đặt thuật tốn hiệu quả.

Giả sử J là một tập k cơng việc. Để kiểm tra J cĩ triển vọng hay khơng dường như ta phải thử tất cả các hốn vị của các cơng việc trong J. Việc thử như vậy khá phức tạp và mất nhiều thời gian. Ta sẽ xem xét một cách làm khác dựa vào bổ đề sau:

Bổ đề 1: Giả sử J là một tập k cơng việc. Và giả sử S=(s1, s2,…, sk) là một hốn vị

của các cơng việc này sao cho d[s1] ≤ d[s2] ≤…. ≤ d[sk]. Khi đĩ tập J là cĩ triển vọng khi và chỉ khi dãy S cĩ triển vọng.

Chứng minh: Ta chỉ cần chứng minh nếu J cĩ triển vọng thì S cĩ triển vọng.

Nếu J cĩ triển vọng thì cĩ một dãy R=(r1, r2,…, rk) sao cho d[ri] ≥ i, 1 ≤ i ≤ k. Giả sử R khác S. Giả sử m là chỉ số nhỏ nhất sao cho sm khác rm, và p được xác định sao cho rp=sm, rõ ràng p>m. Ta cĩ: d[rm] ≥ d[sm] theo tính chất của S và cách xác định m, suy ra d[rm] ≥ d[rp]. Do đĩ cơng việc rm cĩ thể thực hiện muộn hơn rp trong lịch R. Trong R cĩ thể đổi chỗ hai cơng việc rm và rp ta được một dãy mới vẫn cĩ triển vọng, dãy này trùng với S ít nhất ở các vị trí 1, 2, …, m. Tiếp tục như vậy ta được một loạt dãy cĩ triển vọng, mỗi dãy lại cĩ thêm ít nhất một vị trí cĩ cơng việc trùng với cơng việc trong S. Sau k-1 bước như vậy ta thu được dãy S. Vậy S là dãy cĩ triển vọng.

Dựa vào bổ đề, để xác định một tập là cĩ triển vọng ta chỉ cần kiểm tra một dãy sắp thứ tự tăng theo thời hạn cĩ triển vọng hay khơng là đủ.

Trong mơ tả thuật tốn sau đây ta giả thiết rằng các cơng việc được đánh số sao cho g1 > g2 >…> gn và d[i] > 0 với i=1,…,n

Procedure LichTH;

d[0]:=0; j[0]:=0; {phần tử cầm canh} k:=1; j[1]:=1; {luơn chọn cơng việc 1} {Lặp tham lam}

For i:=2 to n do {theo thứ tự giảm của g} r:=k;

While d[j[r]] > max(d[i],r) do r:=r-1; {tìm vị trí để xếp lịch cho cơng việc i} If (d[j[r]] <= d[i]) and (d[i]>r) then {cơng việc i được chọn}

For m:=k downto r+1 do

k:=k+1; Return k, j[1..k];

{k là số cơng việc được chọn, j là trình tự thực hiện các cơng việc}

Thuật tốn này tại mỗi thời điểm vừa chọn cơng việc thích hợp vừa chèn cơng việc đĩ vào vị trí thích hợp trong lịch thực hiện.

Chứng minh tính tối ưu của thuật tốn:

Giả sử thuật tốn tham lam chọn thực hiện tập I các cơng việc trong khi thực tế tập J là tối ưu, J khác I. Xét 2 dãy cĩ triển vọng SI và SJ ứng với 2 tập cơng việc này. Bằng

Một phần của tài liệu Giáo trình nhập môn Thuật toán (Trang 60 - 93)

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

(95 trang)
w