Công thức chính xác của vấn đề tối ưu hóa túi mua sắm này là gì và làm cách nào để giải quyết vấn đề này một cách hiệu quả?


8

Tôi đang tìm kiếm một giải pháp cho vấn đề sau, nhưng tôi gặp khó khăn khi xây dựng nó một cách hợp lý, và sau đó tìm một thuật toán thích hợp để giải quyết nó.

Xem xét danh sách các mặt hàng được đặt trong túi mua sắm: 1, 2, 3, 4 ...

Mỗi mục có thể là một phần của một hoặc nhiều chương trình khuyến mãi: A, B, C, D

Chúng tôi muốn áp dụng bộ khuyến mãi sao cho tối đa hóa giá trị giảm giá, không có mặt hàng nào được phép tham gia nhiều hơn một khuyến mãi, nhưng mỗi khuyến mãi có thể được áp dụng nhiều lần.

Khuyến mãi có thể được định nghĩa theo một số cách, nhưng hiện tại tôi chỉ đang xem xét một loại 'Mua 2 mặt hàng đủ điều kiện, lưu X', tôi hy vọng tôi sẽ có thể khái quát từ đây.

Ví dụ của tôi sẽ là:

  • Khuyến mãi A - Mua 2 Tiết kiệm 8
  • Khuyến mãi B - Mua 2 Tiết kiệm 10
  • Khuyến mãi C - Mua 2 Lưu 6

  • Mục 1 - Đủ điều kiện cho A, B

  • Mục 2 - Đủ điều kiện cho B
  • Mục 3 - Đủ điều kiện cho A, C
  • Mục 4 - Đủ điều kiện cho B, C

Ở đây khá dễ dàng để thấy rằng ứng dụng chính xác của các chương trình khuyến mãi là A đến Mục 1, 3 và B đến 2, 4. Điều này giúp giảm tổng cộng 18 lần.

Trong trường hợp lớn hơn, nó trở nên khó khăn, do đó cần phải giải quyết bằng thuật toán.

Tôi đã thử như sau:

  1. Liệt kê tất cả các kết hợp có thể có của Khuyến mãi mà chúng tôi có thể áp dụng.
  2. Loại bỏ bất kỳ thứ gì rõ ràng là kém (ví dụ: bản sao trực tiếp của chương trình khuyến mãi có giá trị cao hơn).
  3. Áp dụng bất kỳ giá trị nào không trùng lặp với các chương trình khuyến mãi khác (ví dụ: Nếu Mục 1 và 2 chỉ có giá trị cho khuyến mãi A, thì hãy áp dụng khuyến mãi đó).
  4. Lấy bộ còn lại và thử tìm kiếm loại chi nhánh và kết quả trên kết quả.

Tuy nhiên, điều này có thể mất nhiều thời gian (đối với các bộ lớn có mức giảm giá tương tự).

Tôi cảm thấy đây là một loại vấn đề Knapsack hoặc Assign, nhưng tôi không thể viết nó một cách hợp lý. Không thể viết nó một cách hợp lý tôi không thể giải quyết nó.

Đây có phải là một biến thể được công nhận của một vấn đề? Bất kỳ trợ giúp nào để tấn công nó sẽ được đánh giá rất cao, đặc biệt là với mã psuedo để giúp giải quyết nó


2
Dữ liệu có thể được biểu thị dưới dạng biểu đồ lưỡng cực. Nếu mỗi khuyến mãi có thể được áp dụng nhiều nhất một lần, thì đó sẽ là một vấn đề khớp đồ thị lưỡng cực trọng lượng tối đa, điều này được hiểu rất rõ. Vì vậy, những gì bạn muốn, tôi nghĩ, là một hình thức thoải mái của vấn đề đó. Điều này có thể giúp bạn tìm thấy một cái gì đó trong tài liệu.
Bút danh

Vì vậy, nếu bây giờ chúng tôi giả định rằng mỗi quảng cáo chỉ có thể được áp dụng một lần, bạn sẽ tạo biểu đồ như thế nào? Tôi đã thử một vài cách nhưng không thể thấy cách bạn duy trì ràng buộc chỉ cho phép áp dụng Khuyến mãi nếu được coi là hợp lệ.
James Osborn

Bạn có thể hình thành vấn đề này dưới dạng Chương trình Số nguyên 0-1, sau đó sử dụng bộ giải mã nguồn mở hoặc thương mại để giải quyết các phiên bản lớn hơn của nó.
Aron Ahmadia

1
@James Osborn: Hãy xem xét một biểu đồ lưỡng cực, nơi có một cạnh giữa mỗi khuyến mãi và mọi mặt hàng. Nếu nó hợp lệ để áp dụng khuyến mãi đó cho mặt hàng đó, trọng số trên cạnh là "mức tăng". Nếu không, trọng lượng trên cạnh bằng không. Sau đó, bạn tìm thấy một trận đấu có trọng lượng tối đa và loại bỏ bất kỳ cạnh nào có trọng số bằng không. Về cơ bản, bạn để trận đấu diễn ra, nhưng hãy làm rõ thuật toán tối ưu hóa mà bạn không đạt được bất cứ điều gì nhờ nó.
Bút danh

Chỉ cần một bản cập nhật nhanh chóng, cảm ơn sự giúp đỡ cho đến nay. Tôi chưa có nhiều cơ hội để xem xét các giải pháp, nhưng nó đã cho tôi một số nơi tốt để xem xét.
James Osborn

Câu trả lời:


1

Có vẻ như bạn muốn tận dụng cấu trúc của vấn đề mà các mặt hàng chỉ có thể được sử dụng cho một khuyến mãi. Điều đó có nghĩa là nếu bạn đã tìm thấy một giải pháp sử dụng càng nhiều chương trình khuyến mãi càng tốt, cách duy nhất để làm tốt hơn là tìm một giải pháp khác có một hoặc nhiều chương trình khuyến mãi cộng với các mặt hàng chưa được gán và hoán đổi chúng với một bộ khuyến mãi khác và các mặt hàng không sử dụng có giá trị cao hơn.

Ví dụ: bạn có thể bắt đầu ví dụ trước với (1,2) và (3,4), cho 16. Sau đó, bạn có thể kiểm tra xem (1,3) và (2,4) dẫn đến 18 và trao đổi phải là thực hiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.