You are on page 1of 11

ðẠI HỌC QUỐC GIA TP.

HCM
ðẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA TOÁN –TIN HỌC

Báo cáo môn học


PHÂN TÍCH THUẬT TOÁN
ðề tài
GIẢI THUẬT THAM LAM

GVHD: TS. Trần Nam Dũng


ThS. Nguyễn Thành Nhựt
Nhóm thực hiện:
Triệu Nguyên – 0711152
Nguyễn Văn Nhân – 0711157
Phạm Ngọc Mai – 0711141
Nguyễn Thị Thùy Nhân – 0711156

Nội dung trình bày:


I. Giới thiệu.
II. Bài toán chọn hoạt ñộng.
III. Bài toán chu trình Hamilton.
IV. Ưu – khuyết ñiểm.

--- 2010 ---


Giải thuật tham lam

I. Giới thiệu:
 Ý tưởng tham lam (Greedy) :
Trong mọi khía cạnh của cuộc sống hàng ngày, công việc và nghiên cứu, con người phải luôn ñối
mặt với các vấn ñề (problem). Có ai ñó còn phát biểu: sống là một quá trình cố gắng ñể giải quyết
những bài toán, những vấn ñề. Trong số những vấn ñề ñó, có những vấn ñề chỉ ñơn giản là cần có giải
pháp giải quyết nhưng cũng có những vấn ñề khắt khe hơn ñòi hỏi không chỉ là giải pháp (Solution)
mà giải pháp ñó phải là giải pháp tốt nhất (best solution) (nhanh nhất, ñơn giản nhất, hiệu quả nhất ...)
ñó ñược gọi là những vấn ñề cần tối ưu (Optimization Problem) .
Trong quá trình nghiên cứu giải quyết các vấn ñề – bài toán, người ta ñã ñưa ra những nhận xét
như sau:
Có nhiều bài toán cho ñến nay vẫn chưa tìm ra một thuật toán giải và cũng không biết là có
tồn tại thuật toán giải hay không.
Có nhiều bài toán ñã có thuật toán ñể giải nhưng không chấp nhận ñược vì thời gian giải theo
thuật toán ñó quá lớn hoặc các ñiều kiện cho thuật toán khó ñáp ứng.
Vì thế các thuật giải ñược ñưa ra ñể góp phần vào giải quyết các bài toán, mỗi thuật giải ñiều có
những ưu khuyết ñiểm riêng biệt, phù hợp, có hiệu quả tối ưu với bài toán này nhưng không tối ưu với
bài toán khác.
Từ những nhận ñịnh trên, người ta thấy rằng cần phải có những ñổi mới cho khái niệm thuật toán.
Người ta ñã mở rộng hai tiêu chuẩn của thuật toán: tính xác ñịnh và tính ñúng ñắn. Việc mở rộng tính
xác ñịnh ñối với thuật toán ñã ñược thể hiện qua các giải thuật ñệ quy và ngẫu nhiên. Tính ñúng của
thuật toán bây giờ không còn bắt buộc ñối với một số cách giải bài toán, nhất là các cách giải gần
ñúng. Trong thực tiễn có nhiều trường hợp người ta chấp nhận các cách giải thường cho kết quả tốt
(nhưng không phải lúc nào cũng tốt) nhưng ít phức tạp và hiệu quả. Chẳng hạn nếu giải một bài toán
bằng thuật toán tối ưu ñòi hỏi máy tính thực hiên nhiều năm thì chúng ta có thể sẵn lòng chấp nhận
một giải pháp gần tối ưu mà chỉ cần máy tính chạy trong vài ngày hoặc vài giờ.
Các cách giải chấp nhận ñược nhưng không hoàn toàn ñáp ứng ñầy ñủ các tiêu chuẩn của thuật
toán thường ñược gọi là các thuật giải. Khái niệm mở rộng này của thuật toán ñã mở cửa cho chúng ta
trong việc tìm kiếm phương pháp ñể giải quyết các bài toán ñược ñặt ra.
Ý tưởng thuật toán tham lam ñược biết ñến như một cách tiếp cận khá tự nhiên, gần gũi với ý nghĩ
thực tế của con người. Trong cuộc sống hằng ngày, khi bắt gặp một bài toán hay một vấn ñề, chúng ta
thường xem xét vần ñề tại thời ñiểm ñó, nhìn xem cái nào là to nhất (tức là giá trị max), hay cái nào là
bé nhất (tức là giá trị min). Vì các giá trị gần gũi và dễ phát hiện. Dựa trên các xem xét ñó thuật toán
tham lam ñược xây dựng.
Các thuật toán ứng dụng Greedy thường diễn ra, hoạt ñộng qua nhiều chặng (phase) về không gian
hay thời gian, và tại mỗi chặng chúng ta thường không biết thông tin toàn bộ dữ liệu của cả quá trình
mà chỉ biết tình trạng hiện tại và thông tin cho bước ñi kế tiếp. Ý tưởng chính của Greedy là chúng ta
không cần quan tâm tới dữ liệu tổng thể mà chỉ từ những dữ liệu tại từng chặng chọn ra giải pháp tối
ưu tại mỗi chặng ñó với hy vọng là tổng hợp những giải pháp tối ưu cục bộ sẽ mang lại một giải pháp
tối ưu cho tổng thể.
Từ ý tưởng ñó cho thấy, kết quả có ñược từ Greedy Algorithm chỉ mang tính tương ñối, thông
thường giải pháp cuối cùng không phải là tối ưu mà chỉ là gần với tối ưu. Tuy nhiên với những ñiều

