You are on page 1of 6

THUẬT TOÁN THAM LAM (THAM ĂN)

1. Tham ăn (Greedy Method)


Phương pháp nhánh cận là cải tiến phương pháp quy lui, đã đánh giá được các
nghiệm mở rộng để loại bỏ đi những phương án không cần thiết, giúp cho việc tìm
nghiệm tối ưu nhanh hơn. Tuy nhiên, không phải lúc nào chúng ta cũng có thể đánh
giá được nghiệm mở rộng, hoặc nếu có đánh giá được thì số phương án cần xét vẫn
rất lớn, không thể đáp ứng được trong thời gian cho phép. Khi đó, người ta chấp nhận
tìm những nghiệm gần đúng so với nghiệm tối ưu. Phương pháp tham ăn được sử
dụng trong các trường hợp như vậy. Ưu điểm nổi bật của phương pháp tham ăn là độ
phức tạp nhỏ, thường nhanh chóng tìm được lời giải. Phương pháp
Giả sử nghiệm của bài toán có thể biểu diễn dưới dạng một vector (x1, x2,…, xn),
mỗi thành phần xi (i = 1,2, . . ,n) được chọn ra từ tập Si. Mỗi nghiệm của bài toán X=
(x1, x2,…, xn) được xác định “độ tốt” bằng một hàm f(x) và mục tiêu cần tìm nghiệm
có giá trị f(x) càng lớn càng tốt (hoặc càng nhỏ càng tốt).
Tư tưởng của phương pháp tham ăn như sau: Ta xây dựng vector nghiệm X dần từng
bước, bắt đầu từ vector không ( ). Giả sử đã xây dựng được (k-1) thành phần (x 1 , x
2 , …x k - 1 ) của nghiệm và khi mở rộng nghiệm ta sẽ chọn “tốt nhất” trong các ứng
cử viên trong tập Si để được (x 1 , x 2 , …x k ). Việc lựa chọn như thế được thực hiện
bởi một hàm chọn. Cứ tiếp tục xây dựng, cho đến khi xây dựng xong hết thành phần
của nghiệm.
Lược đồ tổng quát của phương pháp tham ăn.
procedure Greedy; begin
X:= ; i:=0;
while (chưa xây dựng xong hết thành phần của nghiệm)
do begin i:=i+1;
<Xác định Si>; x select(Si);// chọn ứng cử viên tốt nhất trong tập Si
end;
end;

Trong lược đồ tổng quát trên, Select là hàm chọn, để chọn ra từ tập các ứng cử viên
Si một ứng cử viên được xem là tốt nhất, nhiều hứa hẹn nhất.
Cần nhấn mạnh rằng, thuật toán tham ăn trong một số bài toán, nếu xây dựng được
hàm thích hợp có thể cho nghiệm tối ưu. Trong nhiều bài toán, thuật toán tham ăn chỉ
tìm được nghiệm gần đúng với nghiệm tối ưu.

1
Bài 1. Bài toán người du lịch
Cho n thành phố đánh số từ 1 đến n và m tuyến đường giao thông hai chiều giữa
chúng, mạng lưới giao thông này được cho bởi bảng C cấp n x n, ở đây Cij = Cji = Chi
phí đi đoạn đường trực tiếp từ thành phố i đến thành phố j. Giả thiết rằng C ii = 0 với
mọi i, Cij = +∞ nếu không có đường trực tiếp từ thành phố i đến thành phố j.
Một người du lịch xuất phát từ thành phố 1, muốn đi thăm tất cả các thành phố
còn lại mỗi thành phố đúng 1 lần và cuối cùng quay lại thành phố 1. Hãy chỉ ra cho
người đó hành trình với chi phí ít nhất.
Input: file văn bản TOURISM.INP
- Dòng 1: Chứa số thành phố n và số tuyến đường m trong mạng lưới giao thông. -
m dòng tiếp theo, mỗi dòng ghi số hiệu hai thành phố có đường đi trực tiếp và chi
phí đi trên quãng đường đó (chi phí này là số nguyên dương).
Output: file văn bản TOURISM.OUT -
Dòng đầu tiên ghi hành trình.
- Dòng thứ 2 ghi chi phí tìm được.
Ví dụ:

TOURISM.INP TOURISM.OUT

1->3->2->4->1
46 6
123
132
1 41
2 31
2 42
3 44

2
Bài 2. Bài toán cái túi (xếp va li, xếp ba lô)
Có N loại vật (mặt hàng), số lượng của mỗi loại là không hạn chế, với mỗi vật ta biết
trọng lượng và giá trị của nó. Hãy xác định các vật cần để xếp vào một ba lô có sức
chứa tối đa là M sao cho giá trị chứa trong ba lô là lớn nhất. Dữ liệu vào: Tệp văn bản
balo.inp:
- Dòng đầu tiên: hai giá trị nguyên dương N và M.
- N dòng tiếp theo, mỗi dòng chứa hai giá trị nguyên dương d v cho mỗi vật, trong
đó d là trọng lượng, v là giá trị tính theo một đơn vị trọng lượng của vật đó (đơn
giá). Các số cách nhau qua dấu cách. Dữ liệu ra: Tệp văn bản tên balo.out:
- Dòng đầu tiên ghi giá trị đạt được
- Các dòng tiếp theo, mỗi dòng ghi số thứ tự vật cần lấy và số lần lấy
Ví dụ:

Balo.inp Balo.out
32.00 4 4
5 14
31
35
42
24
37
51

3
Bài 3. Bài toán rút tiền tự động ATM 2
Một máy ATM hiện có n tờ tiền có mệnh giá t1, t2, t3,…., tn. Hãy đưa ra cách trả
tiền đúng bằng s, sao cho cần ít tờ tiền nhất.
Input: Tệp ATM.INP có dạng:
- Dòng đầu là hai số n và s.
- Dòng thứ hai gồm n số t1, t2, t3,…., tn
Output: Tệp ATM.OUT có dạng: Nếu có thể trả đúng s thì đưa ra cách trả, dòng đầu
tiên ghi số tờ, dòng tiếp theo ghi mệnh giá các đồng tiền cần trả. Nếu không ghi -
1.
Ví dụ:

ATM.INP ATM.OUT

11 490 200 20 20 50 100 100


20 200 10 20 20 50 50 50 50 100 100

4
Bài 4. Băng nhạc
Người ta cần ghi N bài hát, được mã số từ 1 đến N, vào một băng nhạc có thời lượng
tính theo phút đủ chứa toàn bộ các bài đã cho. Với mỗi bài hát ta biết thời lượng phát
của bài đó. Băng sẽ được lắp vào một máy phát nhạc đặt trong một siêu thị. Khách
hàng muốn nghe bài hát nào chỉ việc nhấn phím ứng với bài đó. Để tìm và phát bài
thứ i trên băng, máy xuất phát từ đầu cuộn băng, quay băng để bỏ qua i – 1 bài ghi
trước bài đó. Thời gian quay băng bỏ qua mỗi bài và thời gian phát bài đó được tính
là như nhau. Tính trung bình, các bài hát trong một ngày được khách hàng lựa chọn
với số lần (tần suất) như nhau. Hãy tìm cách ghi các bài trên băng sao cho tổng thời
gian quay băng trong mỗi ngày là ít nhất.
Dữ liệu vào được ghi trong tệp văn bản tên BANGNHAC.INP.
- Dòng đầu tiên là số tự nhiên N cho biết số lượng bài hát.
- Tiếp đến là N số nguyên dương thể hiện dung lượng tính theo phút của mỗi
bài. Mỗi đơn vị dữ liệu cách nhau qua dấu cách.
Dữ liệu ra được ghi với tên BANGNHAC.OUT theo dạng thức sau:
- N dòng đầu tiên thể hiện trật tự ghi bài hát trên băng: mỗi dòng gồm hai số
nguyên dương j và d cách nhau bởi dấu cách, trong đó j là mã số của bài hát
cần ghi, d là thời gian tìm và phát bài đó theo trật tự ghi này.
- Dòng thứ n + 1 ghi tổng số thời gian quay băng nếu mỗi bài hát được phát
một lần trong ngày.
Ví dụ:
BANGNHAC.INP BANGNHAC.OUT
3 22
723 35
1 12
19

5
Bài 5. Xếp việc
Có N công việc cần thực hiện trên một máy tính, mỗi việc đòi hỏi đúng 1 giờ máy.
Với mỗi việc ta biết thời hạn phải nộp kết quả thực hiện sau khi hoàn thành việc đó
và tiền thưởng thu được nếu nộp kết quả trước hoặc đúng thời điểm quy định. Chỉ có
một máy tính trong tay, hãy lập lịch thực hiện đủ N công việc trên máy tính sao cho
tổng số tiền thưởng thu được là lớn nhất và thời gian hoạt động của máy là nhỏ nhất.
Giả thiết rằng máy được khởi động vào đầu ca, thời điểm t = 0 và chỉ tắt máy sau khi
đã hoàn thành đủ N công việc.
Dữ liệu vào: tệp văn bản viec.inp:
- Dòng đầu tiên là số N.
- N dòng tiếp theo: mỗi việc được mô tả bằng hai số tự nhiên, số thứ nhất là
thời hạn giao nộp, số thứ hai là tiền thưởng. Các số cách nhau bởi dấu cách.
Dữ liệu ra: tệp văn bản viec.out:
- N dòng đầu tiên, dòng thứ t ghi một số tự nhiên i cho biết việc thứ i được làm
trong giờ t.
- Dòng cuối cùng ghi tổng số tiền thu được.
Thí dụ:

viec.inp viec.out

4 4
1 15 2
3 10 3
5 100 1
1 27 137

You might also like