Bài toán ba lô
Chia sẻ bởi Nguyễn Thanh Giang |
Ngày 14/10/2018 |
36
Chia sẻ tài liệu: bài toán ba lô thuộc Tư liệu tham khảo
Nội dung tài liệu:
Bài toán xếp ba lô
Bài toán xếp ba lô là một bài toán tối ưu hóa tổ hợp. Bài toán được đặt tên từ vấn đề chọn những gì quan trọng có thể nhét vừa vào trong một cái túi (với giới hạn khối lượng) để mang theo trong một chuyến đi. Các bài toán tương tự thường xuất hiện trong kinh doanh, toán tổ hợp, lý thuyết độ phức tạp tính toán, mật mã học và toán ứng dụng.
Nội dung bài toán: Cho trước một tập các đồ vật, mỗi đồ vật có một chi phí và một giá trị, xác định số lượng mỗi loại đồ vật cần chọn sao cho tổng chi phí nhỏ hơn một ngưỡng cho trước và tổng giá trị cao nhất có thể được.
Dạng bài toán quyết định của bài toán xếp ba lô là câu hỏi "có thể đạt được một giá trị ít nhất bằng V mà không vượt ngưỡng chi phí C hay không?"
Mục lục
[giấu]
1 Phát biểu bài toán
2 Cách giải bằng quy hoạch động
3 Thuật toán ăn tham
4 Tham khảo
[sửa] Phát biểu bài toán
Ta có n loại đồ vật, x1 tới xn. Mỗi đồ vật xj có một giá trị pj và một khối lượng wj. Khối lượng tối đa mà ta có thể mang trong ba lô là C.
Bài xếp ba lô 0-1 hạn chế số đồ vật thuộc mỗi loại là 0 hoặc 1.
Bài xếp ba lô 0-1 có thể được phát biểu bằng toán học như sau:
Cực đại hóa
sao cho
Bài xếp ba lô bị chặn hạn chế số đồ vật thuộc mỗi loại không được vượt quá một lượng nào đó.
Bài xếp ba lô bị chặn có thể được phát biểu bằng toán học như sau:
Cực đại hóa
sao chp
Bài xếp ba lô 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
Lưu ý rằng trong trường hợp đặc biệt này, bài toán tương đương với:
Cho một tập các số nguyên, tồn tại hay không một tập con có tổng đúng bằng C?
Hoặc nếu đồ vật được phép có chi phí âm và C được chọn bằng 0, bài toán có dạng:
Cho trước một tập các số nguyên, tồn tại hay không một tập con có tổng đúng bằng 0?
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 xếp ba lô" khi thực ra đang có ý nói về "bài toán tổng con".
Bài toán xếp ba lô 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 xếp ba lô tổ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 xếp ba lô đượ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.
[sửa] Cách giải bằng quy hoạch động
Bài toán xếp ba lô có thể được giải trong thời gian giả-đa thức bằng quy hoạch động. Dưới đây là lời giải quy hoạch động cho bài toán xếp ba lô không bị chặn.
Gọi các chi phí là c1, ..., cn và các giá trị tương ứng là v1, ..., vn. Ta cần cực đại hóa tổng chi phí với điều kiện tổng chi phí không vượt quá C. Khi đó, với mỗi i ≤ C, đặt A(i) là giá trị lớn nhất có thể đạt được với tổng chi phí không vượt quá i. Rõ ràng, A(C) là đáp số của bài toán.
Định nghĩa A(i) một cách đệ quy như sau:
A(0) = 0
A(i) = max { vj + A(i − cj) | cj ≤ i }
Ở đây, giá trị lớn nhất của tập rỗng được lấy bằng 0. Tính dần các kết quả từ A(0) tới A(C), ta sẽ được lời giải. Do việc tính mỗi A(i) đòi hỏi xem xét n đồ vật (tất cả các giá trị này đã được tính từ trước), và có C giá trị của các A(i) cần tính, nên thời gian chạy của lời giải quy hoạch động là O(nC).
Điều này không mâu thuẫn với thực tế rằng bài toán xếp ba lô là NP-đầy đủ, do C, không như n, không thuộc mức đa thức theo độ dài của đầu vào cho bài toán. Độ dài đầu vào bài toán tỉ lệ thuật với số bit trong C, chứ không tỉ lệ với chính C.
Một giải pháp quy hoạch động tương tự cho bài toán xếp ba lô 0-1 cũng chạy trong thời gian giả-đa thức. Cũng như trên, gọi các chi phí là c1, ..., cn và các giá trị tương ứng là v1, ..., vn. Ta cần cực đại hóa tổng giá trị với điều kiện tổng chi phí không vượt quá C. Định nghĩa một hàm đệ quy A(i, j) là giá trị lớn nhất có thể đạt được với chi phí không vượt quá j và sử dụng các đồ vật trong khoảng từ x1 tới xi.
A(i,j) được định nghĩa đệ quy như sau:
A(0, j) = 0
A(i, 0) = 0
A(i, j) = A(i - 1, j) if ci > j
A(i, j) = max(A(i - 1, j), vi + A(i - 1, j - ci)) if ci ≤ j
Để có lời giải, ta tính A(n, C). Để làm điều này, ta có thể dùng 1 bảng để lưu các tính toán trước đó. Cách giải này do đó sẽ chạy trong thời gian O(nC) và không gian O(nC), tuy ta có thể giảm độ phức tạp không gian xuống O(C) bằng một số sửa đổi nhỏ.
[sửa] Thuật toán ăn tham
Martello và Toth (1990) đã đưa ra một thuật toán gần đúng kiểu ăn tham (greedy approximation algorithm) để giải bài toán xếp ba lô. Giải thuật này sắp xếp các đồ vật theo thứ tự giảm dần về giá trị, sau đó theo thứ tự đó xếp các đồ vật vào ba lô cho đến khi không cho thêm được đồ vật nào vào nữa.
[sửa] Tham khảo
Bài toán xếp ba lô là một bài toán tối ưu hóa tổ hợp. Bài toán được đặt tên từ vấn đề chọn những gì quan trọng có thể nhét vừa vào trong một cái túi (với giới hạn khối lượng) để mang theo trong một chuyến đi. Các bài toán tương tự thường xuất hiện trong kinh doanh, toán tổ hợp, lý thuyết độ phức tạp tính toán, mật mã học và toán ứng dụng.
Nội dung bài toán: Cho trước một tập các đồ vật, mỗi đồ vật có một chi phí và một giá trị, xác định số lượng mỗi loại đồ vật cần chọn sao cho tổng chi phí nhỏ hơn một ngưỡng cho trước và tổng giá trị cao nhất có thể được.
Dạng bài toán quyết định của bài toán xếp ba lô là câu hỏi "có thể đạt được một giá trị ít nhất bằng V mà không vượt ngưỡng chi phí C hay không?"
Mục lục
[giấu]
1 Phát biểu bài toán
2 Cách giải bằng quy hoạch động
3 Thuật toán ăn tham
4 Tham khảo
[sửa] Phát biểu bài toán
Ta có n loại đồ vật, x1 tới xn. Mỗi đồ vật xj có một giá trị pj và một khối lượng wj. Khối lượng tối đa mà ta có thể mang trong ba lô là C.
Bài xếp ba lô 0-1 hạn chế số đồ vật thuộc mỗi loại là 0 hoặc 1.
Bài xếp ba lô 0-1 có thể được phát biểu bằng toán học như sau:
Cực đại hóa
sao cho
Bài xếp ba lô bị chặn hạn chế số đồ vật thuộc mỗi loại không được vượt quá một lượng nào đó.
Bài xếp ba lô bị chặn có thể được phát biểu bằng toán học như sau:
Cực đại hóa
sao chp
Bài xếp ba lô 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
Lưu ý rằng trong trường hợp đặc biệt này, bài toán tương đương với:
Cho một tập các số nguyên, tồn tại hay không một tập con có tổng đúng bằng C?
Hoặc nếu đồ vật được phép có chi phí âm và C được chọn bằng 0, bài toán có dạng:
Cho trước một tập các số nguyên, tồn tại hay không một tập con có tổng đúng bằng 0?
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 xếp ba lô" khi thực ra đang có ý nói về "bài toán tổng con".
Bài toán xếp ba lô 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 xếp ba lô tổ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 xếp ba lô đượ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.
[sửa] Cách giải bằng quy hoạch động
Bài toán xếp ba lô có thể được giải trong thời gian giả-đa thức bằng quy hoạch động. Dưới đây là lời giải quy hoạch động cho bài toán xếp ba lô không bị chặn.
Gọi các chi phí là c1, ..., cn và các giá trị tương ứng là v1, ..., vn. Ta cần cực đại hóa tổng chi phí với điều kiện tổng chi phí không vượt quá C. Khi đó, với mỗi i ≤ C, đặt A(i) là giá trị lớn nhất có thể đạt được với tổng chi phí không vượt quá i. Rõ ràng, A(C) là đáp số của bài toán.
Định nghĩa A(i) một cách đệ quy như sau:
A(0) = 0
A(i) = max { vj + A(i − cj) | cj ≤ i }
Ở đây, giá trị lớn nhất của tập rỗng được lấy bằng 0. Tính dần các kết quả từ A(0) tới A(C), ta sẽ được lời giải. Do việc tính mỗi A(i) đòi hỏi xem xét n đồ vật (tất cả các giá trị này đã được tính từ trước), và có C giá trị của các A(i) cần tính, nên thời gian chạy của lời giải quy hoạch động là O(nC).
Điều này không mâu thuẫn với thực tế rằng bài toán xếp ba lô là NP-đầy đủ, do C, không như n, không thuộc mức đa thức theo độ dài của đầu vào cho bài toán. Độ dài đầu vào bài toán tỉ lệ thuật với số bit trong C, chứ không tỉ lệ với chính C.
Một giải pháp quy hoạch động tương tự cho bài toán xếp ba lô 0-1 cũng chạy trong thời gian giả-đa thức. Cũng như trên, gọi các chi phí là c1, ..., cn và các giá trị tương ứng là v1, ..., vn. Ta cần cực đại hóa tổng giá trị với điều kiện tổng chi phí không vượt quá C. Định nghĩa một hàm đệ quy A(i, j) là giá trị lớn nhất có thể đạt được với chi phí không vượt quá j và sử dụng các đồ vật trong khoảng từ x1 tới xi.
A(i,j) được định nghĩa đệ quy như sau:
A(0, j) = 0
A(i, 0) = 0
A(i, j) = A(i - 1, j) if ci > j
A(i, j) = max(A(i - 1, j), vi + A(i - 1, j - ci)) if ci ≤ j
Để có lời giải, ta tính A(n, C). Để làm điều này, ta có thể dùng 1 bảng để lưu các tính toán trước đó. Cách giải này do đó sẽ chạy trong thời gian O(nC) và không gian O(nC), tuy ta có thể giảm độ phức tạp không gian xuống O(C) bằng một số sửa đổi nhỏ.
[sửa] Thuật toán ăn tham
Martello và Toth (1990) đã đưa ra một thuật toán gần đúng kiểu ăn tham (greedy approximation algorithm) để giải bài toán xếp ba lô. Giải thuật này sắp xếp các đồ vật theo thứ tự giảm dần về giá trị, sau đó theo thứ tự đó xếp các đồ vật vào ba lô cho đến khi không cho thêm được đồ vật nào vào nữa.
[sửa] Tham khảo
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Nguyễn Thanh Giang
Dung lượng: 73,00KB|
Lượt tài: 0
Loại file: doc
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)