Bob's Sale (sắp xếp lại các cặp có ràng buộc để giảm thiểu tổng số sản phẩm)


15

Tôi đã hỏi câu hỏi này trên Stack Overflow trước đây: Vấn đề: Việc bán hàng của Bob . Có người đề nghị đăng câu hỏi ở đây là tốt.

Ai đó đã hỏi một câu hỏi liên quan đến vấn đề này ở đây - Trọng lượng tối thiểu của phần tử nhất định - nhưng theo tôi hiểu thì nó không giúp tôi giải quyết vấn đề của mình. Câu trả lời được đánh giá cao nhất trên StackOverflow cũng đáng để xem xét.

Đây là bản sao nguyên văn của câu hỏi StackOverflow của tôi. Có lẽ nó được xây dựng không đầy đủ cho trang web này (quái gì, tôi cảm thấy không được giáo dục đầy đủ chỉ cần hỏi nó ở đây), vì vậy hãy thoải mái chỉnh sửa nó:


Lưu ý: đây là một bản viết lại trừu tượng về một vấn đề thực tế liên quan đến việc sắp xếp các bản ghi trong tệp SWF. Một giải pháp sẽ giúp tôi cải thiện một ứng dụng nguồn mở.

Bob có một cửa hàng, và muốn bán hàng. Cửa hàng của anh ấy mang một số sản phẩm, và anh ấy có một số lượng đơn vị nhất định của mỗi sản phẩm trong kho. Ông cũng có một số nhãn giá gắn trên kệ (nhiều như số lượng sản phẩm), với giá đã được in trên chúng. Anh ta có thể đặt bất kỳ nhãn giá nào trên bất kỳ sản phẩm nào (giá đơn nhất cho một mặt hàng cho toàn bộ kho sản phẩm đó), tuy nhiên một số sản phẩm có một hạn chế bổ sung - bất kỳ sản phẩm nào như vậy có thể không rẻ hơn một sản phẩm khác.

Bạn phải tìm cách sắp xếp các nhãn giá, sao cho tổng chi phí của tất cả các sản phẩm của Bob càng thấp càng tốt. Tổng chi phí là tổng của nhãn giá được chỉ định của mỗi sản phẩm nhân với số lượng sản phẩm đó trong kho.


Được:

  • N - số lượng sản phẩm và nhãn giá
  • S i , 0≤ i <N - số lượng tồn kho của sản phẩm có chỉ số i (số nguyên)
  • P j , 0≤ j <N - giá trên nhãn giá với chỉ số j (số nguyên)
  • K - số lượng các cặp ràng buộc bổ sung
  • A k , B k , 0≤ k <K - chỉ số sản phẩm cho các ràng buộc bổ sung
    • Bất kỳ chỉ số sản phẩm nào cũng có thể xuất hiện nhiều nhất một lần trong B. Do đó, biểu đồ được hình thành bởi danh sách kề này thực sự là một tập hợp các cây được định hướng.

Chương trình phải tìm:

  • M i , 0≤ i <N - ánh xạ từ chỉ mục sản phẩm sang chỉ số nhãn giá (P M i là giá của sản phẩm i )

Để thỏa mãn điều kiện:

  1. P M A k P M B k , với 0≤ k <K
  2. (S i × P M i ) cho 0≤ i <N là tối thiểu

Lưu ý rằng nếu không phải là điều kiện đầu tiên, giải pháp sẽ chỉ đơn giản là sắp xếp nhãn theo giá và sản phẩm theo số lượng và khớp trực tiếp cả hai.

Các giá trị tiêu biểu cho đầu vào sẽ là N, K <10000. Trong bài toán thực tế, chỉ có một số thẻ giá riêng biệt (1,2,3,4).


Đây là một ví dụ về lý do tại sao hầu hết các giải pháp đơn giản (bao gồm sắp xếp theo cấu trúc liên kết) sẽ không hoạt động:

Bạn có 10 mặt hàng với số lượng từ 1 đến 10 và 10 nhãn giá với giá 1 đến 10. Có một điều kiện: mặt hàng có số lượng 10 không được rẻ hơn mặt hàng có số lượng 1.$$

