Продаж Боба (упорядкування пар з обмеженнями, щоб мінімізувати суму продуктів)


15

Я задавав це питання на Stack Overflow деякий час тому: Проблема: продаж Боба . Хтось запропонував розмістити це питання і тут.

Хтось уже задав тут питання, пов’язане з цією проблемою - Мінімальна вага лісу даної кардинальності - але, наскільки я розумію, це не допомагає мені в моїй проблемі. Відповідь на оцінку найвищої оцінки на StackOverflow також варто переглянути.

Ось дослівна копія мого питання StackOverflow. Це, мабуть, недостатньо сформульовано для цього сайту (чорт, я відчуваю себе недостатньо неосвіченим, просто запитуючи його тут), тому сміливо редагуйте його:


Примітка. Це абстрактне переформулювання проблеми з реального життя щодо замовлення записів у файлі SWF. Рішення допоможе мені покращити додаток з відкритим кодом.

У Боб є магазин, і він хоче продати. У його магазині є кілька товарів, і він має певну цілу кількість одиниць кожного товару на складі. Він також має ряд цінових етикеток, встановлених на полицях (стільки ж, скільки товарів), причому ціни на них уже надруковані. Він може розмістити будь-яку етикетку на будь-який товар (унітарна ціна на один товар на весь його товарний запас), проте деякі продукти мають додаткове обмеження - будь-який такий товар може бути не дешевшим, ніж певний інший товар.

Ви повинні знайти, як влаштувати етикетки, щоб загальна вартість всіх виробів Боба була якомога нижчою. Загальна вартість - це сума присвоєної цінності кожного продукту, помножена на кількість товару на складі.


Подано:

  • N - кількість товарів і етикетки
  • S i , 0≤ i <N - кількість на складі товару з індексом i (ціле число)
  • P j , 0≤ j <N - ціна на етикетці з індексом j (ціле число)
  • K - кількість пар додаткових обмежень
  • A k , B k , 0≤ k <K - індекси добутку для додаткового обмеження
    • Будь-який товарний індекс може з’являтися не більше одного разу в Б. Таким чином, графік, сформований у цьому списку суміжності, насправді є набором спрямованих дерев.

Програма повинна знайти:

  • M i , 0≤ i <N - відображення від індексу товару до індексу цін етикеток (P M i - ціна продукту i )

Для задоволення умов:

  1. P M A k ≤ P M B k , при 0≤ k <K
  2. Σ (S i × P M i ) при 0≤ i <N мінімальний

Зауважте, що якби не перша умова, рішенням було б просто сортування етикеток за ціною та продуктами за кількістю та співставлення обох безпосередньо.

Типовими значеннями для введення будуть N, K <10000. У проблемі реального життя існує лише кілька чітких цінників (1,2,3,4).


Ось один приклад того, чому більшість простих рішень (включаючи топологічне сортування) не працюватимуть:

$$

Оптимальне рішення:

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

із загальною вартістю 249 Якщо ви розмістите 1,10 пари поруч із будь-якими крайніми, загальна вартість буде вище.$


Erm, попередньо відформатований блок для прикладу внизу заглушився, і я не впевнений, як це виправити (синтаксис Markdown і теги <pre> StackOverflow тут не працюють).
Володимир Пантелеєв

Розмітка для попередньо відформатованого блоку не була розпізнана, оскільки знаки долара розглядалися як розділювач TeX (хоча я не знаю, чому розмітка TeX руйнує розмітку для попередньо відформатованого блоку). Оскільки , здається, не існує "правильного" способу уникнути знаків долара , я виправив це тимчасово.
Цуйосі Іто

яке питання? Ви хочете (ефективний) алгоритм пошуку оптимального рішення? твердість? приблизне рішення?
Маркос Віллагра

1
@Іто, дякую. @Marcos - вибачте, я шукаю алгоритм для вирішення цієї проблеми, сподіваюся, досить швидко, щоб я міг реалізувати його у своєму проекті. Існує багато ідей для приблизного рішення, тому точне рішення було б кращим.
Володимир Пантелеев

1
Для чого це варто, я вважаю, що відповідне питання ( cstheory.stackexchange.com/q/4904/751 ) розглядає випадок, коли ціни складаються з k і N-k нулів.
mhum

Відповіді:


6

Я також опублікував це у своєму первісному запитанні щодо переповнення стека:


Проблема неповна для загального випадку. Це можна продемонструвати за допомогою зменшення 3-х розділів (це все ще сильна версія NP-упаковки).

