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
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 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 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. 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 4 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 (n 2 ) 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 5 • Đị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(n 2 ) • 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 6 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. 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à 7 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 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 9