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ốilượ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ượngtố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ị caonhất trong khả năng mà hắn có thể mang đi được.
Trang 1TRƯỜ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
Trang 2Mục lục
Mục lục 2
Giới thiệu : 3
Chương I : Bài toán cái túi 4
1.1Giới thiệu 4
1.2Bài toán cái túi dạng 0-1 4
1.3Bà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
Trang 3Giớ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
Trang 4Chươ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
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
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.
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
Trang 5Trườ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
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 là lời giải đạt
Trang 6• Đị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 :
•
•
•
•
Độ phức tạp:
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
•
•
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
Giao diện nhập số liêu
Trang 7Kế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.
4.1 Mô tả:
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
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à
Trang 8♣ 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
Trang 9Tà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