2
Giải thuật tham lam

kiện, thông tin thường không mấy rỏ ràng của ñầu vào, và cách tiếp cận vấn ñề khá trong sáng của
mình, Greedy thường ñưa ra giải pháp tương ñối tốt trong giới hạn có thể chấp nhận và ñặc biệt có tốc
ñộ nhanh.
Thuật toán tham lam ñược sinh ra nhằm tìm ra một phương pháp tối ưu tạm chấp nhận ñược khi có
nhiều yêu cầu tài nguyên thực hiện một lúc .
 Các bước thực hiện:
- Tìm lựa chọn sao cho các bước tiếp theo chỉ việc giải quyết một bài toán con.
- Với sự lựa chọn Tham lam tại mỗi bước → luôn tìm ñược 1 giải pháp tối ưu.
- Với sự lựa chọn Tham lam tại mỗi bước → giải pháp tối ưu của bài toán con còn lại kết hợp
với sự lựa chọn Tham lam này sẽ ñi ñến một giải pháp tối ưu .
Với tư tưởng là lựa chọn tham lam nên ta yêu cầu của bài toán là tìm một lựa chọn sao cho việc
thực hiện các bước tiếp theo ta sẽ giải quyết duy nhất một bài toán con (mà không cần quan tâm ñến
kết quả ở các bước trước). Tiếp theo, ñi ñến các bước lựa chọn tham lam tại mỗi bước ñi, ta luôn hi
vọng rằng tại mỗi bước này ta luôn tìm ñược một giải pháp tối ưu. Giải pháp tối ưu của bài toán con
còn lại kết hợp với sự lựa chọn tham lam này sẽ ñi ñến một giải pháp tối ưu.
 Hai ñặc tính quan trọng của phương pháp Tham lam:
1. Tính lựa chọn Tham lam (Greedy Choice Property) :
Một bài toán có “tính lựa chọn Tham lam” nếu có thể tìm ñược 1 giải pháp tối ưu toàn cục
bằng cách lựa chọn tối ưu cục bộ. Tức là tại một thời ñiểm cụ thể, ta tìm ñược một lựa chọn tối ưu cục
bộ tại thời ñiểm ñó, cứ tiếp tực quá trình ñó cho ñến hết bài toán, ta kết hợp các lựa chọn tối ưu cục bộ
với mong muốn rằng ñây sẽ là giải pháp tối ưu toàn cục ta mong ñợi.Vì vậy, có thể ñây không phải là
lựa chọn tối ưu cho bài toán.
Ở từng thời ñiểm, nếu bài toán con có nhiều sự lựa chọn ,theo ý tưởng tham lam ta sẽ chọn giải
pháp tối ưu hơn giải pháp khác có thể có.
Thuật toán tham lam khác với quy hoạt ñộng. Ở tham lam, khi xét một bài toán con ta không
cần chú ý kết quả, hay các sự kiện ñã ñi qua, tức là ta chỉ lựa chọn các giải pháp tối ưu ở thời ñiểm
ñang xét. Khác với tham lam, quy hoạch ñộng luôn lưu trữ các lựa chọn trước nó ñể xét cho các lựa
chọn sau này. ðôi khi, ta thường có sự nhầm lẫn giữa tham lam và vét cạn. Nhưng thực sự, bản chất
của tham lam và vét cạn hoàn toàn khác nhau. Tham lam là chọn cái to nhất (tối ưu) tại từng bước
chọn, còn vét cạn là xét hết tất cả trường hợp có thể có của bài toán, không bỏ sót trường hợp nào.
2. Cấu trúc con tối ưu (Optimal Substructure):
Một bài toán có “cấu trúc con tối ưu” nếu giải pháp tối ưu cho bài toán này chứa các giải
pháp tối ưu cho các bài toán con của nó.
 Ví dụ:
- Bài toán tìm chu trình Hamlton có ñộ dài ngắn nhất của ñồ thị ñầy ñủ có trọng lượng là bài
toán có tính lựa chọn tham lam.
- Bài toán chọn hoạt ñộng là bài toán có cấu trúc con tối ưu.
II. Bài toán chọn hoạt ñộng:
 Bài toán: Giả sử vào ngày 10/10/2010, có 20 ban tổ chức cần chọn giảng ñường I ñể tổ chức
hoạt ñộng. Mỗi ban tổ chức gửi lên ban quản lý của nhà trường khoản thời gian hoạt
ñộng của mình (gồm thời ñiểm bắt ñầu và thời ñiểm kết thúc), với qui ước rằng mỗi
hoạt ñộng xảy ra trong suốt thời gian mình ñăng kí, tại mỗi thời ñiểm chỉ có một hoạt
ñộng diển ra. Khi hoạt ñộng này kết thúc thì hoạt ñộng kể tiếp có thể sử dụng ngay ->
3
Giải thuật tham lam

Vấn ñề ñặt ra là nhà trường phải sắp xếp lịch hoạt ñộng như thế nào ñể cho số lượng
ban tổ chức ñược tổ chức nhiều nhất.
 Tổng quát:
- Cho một tập gồm n các hoạt ñộng S = {1, 2, 3, …, n}
- Một tài nguyên chung mà tại mọi thời ñiểm chỉ ñược sử dụng bởi nhiều nhất một hoạt ñộng.
- Hoạt ñộng i có thời ñiểm bắt ñầu là si, thời ñiểm kết thúc là fi.
- Nếu hoạt ñộng i ñược chọn thì nó sẽ ñược tiến hành trong khoảng thời gian [si, fi).
Hai hoạt ñộng i và j ñược gọi là tương thích nhau (compatible) nếu [si, fi) và [sj, fj) không chạm
nhau (hai khoảng thời gian giao nhau bằng rỗng).
Bài toán chọn hoạt ñộng là tìm một tập các hoạt ñộng tương thích nhau mà có số phần tử nhiều
nhất.
 Ý tưởng Tham Lam:
Do chúng ta cần chọn sao cho tổng số hoạt ñộng là nhiều nhất nên một cách rất tự nhiên là chúng
ta sẽ chọn hoạt ñộng có thời ñiểm kết thúc sớm nhất. Sau ñó, trong số các hoạt ñộng còn lại, chúng ta
sẽ chọn tiếp hoạt ñộng tương thích với hoạt ñộng trước ñó và có thời ñiểm kết thúc sớm nhất. Cứ như
thế, chúng ta sẽ chọn ñược tập các hoạt ñộng tương thích nhiều nhất.
 Giải thuật:
Input: s=[s1, s2, s3, …, sn] và f=[f1, f2, f3, …, fn].
Trong ñó f ñã ñược sắp xếp không giảm. (f1 ≤ f2 ≤ … ≤ fn)
Output: A={tập các hoạt ñộng ñược chọn}.

ACTIVITYSELECTOR(s, f )
n ← length[s]
A ← {1}
j←1
for i ← 2 to n
do if si ≥ fj
then A ← A ∪ {i}
j←i
return A

 Ví dụ:

4
Giải thuật tham lam

2 Thaân voøng laëp for vôùi i = 2


1
3 Thaân voøng laëp for vôùi i = 3
i si fi 1
1 1 4 4 etc
2 3 5 1
5
3 0 6 1 4
4 5 7 6
5 3 8 1 4
7
6 5 9 1 4
7 6 10 8
8 8 11 1 4
9
9 8 12 1 4 8
10 2 13 10
11 12 14 1 4 8
11
1 4 8

1 4 8 11
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 thôøi gian

- chọn hoạt ñộng 1 => A={1}


- hoạt ñộng 2, 3 không thỏa, hoạt ñộng 4 thỏa => A={1, 4}
- hoạt ñộng 5, 6, 7 khồng thỏa, hoạt ñộng 8 thỏa => A={1, 4, 8}
- hoạt ñộng 9, 10 không thỏa, hoạt ñộng 11 thỏa => A={1, 4, 8, 11}
- => Tập hoạt ñộng ñược chọn là A={1, 4, 8, 11}.

