Mô tả:
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
Viện Công nghệ Thông tin và Truyền thông
BÀI TẬP LỚN MÔN HỌC
THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN
Đề tài:
BÀI TOÁN CÁI TÚI
Học viên thực hiện:
1. Đào Duy Thành. SHHV:20082364
Mã lớp: 29106
Giáo viên hướng dẫn: PGS Nguyễn Đức
Nghĩa
HÀ NỘI – 2011
1
Mục lục
Giới thiệu :.....................................................................................................................3
Chương I : Bài toán cái túi............................................................................................4
1.1
Giới thiệu..........................................................................................................4
1.2
Bài toán cái túi dạng 0-1...................................................................................4
1.3
Bài toán cái túi dạng phân số............................................................................5
Chương 2: Giải bài toán cái túi bằng thuật toán trực tiếp (Brute-force).......................5
Chương 3: Giải bài toán cái túi bằng thuật toán tham lam............................................5
3.1 Greedy 1...............................................................................................................5
3.2 Greedy 2...............................................................................................................5
3.3 Greedy 3...............................................................................................................5
3.4 Greedy 4...............................................................................................................5
3.5 Thực hiện bài toán cái túi theo Greedy 3 bằng C++............................................6
Chương IV: Giải bài toán cái túi bằng thuật toán quy hoạch động...............................7
4.1 Mô tả:...................................................................................................................7
4.2 Nhận xét:..............................................................................................................8
Tài liệu tham khảo chính:..............................................................................................9
2
Giới thiệu :
Báo cáo này sẽ trình bày về các thuật toán giải quyết bài toán cái túi. Trong đó
có sử dụng 2 giải thuật là: giải thuật tham lam (Greedy) và Quy hoạch động
(Dynamic progaming). Từ đó đưa ra các đánh giá về độ phức tạp của thuật toán và
lựa chọn phương án tối ưu.
Xin chân thành cám ơn thầy Nguyễn Đức Nghĩa đã giúp đỡ em thực hiện bài
toán này
Hà Nội tháng 12 năm 2011
3
Chương I : Bài toán cái túi
1.1 Giới thiệu.
Bài toán cái túi (hay còn gọi là bài toán xếp ba lô) là một bài toán tối ưu tổ hợp.
Bài toán được đặt tên từ vấn đề chọn những gì quan trong có thể nhét vừa vào một cái
túi (với giới hạn khối lượng) để mang theo trong một chuyến đi.
Nội dung bài toán như sau: Một kẻ trộm đột nhập vào một cửa hiệu tìm thấy có
n mặt hàng có trọng lượng và giá trị khác nhau, nhưng hắn chỉ mang theo một cái túi
có sức chứa về trọng lượng tối đa là M. Vậy kẻ trộm nên bỏ vào túi những món nào
và số lượng bao nhiêu để đạt giá trị cao nhất trong khả năng mà hắn có thể mang đi
được.
Ví dụ về bài toán cái túi trong giới hạn một chiều: chọn các hộp nào để làm cho
giá trị tiền là cực trại khi tổng trọng lượng không vượt quá 15kg? Bài toán đa chiều
có thể xét đến khối lượng riêng và kích thước của hộp, đó là bài toán xếp vali điển
hình(packing problem)
Ta có n loại đồ vật, từ 1 tới n. Mỗi đồ vật thứ i có trọng lượng w[i] và giá trị v[i].
Trọng lượng tối đa mà túi có thể mang được là S.
1.2 Bài toán cái túi dạng 0-1.
Hạn chế số đồ vật thuộc mỗi loại là 0 (không được chọn ) và 1 (được chọn).
Bài toán cái túi có thể được phát biểu bằng toán học như sau:
Cực đại hóa
Sao cho
với
hoặc 1
Bài toán cái túi bị chặn hạn chế số đồ vật huộc mỗi loại nào đó không được vượt
quá một lượng nào đó.
Có thể được phát biểu bằng toán học như sau
Cực đại hóa
Sao cho
với
Bài cái túi không bị chặn không có một hạn chế nào về số lượng đồ vật mỗi loại.
4
Một trường hợp đặc biệt của bài toán này nhận được nhiều quan tâm, đó là bài toán
với các tính chất:
là một bài toán quyết định
là một bài toán 0/1
với mỗi đồ vật, chi phí bằng giá trị: C = V
Trường hợp đặc biệt này được gọi là bài toán tổng các tập con (subset sum
problem). Với một số lý do, trong ngành mật mã học, người ta thường dùng cụm từ
"bài toán cái túi khi thực ra đang có ý nói về "bài toán tổng con".
Bài toán cái túi thường được giải bằng quy hoạch động, tuy chưa có một thuật
toán thời gian đa thức cho bài toán tổng quát. Cả bài cái túitổng quát và bài toán tổng
con đều là các bài NP-khó, và điều này dẫn đến các cố gắng sử dụng tổng con làm cơ
sở cho các hệ thống mật mã hóa khóa công khai, chẳng hạn Merkle-Hellman. Các cố
gắng này thường dùng nhóm thay vì các số nguyên. Merkle-Hellman và một số thuật
toán tương tự khác đã bị phá, do các bài toán tổng con cụ thể mà họ tạo ra thực ra lại
giải được bằng các thuật toán thời gian đa thức.
Phiên bản bài toán quyết định của bài toán cái túi được mô tả ở trên là NP-đầy
đủ và trong thực tế là một trong 21 bài toán NP-đầy đủ của Karp.
1.3 Bài toán cái túi dạng phân số
Với mỗi loại, có thể chọn một phần của nó (ví dụ: 1Kg bơ có thể được cắt ra
thành nhiều phần để bỏ vào ba lô)
Chương 2: Giải bài toán cái túi bằng thuật toán trực tiếp (Brute-force)
Phương pháp này duyệt tất cả khả năng chất đồ vào túi, tìm cách chất có
tổng giá trị lớn nhất trong số các cách chất co tổng trọng lượng các đồ vật không quá
dung lượng của túi
Tuy nhiên, phương pháp này ít được sử dụng do có độ phức tạp O (n2)
Chương 3: Giải bài toán cái túi bằng thuật toán tham lam
3.1 Greedy 1
Giải thuật: sắp xếp các đồ vật theo thứ tự không tăng của giá trị.
Lần lượt xét các đồ vật theo thứ tự đã sắp , và chất đồ đang xét vào túi nếu như
dung lượng còn lại của cái túi đó đủ chứa nó (tức là tổng trọng lượng của các
đồ vật đã xếp vào túi và trọng lượng của các đồ vật đang xét không vượt quá
khả năng của túi).
Tuy nhiên, phương pháp này chưa cho lời giải chính xác
3.2 Greedy 2
Sắp xếp các đồ vật theo thứ tự không giảm của trọng lượng
5
Lần lượt xét các đồ vật theo thứ tự đã sắp , và chất đồ đang xét vào túi nếu như
dung lượng còn lại của cái túi đủ chứa nó (tức là tổng trọng lượng của các đồ
vật đã xếp vào túi và trọng lượng của các đồ vật đang xét không vượt quá dung
lượng của túi).
Tương tự Greedy 1, phương pháp này chưa mang lại được độ chính xác cần thiết
3.3 Greedy 3
Sắp xếp các đồ vật theo thứ tự không tăng của giá trị một đơn vị trọng lượng (
)
Lần lượt xét các đồ vật theo thứ tự đã sắp, và chất đồ vật đang xét vào túi nếu
như dung lượng còn lại của cái túi đủ chứa nó
3.4 Greedy 4
Gọi là lời giải thu được theo thuật toán Greedy j , j=1;2;3 Gọi
giải đạt
là lời
Định lý: Lời giải thỏa mãn đẳng thức
3.5 Thực hiện bài toán cái túi theo Greedy 3 bằng C++
Các hàm được sử dụng :
swap (x,y) được dùng để đổi chỗ biến x và y khi sắp xếp
nhap() dùng để nhập dữ liệu từ bàn phím
sapxep() được dùng để sắp xếp lại mảng theo thứ tự giảm dần của tỉ lệ
v[i]/w[i] , tức là tỉ lệ giảm dần của giá trị trên khối lượng mỗi đồ vật
thamlam() lần lượt trọn các đồ vật đã được sắp xếp theo thứ tự giảm dần
của giá trị trên khối lượng, biến kỉ lục ghi nhận kết quả tốt nhất khi thực
hiện
Độ phức tạp:
Nếu sử dụng sắp xếp đơn giản (chèn, nổi bọt…) thì độ phức tạp của cả bài toán
là O(n2)
Nếu sử dụng quick sort hoặc merge sort thì độ phức tạp là O(nlogn) tốt hơn so
với giải trực tiếp
6
Giao diện nhập số liêu
Kết quả thu được
Chương IV: Giải bài toán cái túi bằng thuật toán quy hoạch động.
7
4.1 Mô tả:
Với mỗi
và
, xét bài toán
. Tính
là
tổng giá trị lớn nhất của các đồ vật được chọn trong số k đồ vật đầu tiên
và có tổng trọng lượng không quá S.
Có tất cả
bài toán. Bài toán cần giải là
Giá trị tối ưu cần tìm là
Với k=1 ta có
o
o
Gỉa sử tính được
với mọi
và
. Khi đó, để
tính
ta có thể lập luận như sau
o Nếu
thì đồ vật thứ k không thể chất vào túi, do đó cách
chất tối ưu chỉ có thể sử dụng k-1 đồ vật trước đó và có giá trị là
o Nếu
thì cách chất tối ưu cần lựa chọn trong 2 cách chất
sau
Không chất đồ vật k vào túi, khi đó giá trị của cách chất tối
ưu sẽ là
Chất đồ vật hứ k vào túi, khi đó trọng lượng còn lại sẽ
được chất tối ưu từ
đồ vật đầu tiên với giá trị tối ưu sẽ
là
o Từ đó ta có công thức đệ quy
4.2 Nhận xét:
Thuật toán giải bài toán cái túi có thời gian đánh giá là O(nL). Thời gian này
phụ thuộc tuyến tính vào dữ liệu vào L, nhưng nếu xét nó như là hàm của độ dài dữ
liệu vào
, thì sự phụ thuộc này lại là hàm mũ.Trên thực tế,thuật toán này
làm việc hiệu quả khi L không là quá lớn
8
9
Tài liệu tham khảo chính:
1. Nguyễn Đức Nghĩa. Bài giảng Thiết kế và phân tích thuật toán. ĐHBK Hà nội,
2010.
2. Wikipedia.org và các nguồn khác từ internet
10
- Xem thêm -