Giải pháp tối ưu là:

Price, $   1  2  3  4  5  6  7  8  9 10
Qty        9  8  7  6  1 10  5  4  3  2

với tổng chi phí là 249. Nếu bạn đặt cặp 1,10 gần cực trị, tổng chi phí sẽ cao hơn.$


Erm, khối được định dạng sẵn cho ví dụ ở phía dưới đã bị trộn lẫn và tôi không chắc cách khắc phục (cú pháp Markdown của StackOverflow và các thẻ <pre> dường như không hoạt động ở đây).
Vladimir Panteleev

Đánh dấu cho khối được định dạng trước không được nhận dạng vì các ký hiệu đô la được coi là dấu phân cách TeX (mặc dù tôi không biết tại sao đánh dấu TeX làm hỏng đánh dấu cho khối được định dạng trước). Bởi vì dường như không có một cách chính xác nào để thoát khỏi các ký hiệu đô la , tôi đã sửa nó theo một cách đặc biệt.
Tsuyoshi Ito

Câu hỏi là gì? Bạn muốn một thuật toán (hiệu quả) để tìm một giải pháp tối ưu? độ cứng? giải pháp gần đúng?
Marcos Villagra

1
@ Tôi, cảm ơn. @Marcos - xin lỗi, tôi đang tìm một thuật toán để giải quyết vấn đề này, hy vọng đủ nhanh để tôi có thể thực hiện nó trong dự án của mình. Có nhiều ý tưởng cho một giải pháp gần đúng, vì vậy một giải pháp chính xác sẽ được ưu tiên.
Vladimir Panteleev

1
Đối với những gì nó có giá trị, tôi nghĩ rằng câu hỏi liên quan ( cstheory.stackexchange.com/q/4904/751 ) xem xét trường hợp giá bao gồm k k và 0 số không.
mhum

Câu trả lời:


6

Tôi cũng đã đăng câu hỏi này lên câu hỏi ban đầu của bạn trên Stack Overflow:


Vấn đề là NP-đầy đủ cho trường hợp chung. Điều này có thể được thể hiện thông qua việc giảm 3 phân vùng (đây là phiên bản đóng gói hoàn chỉnh NP mạnh mẽ).

Đặt w 1 , ..., w n là trọng số của các đối tượng của thể hiện 3 phân vùng, gọi b là kích thước thùng và k = n / 3 số lượng thùng được phép điền vào. Do đó, có 3 phân vùng nếu các đối tượng có thể được phân vùng sao cho có chính xác 3 đối tượng trên mỗi thùng.

Để giảm, chúng tôi đặt N = kb và mỗi thùng được biểu thị bằng nhãn giá b có cùng giá (nghĩ về P i tăng mỗi nhãn thứ b ). Đặt t i , 1≤ ik , là giá của các nhãn tương ứng với thùng thứ i . Đối với mỗi w i chúng tôi có một sản phẩm S j lượng w i + 1 (cho phép gọi đây là sản phẩm gốc của w i ) và một w i - 1 sản phẩm số lượng 1 mà bắt buộc phải được rẻ hơn so với S j (gọi đây là những sản phẩm để lại).