5
Giải thuật tham lam

 Nhận xét:
Vòng for chạy từ 2 ñến n (n-1 lần) => cần n-1 phép so sánh.
Số phép gán vào A (thêm phần tử vào A):
Ít nhất: 1 (trường hợp các hoạt ñộng có cùng thời ñiểm kết thúc).
Nhiều nhất: n (trương hợp các hoạt ñộng ñôi một tương thích nhau).
ðộ phức tạp: O(n).

Giải thuật Greedy cho lời giải tối ưu trong bài toán chọn hoạt ñộng:
Chứng minh:
Gọi S={1, 2, .., n} là tập các hoạt ñộng. Các hoạt ñộng ñã ñược xếp thứ tự theo thời ñiểm kết
thúc. Do ñó, hoạt ñộng 1 có thời ñiểm kết thúc sớm nhất.
Ta chứng minh trong các lời giải tối ưu, tồn tại một lời giải ñược chọn bởi giải thuật Greedy.
Giải sử A ⊆ S là một lời giải tối ưu, ta sắp các hoạt ñộng trong A theo thời ñiểm kết thúc. Giả
sử k là hoạt ñộng ñầu tiên trong A.
Nếu k=1 thì xong. Nếu k ≠ 1, xét B=A - {k} ∪ {1} (tức là thay k bởi 1). Vì f1 ≤ fk, nên B
cũng là một lời giải tối ưu.
Nếu A là một lời giải tối ưu chứa hoạt ñộng 1 cho bài toán nguyên thủy S, thì A’= A – {1} là
một lời giải tối ưu cho bài toán con S’ ={i ∈ S: si ≥ f1}.
Nếu B là một lời giải tối ưu cho S’ thì B ∪ {1} là một lời giải tối ưu cho S.
Lặp (thêm chọn lựa Greedy cho bài toán con vào lời giải ñang xây dựng) cho ñến khi bài toán
con là tập rỗng!.

III. Bài toán chu trình Hamilton:


 ðặt vấn ñề:
Xuất phát từ nhu cầu thực tế, một người muốn ñi du lịch qua n quốc gia. Người này xuất phát
từ một quốc gia bất kỳ nào ñó, ñi qua tất cả n quốc gia, sao cho mỗi quốc gia chỉ ñược ñi qua một lần.
Kết thúc chuyến ñi, vị khách này quay lại quốc gia ban ñầu. Với giả thiết ñặt ra là mỗi quốc gia ñều có
ñường ñi qua các quốc gia còn lại.
Yêu cầu của bài toán ñặt ra là tìm một phương án ñể người khách du lịch ñi hết n quốc gia với
chi phí thấp nhất. Ở ñây, chúng ta có thể hiểu chi phí thấp nhất một cách tương ñối, có nghĩa là về một
mặt nào ñó la thấp nhất. Ví dụ, chi phí thấp nhất có thể là cước vận chuyển, khoảng cách giữa các
quốc gia, thời gian di chuyển từ quốc gia này sang quốc gia khác,…
Trong bài toán của chúng tôi, chúng tôi ñịnh nghĩa chi phí thấp nhất là khoảng cách giữa hai
quốc gia.
 Hướng giải quyết:
ðầu tiên, chúng ta ñịnh nghĩa một ñồ thị, với mỗi quốc gia là một ñỉnh của ñồ thị này. Khoảng
cách giữa hai quốc gia là trọng lượng tương ứng của cạnh ñó.
Yêu cầu của bài toán: tìm một chu trình Hamilton nhỏ nhất cho ñồ thị trên.

6
Giải thuật tham lam

 Giải thuật:
- Bước 1: Sắp xếp các cạnh theo thứ tự không giảm của trọng lượng.

- Bước 2: Xét các cạnh theo thứ tự từ nhỏ ñến lớn ñể ñưa vào chu trình.

- Bước 3: Xét ñiều kiện ñể ñưa một cạnh vào chu trình:

• Không tạo chu trình thiếu.

• Không tạo ñỉnh có bậc lớn hơn hoặc bằng 3.

- Bước 4: Lặp lại bước 3 cho ñến khi có chu trình ñủ.

 Ví dụ minh họa:
Xét bài toán người du lịch qua 5 quốc gia, tương ứng với 5 ñỉnh của ñồ thị ( các ñỉnh 0, 1, 2, 3,
4 ) ( Hình 1 ).

Hình 1: ñồ thị 5 ñỉnh và ma trận trọng số tương ứng, các cạnh sau khi ñược sắp xếp theo thứ
tự tăng dần của trọng số.