Нехай w 1 , ..., w n - ваги об'єктів 3-роздільного екземпляра, b - розмір bin, а k = n / 3 - кількість бункерів, які можна заповнити. Отже, існує 3-роздільний розділ, якщо об'єкти можна розділити таким чином, що в кошику є рівно 3 об’єкти.

Для зменшення ми встановлюємо N = kb, і кожен кошик представлений позначками b цін тієї самої ціни (подумайте, як P i збільшує кожну b- ю мітку). Нехай t i , 1ik - ціна міток, що відповідають i- му смітнику. Для кожного w i є один продукт S j кількості w i + 1 (давайте назвемо це кореневим добутком w i ) та інший w i - 1 продукт кількості 1, який повинен бути дешевшим, ніж S j (називайте ці продукти відпустки).

Для t i = (2b + 1) i , 1ik , є 3-х розділ тоді і тільки тоді, коли Боб може продати за 2b Σ 1≤ ik t i :

  • Якщо є рішення для 3-х розділів, то всі b продукти, відповідні об'єктам w i , w j , w l , які присвоєні одному і тому ж біні, можуть бути позначені однаковою ціною без порушення обмежень. Таким чином, рішення коштувало 2b Σ 1≤ ik t i (оскільки загальна кількість продукції з ціною t i становить 2b ).
  • Розглянемо оптимальне рішення продажу Боба. Спочатку зауважте, що в будь-якому розчині більше 3 кореневих продуктів поділяють одну і ту ж цінову марку, для кожного такого кореневого продукту, який є "занадто великим", існує більш дешевий цінник, який прилипає до менш ніж 3 кореневих продуктів. Це гірше, ніж будь-яке рішення, якщо рівно 3 кореневі продукти за ціною (якщо вони існують).
    Тепер все ще може бути розроблено продаж Боба з 3 кореневими позначками за ціну, але продукти, що відпускаються, не мають однакових етикеток цін (начебто сортування переповнюється). Скажіть, що найдорожчі цінні етикетки є кореневим продуктом w i, який має дешевший товар із відміткою. Це означає, що 3 кореневих мітки w i , w j , w lпозначені найдорожчою ціною не складаються з b . Отже, загальна вартість продукції, позначеної ціною, становить щонайменше 2b + 1 .
    Отже, таке рішення коштує t k (2b + 1) + деяка інша вартість призначення. Оскільки оптимальна вартість для існуючого 3-х розділів становить 2b Σ 1≤ ik t i , ми повинні показати, що справедливий випадок, що розглядається, гірший. Це в тому випадку, якщо t k > 2b Σ 1≤ ik-1 t i (зауважимо, що зараз це k-1 у сумі). Встановлення t i= (2b + 1) i , 1≤ ik , це так. Це також справедливо, якщо не найдорожчий цінник - "поганий", але будь-який інший.

Отже, це руйнівна частина ;-) Однак, якщо кількість різних цінників є постійною, ви можете використовувати динамічне програмування, щоб вирішити це в поліноміальний час.


7

Це продовження відповіді Геро . Ідея полягає в тому, щоб модифікувати його конструкцію, щоб виявити високу твердість NP.

тi=(2б+1)iтi=iП=2б1iктi

шi-1ПП

Отже, досягти заявленого призу можна лише в тому випадку, якщо всі листові вироби мають той самий приз, що і їхній кореневий продукт, а це означає, що існує 3-роздільна частина.

кf(к)нО(1)нО(к)


Також перекладено на оригінальне запитання про переповнення стека.


Я не можу прийняти дві відповіді, тому мені просто доведеться подякувати за розуміння :)
Володимир Пантелєєв,

0

Це звучить як питання теорії ігор. У цьому випадку дуже просте рішення жорстокої сили:

Припустимо, обмеження являють собою деякі інваріанти форми

S-> AkSBk | AkBkS | SAkBk

Рішення полягає в тому, щоб продовжувати додавати спочатку обмеження, а потім елементи. Напр .: Скажімо, n = 10 і є 2 обмеження, A1B1 і A2B2. Потім до кореневого вузла є троє дітей (рівень 2). У кожному з цих 3 вузлів буде 7 дітей 3 рівня, кожен з 21 має 6 на рівні 4 тощо. По суті, ви працюєте через усі можливі комбінації.

                A1B1 --- рівень 1 
               / | \
              / | \
             / | \
            / | \
    A1A2B2A1 A1B1A2B2 A2B2A1B1 --- 2 рівень

і виростити дерево. Хоча з самого початку це виглядає як жахливе рішення, я відчуваю, що ви можете відмовитися від погоні за дуже дорогими листям, скориставшись евристикою та обрізкою ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.