Với t i = (2b + 1) i , 1≤ ik , có phân vùng 3 khi và chỉ khi Bob có thể bán với giá 2b Σ 1≤ ik t i :

  • Nếu có một giải pháp cho 3 phân vùng, thì tất cả các sản phẩm b tương ứng với các đối tượng w i , w j , w l được gán cho cùng một thùng có thể được dán nhãn với cùng một mức giá mà không vi phạm các hạn chế. Vì vậy, giải pháp có chi phí 2b Σ 1≤ ik t i (kể từ khi tổng số lượng sản phẩm với giá t i2b ).
  • Hãy xem xét một giải pháp tối ưu của Bob's Sale. Trước tiên, hãy quan sát rằng trong bất kỳ giải pháp nào, có hơn 3 sản phẩm gốc có cùng nhãn giá, đối với mỗi sản phẩm gốc đó là "quá nhiều", có một thẻ giá rẻ hơn dính trên dưới 3 sản phẩm gốc. Điều này tệ hơn bất kỳ giải pháp nào vì có chính xác 3 sản phẩm gốc trên mỗi nhãn giá (nếu có).
    Bây giờ vẫn có thể có một giải pháp Bán hàng của Bob với 3 nhãn gốc cho mỗi giá, nhưng các sản phẩm còn lại của họ không mang cùng nhãn giá (loại thùng chảy qua). Giả sử nhãn giá đắt nhất gắn thẻ một sản phẩm gốc của w i có sản phẩm rời được gắn thẻ rẻ hơn. Điều này ngụ ý rằng 3 nhãn gốc w i , w j , w lđược gắn thẻ với giá đắt nhất không thêm vào b . Do đó, tổng chi phí của các sản phẩm được gắn thẻ với giá này ít nhất là 2b + 1 .
    Do đó, một giải pháp như vậy có chi phí t k (2b + 1) + một số chi phí chuyển nhượng khác. Kể từ khi chi phí tối ưu cho một tồn tại 3 phân vùng là 2b Σ 1≤ ik t i , chúng ta phải thấy rằng trường hợp chỉ được coi là tồi tệ hơn. Đây là trường hợp nếu t k > 2b Σ 1≤ ik-1 t i (lưu ý rằng nó k-1 trong tổng bây giờ). Cài đặt t i= (2b + 1) i , 1≤ ik , đây là trường hợp. Điều này cũng giữ nếu không phải là thẻ giá đắt nhất là "xấu", nhưng bất kỳ khác.

Vì vậy, đây là phần phá hoại ;-) Tuy nhiên, nếu số lượng thẻ giá khác nhau là một hằng số, bạn có thể sử dụng lập trình động để giải quyết nó trong thời gian đa thức.


7

Đây là phần tiếp theo về câu trả lời của Gero . Ý tưởng là sửa đổi cấu trúc của anh ta để thể hiện độ cứng NP mạnh.

tTôi= =(2b+1)TôitTôi= =TôiP= =2bΣ1TôiktTôi

wTôi-1PP

Do đó, chỉ có thể đạt được giải thưởng được yêu cầu, nếu tất cả các sản phẩm lá có cùng giải thưởng với sản phẩm gốc của chúng, điều đó có nghĩa là tồn tại 3 phân vùng.

kf(k)nÔi(1)nÔi(k)


Cũng được đăng chéo cho câu hỏi chồng chéo ban đầu.


Tôi không thể chấp nhận hai câu trả lời, vì vậy tôi sẽ phải cảm ơn bạn vì sự sáng suốt :)
Vladimir Panteleev

0

Điều này nghe có vẻ như một câu hỏi lý thuyết chơi game. Trong trường hợp đó, một giải pháp vũ phu rất đơn giản là:

Chúng ta hãy giả sử các ràng buộc đại diện cho một số bất biến của mẫu

S-> AkSBk | AkBkS | SAkBk

Giải pháp là tiếp tục thêm các ràng buộc trước, sau đó đến các phần tử. Ví dụ: Giả sử n = 10 và có 2 ràng buộc là A1B1 và ​​A2B2. Sau đó, có ba con đến nút gốc (cấp 2). Mỗi trong số 3 nút này sẽ có 7 trẻ cấp 3, mỗi 21 có 6 ở cấp 4, v.v., về cơ bản, bạn đang chạy qua tất cả các kết hợp có thể.

                A1B1 --- Cấp 1 
               / | \
              / | \
             / | \
            / | \
    A1A2B2A1 A1B1A2B2 A2B2A1B1 --- Cấp 2

và trồng cây. Mặc dù ban đầu nó trông giống như một giải pháp khủng khiếp, tôi cảm thấy bạn có thể từ bỏ việc đuổi theo những chiếc lá rất đắt tiền bằng cách sử dụng một số phương pháp phỏng đoán và cắt tỉa ...

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.