Các bước thực hiện (Hình 2):


- Sắp xếp các cạnh theo thứ tự tăng dần của trọng số (Hình 1).

- Ta khởi tạo 5 ñỉnh của ñồ thị theo thứ tự 0, 1, 2, 3, 4.

- Xét cạnh có trọng lượng nhỏ nhất (0,1), cạnh (0,1) không tạo chu trình, không tạo ñỉnh có
bậc ≥ 3 . Ta ñưa cạnh (0,1) vào chu trình.

7
Giải thuật tham lam

- Tiếp theo cạnh (0, 2), không tạo chu trình, không tạo ñỉnh bậc ≥ 3 ,cạnh (0, 2) thỏa ñiều
kiện ta ñưa vào chu trình.

- Theo thứ tự sắp xếp, ta xét cạnh (0, 4), khi ñưa vào chu trình, nó không tạo chu trình thiếu,
nhưng tạo ñỉnh bậc 3 tại ñỉnh 0. Vậy cạnh (0, 4) không thỏa 2 ñiều kiện dể ñưa vào chu
trình, ta bỏ cạnh (0, 4).

- Tương tự ta kiểm tra ñiều kiện cho các cạnh còn lại, ta sẽ có các cạnh (2, 3), (1, 4), (3, 4)
thỏa ñiều kiện ñể ñưa vào chu trình.

Vậy các cạnh ñược chọn là: (0, 1) -> (0, 2) -> (2, 3) -> (1, 4) -> (3, 4).
Ta có chu trình Hamilton cho ñồ thị 5 ñỉnh này với ñỉnh xuất phát là ñỉnh 0:
0 -> 1 -> 4 -> 3 -> 2 -> 0.
ðộ dài ñường ñi là: 1 + 2 + 3 + 1 + 1 = 8.

8
Giải thuật tham lam

Hình 2: Các bước thực hiện bài toán Người du lịch qua 5 quốc gia.

 Nhận xét:
Không phải lúc nào sử dụng giải thuật Greedy cho các bải toán ñều cho lời giải tối ưu.
Chẳng hạn, với bài toán người du lịch, mà trọng số như hình sau ñây (Hinh 3) thì sử dụng giải
thuật Greedy không cho lời giải tối ưu.

Hình 3: ví dụ chứng minh giải thuật Greedy không phải lúc nào cũng cho lời giải tối ưu.

ðộ phức tạp:
ðồ thị n ñỉnh sẽ có n.(n-1) cạnh.

9
Giải thuật tham lam

Số phép gán một cạnh vào chu trình là n vì chu trình ñầy ñủ có n cạnh => số phép gán ∈ O (n) .
Vòng lặp ñể duyệt các cạnh của ñồ thị thỏa ñiều kiện gồm n.(n-1) cạnh, khi chu trình ñủ n cạnh
thì thoát vòng lặp. Trường hợp xấu nhất là duyệt hết các cạnh nên ñộ phức tạp trong trường hợp xấu
nhất ∈ O (n 2 ) .

Vậy, thuật toán trên xác ñịnh chu trình Hamilton có trọng số nhỏ nhất có ñộ phức tạp là O (n 2 ) .

 Một số bài toán khác:


Ngoài 2 bài toán kể trên (Chọn hoạt ñộng, người du lịch) thì ta có thể sử dụng giải thuật
Greedy ñể giải các bài toán khác, ví dụ như:
- Thuật toán Kruskal .
- Thuật toán Prim.
- Thuật toán Dijkstra.
- Thuật toán tìm cây Huffman tối ưu.
- Bài toán tô màu ñồ thị.
- …

IV. Ưu – khuyết ñiểm:


• Ưu ñiểm:
Giải thuật tham lam xuất phát từ ý tưởng rất tự nhiên của con người nên rất dễ hiểu, dễ tiếp cận.
ðồng thời dễ dàng cài ñặt trong máy tính.
Ít sử dụng tài nguyên máy tính vì các bước của giải thuật không cần lưu lại giá trị cho sử tổng
hợp sau này, mà chỉ tính toán tại bước ñó.
Thực thi nhanh.

• Khuyết ñiểm:
Do giải thuật tham lam quyết ñịnh lời giải cho bài toán quá sớm nên trong một số trường hợp
không cho lời giải tối ưu như mong muốn.
ðể tìm lời giải tối ưu cho một bài toán, ñôi khi chúng ta phải kết hợp nhiều giải thuật với nhau.

--- Hết ---

10
Giải thuật tham lam

11

You might also like